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

Posted

技术标签:

【中文标题】在执行 glTexImage2D 和 glTexSubImage2D 之前是不是需要调用 glGenTextures 和 glBindTexture【英文标题】:Does glGenTextures and glBindTexture needs to be called before doing glTexImage2D and glTexSubImage2D在执行 glTexImage2D 和 glTexSubImage2D 之前是否需要调用 glGenTextures 和 glBindTexture 【发布时间】:2013-03-08 05:13:31 【问题描述】:

您好,我有 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);

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

【问题讨论】:

如果你只有一个纹理,那么你只需要从 glGenTextures() 获取一个纹理名称并调用 glBindTexture()。 所以我需要 35 次 glGenTextures() 调用?因为我用glTexSubImage2D添加了35个纹理子图像。 没有。你有一个纹理。 glTexSubImage 填充一个纹理的一部分。 至于“我不明白绑定纹理与它有什么关系的实际问题。”,I've answered that too often 到 keep answering it over and over again。跨度> 【参考方案1】:

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

glTexImage2D 就像malloc 后跟memcpyglTexSubImage2D 只是一个 memcpy。这就是为什么你必须先打电话给glTexImage2D

【讨论】:

以上是关于在执行 glTexImage2D 和 glTexSubImage2D 之前是不是需要调用 glGenTextures 和 glBindTexture的主要内容,如果未能解决你的问题,请参考以下文章

使用 glTexImage2D 和 glGetTexImage 的一些问题

OpenGL API 之 glTexImage2D

glTexImage2D 返回无效值

glTexImage2D() 函数访问冲突错误

如何在 glTexImage2D 中使用动态大小的纹理数组?

在 glTexImage2D 中我选择与在着色器中采样不同的内部格式时会怎样?