在OpenGL中绑定1D和2D纹理时,正确的行为是什么?

Chr*_*ris 11 opengl textures texture-mapping

说你有这样的事情:

glBindTexture(GL_TEXTURE_2D, my2dTex);
glBindTexture(GL_TEXTURE_1D, my1dTex);
glBegin...
Run Code Online (Sandbox Code Playgroud)

什么是正确的OpenGL行为?绘制1d纹理,2d或两者?对于每个活动纹理,实际上有多个纹理可以同时绑定到它(即1d,2d,3d立方体贴图等)?

Bah*_*bar 13

绑定的GL状态是每个目标一个纹理名称(即1D/2D/3D /立方体).所以在打电话时

glBindTexture(GL_TEXTURE_2D, my2dTex)
glBindTexture(GL_TEXTURE_1D, my1dTex)
Run Code Online (Sandbox Code Playgroud)

GL将记住这两个设置.

现在,一个GL将使用的答案取决于你是否有一个着色器.

如果着色器已打开,则GL将使用着色器所使用的任何内容.(基于sampler1d/sampler2d ......).

如果没有启用着色器,那么它首先取决于哪个glEnable调用.

glEnable(GL_TEXTURE_2D)
glEnable(GL_TEXTURE_1D)
Run Code Online (Sandbox Code Playgroud)

如果两者都启用,则规范中存在静态优先级规则(GL 1.5规范中的3.8.15纹理应用程序).

Cube > 3D > 2D > 1D
Run Code Online (Sandbox Code Playgroud)

因此,在您的情况下,如果启用了两个纹理目标,则将使用2D纹理目标.

作为旁注,请注意着色器如何不关心纹理目标是否已启用...

编辑添加:

而对于谁真的想要得到的坚韧不拔的细节的人,你总是有一个绑定为每个目标*每个单元的纹理.名称0(绑定状态的默认值)对应于一系列纹理对象,每个目标一个.glBindTexture(GL_TEXTURE_2D, 0)glBindTexture(GL_TEXTURE_1D, 0)绑定纹理,但不是同一个...

这是历史记录,指定与GL 1.0的行为匹配,其中纹理对象尚不存在.不过,我不确定GL3.0对此有何弃用.