12

假设你有这样的事情:

glBindTexture(GL_TEXTURE_2D, my2dTex);
glBindTexture(GL_TEXTURE_1D, my1dTex);
glBegin...

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

4

3 回答 3

14

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

glBindTexture(GL_TEXTURE_2D, my2dTex)
glBindTexture(GL_TEXTURE_1D, my1dTex)

GL 会记住这两个设置。

现在,使用哪个 GL 的答案取决于您是否打开了着色器。

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

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

glEnable(GL_TEXTURE_2D)
glEnable(GL_TEXTURE_1D)

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

Cube > 3D > 2D > 1D

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

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

编辑添加:

对于那些真正想要了解细节的人来说,你总是为每个目标*每个单元都有一个纹理绑定。名称 0(绑定状态的默认值)对应于一系列纹理对象,每个目标一个。glBindTexture(GL_TEXTURE_2D, 0)并且glBindTexture(GL_TEXTURE_1D, 0)都绑定了一个纹理,但不是同一个......

这是历史性的,指定为匹配 GL 1.0 的行为,其中纹理对象尚不存在。不过,我不确定 GL3.0 中的弃用对此做了什么。

于 2010-05-07T07:33:44.350 回答
0

我认为将绘制一维纹理。据我所知,每个纹理单元一次只能绑定一个纹理。纹理的维数并没有真正涉及。

要拥有多个纹理绑定,您必须激活多个纹理单元(使用 glActiveTexture),如下所示:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, my2dTex);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_1D, my1dTex);

这来自我对 OpenGL 2.1 的了解,所以如果他们在以后的版本中引入了一些花哨的新纹理扩展,请纠正我!

于 2010-05-07T04:21:10.927 回答
0

应用的纹理是最后使用 BindTexture 例程指定的。

从规范:

绑定到目标的新纹理对象一直是目标指定的维度和类型的纹理,直到它被删除。.... 如果绑定成功,则绑定纹理对象的状态不会发生任何变化,并且任何先前与目标的绑定都会被破坏

实际上,在您的示例中,它将应用一维纹理,因为它“覆盖”了活动纹理单元的状态。

于 2010-05-07T06:04:38.313 回答