質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1900閲覧

opengl バイナリファイルから画像ファイルを抽出してglTexImage2D()関数にピクセルを設定すると例外エラーになる原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/01/02 12:27

提示コードの///コメント部内部のコードですがこの関数で例外エラーが発生してしまう原因が知りたいです。提示コードは自分でバイナリファイル化した画像のピクセル部をdata 変数部に入れてそれを指定しているのですが試しに関数の最後の引数をNULLにしてみたら動きました。これは何が原因なのでしょうか?

イメージ説明

cpp

1 2 //テクスチャ設定 3 unsigned int textureNum = 0; 4 fread(&textureNum, sizeof(unsigned int), 1, file); //テクスチャ数 5 std::vector<FrameWork::Texture> texture; 6 printf("%d\n", textureNum); 7 8 for (int i = 0; i < textureNum; i++) 9 { 10 texture.push_back(FrameWork::Texture{glm::ivec2(0,0),0}); 11 12 unsigned char *data = NULL; 13 glm::ivec2 size; 14 unsigned char channel; 15 char textureName[TEXTURE_FILE_PATH_SIZE] = {'\0'}; 16 fread(textureName, sizeof(char), TEXTURE_FILE_PATH_SIZE, file); //テクスチャ名 17 fread(&channel, sizeof(unsigned char), 1, file); //チャンネル数 18 fread(&size.x, sizeof(int), 1, file); //サイズX 19 printf("%d\n",size.x); 20 fread(&size.y, sizeof(int), 1, file); //サイズY 21 data = (unsigned char*)malloc(static_cast<size_t>(size.x * size.y)); 22 fread(data, sizeof(unsigned char), static_cast<size_t>(size.x * size.y), file); //データ 23 24 glGenTextures(1, &texture.back().ID); //テクスチャIDの生成 25 glBindTexture(GL_TEXTURE_2D, texture.back().ID); // IDバインド 26 27 texture.back().size = size; 28///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 29 //テクスチャ生成 30 if (channel == (unsigned char)4) 31 { 32 printf("あああ\n"); 33 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.x, size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 34 printf("いいい\n"); 35 36 } 37 else if (channel == (unsigned char)3) 38 { 39 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size.x, size.y, 0, GL_RGB, GL_UNSIGNED_BYTE, data); 40 } 41 else if (channel == (unsigned char)2) 42 { 43 glTexImage2D(GL_TEXTURE_2D, 0, GL_RG, size.x, size.y, 0, GL_RG, GL_UNSIGNED_BYTE, data); 44 } 45 else if (channel == (unsigned char)1) 46 { 47 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, size.x, size.y, 0, GL_RED, GL_UNSIGNED_BYTE, data); 48 } 49 else 50 { 51 std::cerr << "未対応の形式のチャンネル数です: " << textureName << " " << "チャンネル数: " << channel << std::endl; 52 assert(0); 53 } 54//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 55 // テクスチャの補間設定 56 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 57 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 58 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 59 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 60 glGenerateMipmap(GL_TEXTURE_2D); 61 glBindTexture(GL_TEXTURE_2D, 0); 62 63 } 64

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2022/01/02 12:54

エラーが出たなら、エラーメッセージを提示しましょう エラーメッセージは、いらぬ翻訳省略しないで、出たそのママをコピペで提示してください
guest

回答2

0

ベストアンサー

パッと見、確保しているメモリが足りていないように思います。

data = (unsigned char*)malloc(static_cast<size_t>(size.x * size.y));

1 pixel * 4 channel のデータであれば x * y * 4 のサイズ分メモリ確保する必要があるのではないでしょうか?

投稿2022/01/02 13:15

cx20

総合スコア4633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/01/03 01:17

なるほど。質問ですがバイナリファイルに画像を含めるとwindows上のプロパティ画面から見るときの画像ファイルよりも大きくなるのですがこれは圧縮を全解凍して入れているからでしょうか?
cx20

2022/01/03 03:23 編集

そうですね。PNGやJPEGは圧縮されており、バイナリファイルには無圧縮で格納していると思われる為、サイズが大きくなっていると思われます。 GPUが扱える形式の圧縮形式としては下記が参考になるかもしれません。 <圧縮テクスチャに関する情報> ■ 圧縮テクスチャとは https://dench.flatlib.jp/opengl/textures ■ プラットフォーム毎の推奨およびサポートされるテクスチャ圧縮フォーマット https://docs.unity3d.com/ja/current/Manual/class-TextureImporterOverride.html
guest

0

cpp

1data = (unsigned char*)malloc(static_cast<size_t>(size.x * size.y)); 2fread(data, sizeof(unsigned char), static_cast<size_t>(size.x * size.y), file); //データ 3.... 4//テクスチャ生成 5if (channel == (unsigned char)4) 6{ 7 printf("あああ\n"); 8 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.x, size.y, 0, 9 GL_RGBA, GL_UNSIGNED_BYTE, data);

4チャネルあるのだから、データのサイズは size.x * size.y では足りないと予想します。
(OpenGLにはまったく詳しくないので当てずっぽうです)

投稿2022/01/02 13:15

int32_t

総合スコア20872

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問