在WebGL中使用纹理的简单程序(我相信OpenGL),做以下事情是有道理的:
gl.activeTexture()
gl.bindTexture()
gl.texParameteri()
和朋友gl.texImage2D()
gl.uniform1i()
这也是学习该技术的各种书籍和教程所采用的方法。
然而 - 在更高级的用法中,纹理可以重复用于不同的着色器,或者希望在加载和渲染之间进行分割,看起来步骤1(指定纹理单元)可能在渲染时间之前是不必要的。
纹理单元是否真的会影响纹理本身的设置?
换句话说 - 以下方法可以吗?
PREP(对于每个纹理,在任何渲染调用之前)
gl.bindTexture()
gl.texParameteri()
和朋友gl.texImage2D()
RENDER(每个刻度线)
gl.activeTexture()
gl.bindTexture()
gl.uniform1i()
答案 0 :(得分:2)
活动纹理单元通常对纹理制备过程没有任何影响。您只需确保在整个过程中设置相同的纹理单元。
OpenGL 4.5 Direct State Access API也可以看到这一点,你根本不必将纹理绑定起来进行准备。
请注意,除非您使用具有不同纹理单位的相同着色器,否则您还可以避免在每个帧中均匀设置采样器(gl.uniform1i
)。在今天的OpenGL中,我还建议在着色器中使用layout (binding = x)
,而不是从应用程序代码中设置采样器均匀。
编辑:解释&#34的含义;确保在整个过程中设置相同的纹理单元":
所选纹理单元没有直接影响。但是texParameteri
或texImage2D
等所有命令都在当前纹理单元上运行。你不应该做的是这样的事情:
gl.activeTexture(X)
gl.bindTexture(T1);
gl.texParameteri(...)
gl.activeTexture(Y);
gl.texImage2D(...);
因为gl.texImage2D不再对T1纹理进行操作,因为T1仅绑定到纹理单元X,而不绑定到纹理单元Y.基本上,您可以为设置过程选择任何纹理单元X,但是你不应该更改纹理单元(不重新绑定纹理)。