我的代码中包含以下内容,这些内容似乎可以正常使用:
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
,也可以使用glBindTextures
或glBindTextureUnit
。例如,对于
glBindTextureUnit
,请执行以下操作:glBindTextureUnit(0, textureHandle);
第一个参数是要绑定的纹理单元。
顺便说一句,而不是使用
glTextureImage2DEXT
(它来自旧的且已弃用的EXT_direct_state_access扩展名),可能更好坚持核心OpenGL调用。您可以通过以下方式初始化纹理:使用glTextureStorage2D
分配内存并设置格式,然后使用glTextureSubImage2D
上载数据。(这是一篇有关EXT_direct_state_access与较新的核心版本之间的区别的文章。功能,如果您对此感兴趣。)
#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);
评论
$ \ 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