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


说你有这样的事情:

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

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


9742
2018-05-06 22:27


起源



答案:


绑定的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对此有何弃用。


13
2018-05-07 07:33





我认为将绘制1d纹理。据我所知,每个纹理单元一次只能绑定一个纹理。纹理的尺寸数量并没有真正进入它。

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

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

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


0
2018-05-07 04:21



对不起,你错了。 Bahbar提供了正确的答案。 - Thomas
好吧,我今天学到了新东西。当我没有我的OpenGL书时,这将教我回答! - Incredulous Monk


答案:


绑定的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对此有何弃用。


13
2018-05-07 07:33





我认为将绘制1d纹理。据我所知,每个纹理单元一次只能绑定一个纹理。纹理的尺寸数量并没有真正进入它。

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

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

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


0
2018-05-07 04:21



对不起,你错了。 Bahbar提供了正确的答案。 - Thomas
好吧,我今天学到了新东西。当我没有我的OpenGL书时,这将教我回答! - Incredulous Monk


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

从规格:

绑定的新纹理对象   target是,并且仍然是target指定的维度和类型的纹理   直到它被删除。   ....如果   bind成功,不会对绑定纹理对象的状态进行更改, 和   任何先前对目标的绑定都会被破坏

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


0
2018-05-07 06:04



这里的目标一词是指_1D或_2D。在这种情况下涉及2个不同的目标。 - Bahbar
GL_TEXTURE_1D 和 GL_TEXTURE_2D是不同的目标。 - Thomas
好,我知道了 后 阅读巴巴的答案(在编辑之前错过了!)。好点子。始终忘记启用/禁用范例,因为始终使用着色语言... - Luca