gpt4 book ai didi

c++ - openGL子纹理

转载 作者:可可西里 更新时间:2023-11-01 16:56:48 25 4
gpt4 key购买 nike

我有图像数据,我想获取它的子图像用作 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 只占用我的帧缓冲区的一部分。谢谢

最佳答案

编辑:使用 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 );
}

关于c++ - openGL子纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/205522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com