openGL SubTexturing

Dav*_*idG 8 c++ opengl

我有图像数据,我想得到一个用作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);
Run Code Online (Sandbox Code Playgroud)

如何获得作为纹理加载的图像的子图像.我认为它与使用glTexSubImage2D有关,但我不知道如何使用它来创建我可以加载的新纹理.呼叫:

glTexSubImage2D(GL_TEXTURE_2D, 0, xOffset, yOffset, xWidth, yHeight, GL_RGBA, GL_UNSIGNED_BYTE, m_data);
Run Code Online (Sandbox Code Playgroud)

我什么都看不到,调用glCopyTexSubImage2D只是占用了我的帧缓冲区.谢谢

小智 28

编辑:使用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 );
Run Code Online (Sandbox Code Playgroud)

或者,如果您对指针数学过敏:

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 );
Run Code Online (Sandbox Code Playgroud)

编辑2:为了完整起见,我应该指出,如果你使用的是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 );
}
Run Code Online (Sandbox Code Playgroud)