您如何在OpenGL中将纹理用于直接状态访问?

我的代码中包含以下内容,这些内容似乎可以正常使用:

GLuint textureHandle;
glGenTextures(1, &textureHandle);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureHandle);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, imageW, imageH, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


但是,当我将其替换为以下内容时,一切都会变成黑色:

GLuint textureHandle;
glActiveTexture(GL_TEXTURE0);
glCreateTextures(GL_TEXTURE_2D, 1, &textureHandle);
glTextureImage2DEXT(textureHandle, GL_TEXTURE_2D, 0, GL_RGBA8, imageW, imageH, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
glTextureParameteri(textureHandle, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


#1 楼

您仍然必须将所需的纹理绑定到纹理单元才能使用它进行渲染。在当前代码中,您没有指定要渲染的纹理,因此GL驱动程序不知道要使用哪个纹理,并且默认为“无纹理”。

有绑定纹理的几种方法。您可以像在非DSA代码中一样继续使用glActiveTexture + glBindTexture,也可以使用glBindTexturesglBindTextureUnit

例如,对于glBindTextureUnit,请执行以下操作:

glBindTextureUnit(0, textureHandle);


第一个参数是要绑定的纹理单元。

顺便说一句,而不是使用glTextureImage2DEXT(它来自旧的且已弃用的EXT_direct_state_access扩展名),可能更好坚持核心OpenGL调用。您可以通过以下方式初始化纹理:使用glTextureStorage2D分配内存并设置格式,然后使用glTextureSubImage2D上载数据。

(这是一篇有关EXT_direct_state_access与较新的核心版本之间的区别的文章。功能,如果您对此感兴趣。)

评论


$ \ begingroup $
“如果可能,您可能希望将代码转换为使用该代码。”他的代码正在使用该代码。 glCreateTextures特定于ARB_DSA函数。他使用了两者的奇怪混合,可能是因为他在ARB版本中找不到glTextureImage2D(因为ARB希望阻止不可改变的纹理)。
$ \ endgroup $
–尼科尔·波拉斯(Nicol Bolas)
17年1月6日,1:11



$ \ begingroup $
@NicolBolas阿哈,谢谢,我还没听清楚。我再次更新了答案。
$ \ endgroup $
–内森·里德(Nathan Reed)
17年1月6日,下午3:12

#2 楼

我现在将其替换为以下有效的文件:

GLuint textureHandle;
glCreateTextures(GL_TEXTURE_2D, 1, &textureHandle);
glTextureStorage2D(textureHandle, 1, GL_RGBA8, imageW, imageH);
glTextureSubImage2D(textureHandle, 0, 0, 0, imageW, imageH, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
glTextureParameteri(textureHandle, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBindTextureUnit(0, textureHandle);