用于准备纹理的纹理单位

时间:2018-03-11 09:49:57

标签: webgl

在WebGL中使用纹理的简单程序(我相信OpenGL),做以下事情是有道理的:

  1. 使用gl.activeTexture()
  2. 激活纹理单元
  3. 将纹理与gl.bindTexture()
  4. 绑定
  5. 设置参数w / gl.texParameteri()和朋友
  6. 上传数据w / gl.texImage2D()
  7. 将正确的单位分配给具有gl.uniform1i()
  8. 的采样器
  9. 绘制
  10. 这也是学习该技术的各种书籍和教程所采用的方法。

    然而 - 在更高级的用法中,纹理可以重复用于不同的着色器,或者希望在加载和渲染之间进行分割,看起来步骤1(指定纹理单元)可能在渲染时间之前是不必要的。

    纹理单元是否真的会影响纹理本身的设置?

    换句话说 - 以下方法可以吗?

    PREP(对于每个纹理,在任何渲染调用之前)

    1. 不要激活纹理单元(此处将始终默认为0)
    2. 将纹理与gl.bindTexture()
    3. 绑定
    4. 设置参数w / gl.texParameteri()和朋友
    5. 上传数据w / gl.texImage2D()
    6. RENDER(每个刻度线)

      1. 使用gl.activeTexture()
      2. 激活所需的纹理单元
      3. 将纹理与gl.bindTexture()
      4. 绑定
      5. 将正确的单位分配给具有gl.uniform1i()
      6. 的采样器
      7. 绘制

1 个答案:

答案 0 :(得分:2)

活动纹理单元通常对纹理制备过程没有任何影响。您只需确保在整个过程中设置相同的纹理单元。

OpenGL 4.5 Direct State Access API也可以看到这一点,你根本不必将纹理绑定起来进行准备。

请注意,除非您使用具有不同纹理单位的相同着色器,否则您还可以避免在每个帧中均匀设置采样器(gl.uniform1i)。在今天的OpenGL中,我还建议在着色器中使用layout (binding = x),而不是从应用程序代码中设置采样器均匀。

编辑:解释&#34的含义;确保在整个过程中设置相同的纹理单元":

所选纹理单元没有直接影响。但是texParameteritexImage2D等所有命令都在当前纹理单元上运行。你不应该做的是这样的事情:

gl.activeTexture(X)
gl.bindTexture(T1);
gl.texParameteri(...)

gl.activeTexture(Y);
gl.texImage2D(...);

因为gl.texImage2D不再对T1纹理进行操作,因为T1仅绑定到纹理单元X,而不绑定到纹理单元Y.基本上,您可以为设置过程选择任何纹理单元X,但是你不应该更改纹理单元(不重新绑定纹理)。