在执行glTexImage2D和glTexSubImage2D之前,是否需要调用glGenTextures和glBindTexture

时间:2013-03-08 05:13:31

标签: c++ opengl textures glteximage2d

嗨我有35张图像要在显示屏上绘制。我在7X5网格中绘制它。图像从互联网下载。每次下载图像时,我都会尝试绘制整个35张图像。但其中一些还没有下载。所以我为他们画了一些默认的瓷砖。问题是每次下载图像我也会再次绘制先前绘制的图像。我想减少它。所以我在想做像Texture Atlas这样的事情。我想手动完成它。我是通过使用glTexImage2D创建一个大图像并使用glTexSubImage2D为其添加子图像来实现的。

glGenTextures(1, tex);
glBindTexture(GL_TEXTURE_2D, (*tex));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, textureImageInfo->format, textureImageInfo->texWidth, textureImageInfo->texHeight, 0, textureImageInfo->format, GL_UNSIGNED_BYTE, NULL);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, textureImageInfo->imageWidth, textureImageInfo->imageHeight, textureImageInfo->format, GL_UNSIGNED_BYTE, textureImageInfo->image);

我致电35 glTexSubImage2D将所有35张图片添加到一个大glTexImage2D。在这里,我只写了一个以便于解释。最后我做了

glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glVertexPointer(3, GL_FLOAT, 0, this->tileCoordList); 
glTexCoordPointer(3, GL_FLOAT, 0, this->tileTextureCoordList);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);

现在我感到困惑的是,我是否需要生成和绑定纹理35次才能调用glTexSubImage2D?或者只做一次就足够了。实际问题我不明白什么是绑定纹理必须对它做任何事情。感谢。

1 个答案:

答案 0 :(得分:8)

纹理中没有“subimage”这样的东西。纹理中只有图像。 glTexImage2D为纹理中的特定图像分配存储空间,并可选择将数据上传到该图像。 glTexSubImage2D仅将数据上传到图片。 “sub”表示您可以更新图像的部分,而不一定全部。

glTexImage2Dmalloc类似,后跟memcpyglTexSubImage2D只是memcpy。这就是你必须先调用glTexImage2D的原因。