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

标签 c++ opengl textures glteximage2d

您好,我要在显示器中绘制 35 张图像。我在 7X5 网格中绘制它。图片是从网上下载的。每次下载图像时,我都会尝试绘制全部 35 张图像。但其中一些尚未下载。所以我为他们绘制了一些默认图 block 。问题是每次下载图像时,我也会再次绘制以前绘制的图像。我想减少它。所以我在考虑做一些像 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);

现在我感到困惑的是,对于 glTexSubImage2D 的 35 次调用,我是否也需要生成和绑定(bind)纹理 35 次??或者只做一次就足够了。我不明白绑定(bind)纹理的实际问题与它有什么关系。谢谢。

最佳答案

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

glTexImage2D 类似于 malloc 后跟 memcpyglTexSubImage2D 只是一个 memcpy。这就是为什么您必须先调用 glTexImage2D

关于c++ - 在执行 glTexImage2D 和 glTexSubImage2D 之前是否需要调用 glGenTextures 和 glBindTexture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15287172/

相关文章:

python - 使用 Tensorflow C++ API 执行在 skflow 中训练的模型

c++ - 在排序列表上使用 upper_bound 时,查找次数为 O(N),但比较次数为 O(log(N))

c - 旋转矩阵,使 Up vector 等于另一个 vector

opengl - 是否有任何图形 API 允许高效的每个图元分支?

android - 纹理渲染无效

opengl topdown<->bottomup 纹理?

iphone - 解释 OpenGL ES 背景图像的工作原理

c++ - MFC CFileDialog 在用户上次运行时选择的位置打开

c++ - C++ 中的回调 - 无法理解

c++ - gluLookAt 替代方案不起作用