[解決済み] glGetTexImage()で画素アクセス?
質問
OpenGLで問題が発生し
glGetTexImage()
.
以前作成したテクスチャのピクセルを取得したいのですが のようなコードです。
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGBA,
width,
height,
0,
GL_RGB,
GL_UNSIGNED_BYTE,
someRandomPixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
SDL2を使っています。
そのテクスチャを読み込んだ後、このテクスチャのピクセルを取得しようとしました。 をGLuint*のピクセルポインタに格納し、次のように宣言しました。
GLuint* pixels = new GLuint[256*256*4];
この画像のサイズは256x256ピクセルでした。
でピクセルデータを取得しました。
GLuint* Textur::getPixelsOfTextur(GLuint textur, int width, int height, int numChannels)
{
GLuint* pixels=new GLuint[width*height*numChannels];
glBindTexture(GL_TEXTURE_2D, textur);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_INT, pixels);
return pixels;
}
numChannels" は RGBA の場合は 4、RGB の場合は 3 です。
問題は、配列のサイズがピクセル数の4倍で、これより小さいサイズを使用するたびに Visual Studio がエラーを出すため、Pixel p(x,y) を正しく扱う方法が全く分からないということです。
Exception thrown at 0x5ED71FCE (opengl32.dll) in sdl_opengl_Frameworktest.exe: 0xC0000005: Access violation writing location 0x09C33000.
また、それらのデータを2次元配列で取得することは可能でしょうか?
どのように解決するのですか?
配列のサイズ(バイト)は1048576バイト(
256 * 256 * 4 * sizeof(GLuint)
). これは、1つのピクセルの各色チャンネルが、それぞれ別の
GLuint
で4バイトのサイズ(
sizeof(GLuint) == 4
). つまり、1画素あたり4色チャンネルなので、1画素のサイズは16バイトとなり
sizeof(GLuint)
を各色チャンネルに割り当てます。
おそらく、すべての色を
GLubyte
. そうすると、配列のサイズは262144バイトになります(
256 * 256 * 4 * sizeof(GLubyte)
)
GLubyte* pixels = new GLubyte[256*256*4];
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
を使うかどうかは関係なく
GLuint
または
GLubyte
のように、1つの画素の色にアクセスすることができます。
GLuint r, g, b, a; // or GLubyte r, g, b, a;
size_t x, y; // line and column of the pixel
size_t elmes_per_line = 256 * 4; // elements per line = 256 * "RGBA"
size_t row = y * elmes_per_line;
size_t col = x * 4;
r = pixels[row + col];
g = pixels[row + col + 1];
b = pixels[row + col + 2];
a = pixels[row + col + 3];
からグレースケール値を計算する場合、その値は
r
,
g
,
b
の値があれば、このようにドンピシャになります。
GLubyte gray = (GLubyte)((r + g + b) / 3.0);
もう一つの一般的な方式は、以下の通りです。 ルーマ :
GLubyte gray = (GLubyte)(r*0.2126 + g*0.7152 + b*0.0722);
カラーRGBチャンネルをグレースケールで置き換える。
pixels[row + col] = gray;
pixels[row + col + 1] = gray;
pixels[row + col + 2] = gray;
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない