Tah*_*lil 1 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);
Run Code Online (Sandbox Code Playgroud)
我打电话给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);
Run Code Online (Sandbox Code Playgroud)
现在我感到困惑的是,我是否需要生成和绑定纹理35次以进行35次调用glTexSubImage2D?或者只做一次就足够了.我不明白的实际问题是什么绑定纹理必须做任何事情.谢谢.
纹理中没有"子图像"这样的东西.纹理中只有图像.glTexImage2D为纹理中的特定图像分配存储空间,并可选择将数据上载到该图像.glTexSubImage2D仅将数据上传到图像."sub"表示您可以更新部分图像,而不一定是全部图像.
glTexImage2D就像是malloc紧随其后memcpy.glTexSubImage2D只是一个memcpy.这就是你必须先打电话的原因glTexImage2D.