【问题标题】:What is the correct behavior when both a 1D and a 2D texture are bound in OpenGL?在 OpenGL 中同时绑定 1D 和 2D 纹理时,正确的行为是什么?
【发布时间】:2011-02-16 14:46:27
【问题描述】:

假设你有这样的事情:

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

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

【问题讨论】:

    标签: opengl textures texture-mapping


    【解决方案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 Texture Application)。

    Cube > 3D > 2D > 1D
    

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

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

    编辑添加:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 对不起,你想错了。 Bahbar 提供了正确的答案。
      • 嗯,我今天学到了一些新东西。当我手头没有我的 OpenGL 书时,这将教会我如何回答!
      【解决方案3】:

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

      来自规范:

      绑定到的新纹理对象 target 是,并且仍然是由 target 指定的维度和类型的纹理 直到它被删除。 .... 如果 绑定成功,绑定纹理对象的状态没有改变,和 之前与目标的任何绑定都已损坏

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

      【讨论】:

      • 这里的target指的是_1D或者_2D。本案例涉及 2 个不同的目标。
      • GL_TEXTURE_1DGL_TEXTURE_2D 是不同的目标。
      • 好的,我阅读了 Bahbar 的答案后得到了它(在编辑之前错过了!)。好点子。因为总是使用着色语言,所以总是忘记启用/禁用范例......
      猜你喜欢
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多