10

画像データがあり、そのサブ画像を取得して、opengl テクスチャとして使用したいと考えています。

glGenTextures(1, &m_name);
glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldName);
glBindTexture(GL_TEXTURE_2D, m_name);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_data);

テクスチャとしてロードされたその画像のサブ画像を取得するにはどうすればよいですか。glTexSubImage2D の使用と関係があると思いますが、それを使用してロードできる新しいテクスチャを作成する方法がわかりません。呼び出し:

glTexSubImage2D(GL_TEXTURE_2D, 0, xOffset, yOffset, xWidth, yHeight, GL_RGBA, GL_UNSIGNED_BYTE, m_data);

glCopyTexSubImage2D を呼び出すと、フレームバッファの一部になるだけです。ありがとう

4

2 に答える 2

30

編集: glPixelStorei を使用します。これを使用してGL_UNPACK_ROW_LENGTH、画像全体の幅 (ピクセル単位) を設定します。次に glTexImage2D (または何でも) を呼び出し、サブイメージの最初のピクセルへのポインターとサブイメージの幅と高さを渡します。

GL_UNPACK_ROW_LENGTH使い終わったら忘れずに0に戻してください。

すなわち:

glPixelStorei( GL_UNPACK_ROW_LENGTH, img_width );
char *subimg = (char*)m_data + (sub_x + sub_y*img_width)*4;
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, sub_width, sub_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, subimg );
glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );

または、ポインター演算にアレルギーがある場合:

glPixelStorei( GL_UNPACK_ROW_LENGTH, img_width );
glPixelStorei( GL_UNPACK_SKIP_PIXELS, sub_x );
glPixelStorei( GL_UNPACK_SKIP_ROWS, sub_y );

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, sub_width, sub_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_data );

glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0 );
glPixelStorei( GL_UNPACK_SKIP_ROWS, 0 );

Edit2:完全を期すために、OpenGL-ES を使用している場合はGL_UNPACK_ROW_LENGTH. その場合、(a)サブイメージを自分で新しいバッファに抽出するか、(b)...

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, sub_width, sub_height, 0, GL_RGBA, GL_UNSIGNED_BYTES, NULL );

for( int y = 0; y < sub_height; y++ )
{
    char *row = m_data + ((y + sub_y)*img_width + sub_x) * 4;
    glTexSubImage2D( GL_TEXTURE_2D, 0, 0, y, sub_width, 1, GL_RGBA, GL_UNSIGNED_BYTE, row );
}
于 2008-10-15T17:05:57.613 に答える