说你有这样的事情:
glBindTexture(GL_TEXTURE_2D, my2dTex);
glBindTexture(GL_TEXTURE_1D, my1dTex);
glBegin...
什么是正确的OpenGL行为?绘制1d纹理,2d或两者?对于每个活动纹理,实际上有多个纹理可以同时绑定到它(即1d,2d,3d立方体贴图等)?
说你有这样的事情:
glBindTexture(GL_TEXTURE_2D, my2dTex);
glBindTexture(GL_TEXTURE_1D, my1dTex);
glBegin...
什么是正确的OpenGL行为?绘制1d纹理,2d或两者?对于每个活动纹理,实际上有多个纹理可以同时绑定到它(即1d,2d,3d立方体贴图等)?
绑定的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对此有何弃用。
我认为将绘制1d纹理。据我所知,每个纹理单元一次只能绑定一个纹理。纹理的尺寸数量并没有真正进入它。
要绑定多个纹理,必须激活多个纹理单元(使用glActiveTexture),如下所示:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, my2dTex);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_1D, my1dTex);
这来自我对OpenGL 2.1的了解,所以如果他们在以后的版本中引入了一些花哨的新纹理扩展,请纠正我!
绑定的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对此有何弃用。
我认为将绘制1d纹理。据我所知,每个纹理单元一次只能绑定一个纹理。纹理的尺寸数量并没有真正进入它。
要绑定多个纹理,必须激活多个纹理单元(使用glActiveTexture),如下所示:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, my2dTex);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_1D, my1dTex);
这来自我对OpenGL 2.1的了解,所以如果他们在以后的版本中引入了一些花哨的新纹理扩展,请纠正我!
应用的纹理是使用BindTexture例程指定的最后一个。
从规格:
绑定的新纹理对象 target是,并且仍然是target指定的维度和类型的纹理 直到它被删除。 ....如果 bind成功,不会对绑定纹理对象的状态进行更改, 和 任何先前对目标的绑定都会被破坏。
实际上,在您的示例中,它将应用1D纹理,因为它“覆盖”活动纹理单元的状态。