我试图在webgl上写一个片段着色器,它将有13个制服,因为我需要在每个像素的基础上进行大量的每像素计算,纹理图集映射,颜色转换等。但所有这些都会因形状而改变。因此,当我想要将几个形状分配到一个绘图调用时,我必须将每个形状的所有这13个制服打包成一个统一的阵列。但是这个统一的数组使得我的着色器执行速度非常慢(在我在单个阵列中交叉80-90个制服之后)。 因此,我想为所有制服使用1D纹理,但我已经在我的着色器中使用2D纹理图集来显示每个像素的颜色。现在我如何将这个1D纹理与现有的2D一起使用。我的理解是我们只能做1 gl.activeTexture()。 任何人都可以帮助我。我还有其他方式来包装制服吗? webgl不支持统一缓冲区,因此不得不放弃该计划。
答案 0 :(得分:0)
gl.activeTexture
只设置您当前正在影响的纹理单元。纹理单元是全局状态。例如。
gl.activeTexture(gl.TEXTURE7); // or gl.TEXTURE0 + 7
gl.bindTexture(gl.TEXTURE_2D, textureA);
gl.activeTexture(gl.TEXTURE9); // go gl.TEXTURE0 + 9
gl.bindTexture(gl.TEXTURE_2D, textureB);
textureA
现在绑定到纹理单元7,textureB
现在绑定到纹理单元9。
如果您有2个采样器。
uniform sampler2D foo;
uniform sampler2D bar;
您可以告诉每个采样器哪个纹理单元像这样引用
gl.uniform1i(locationForFoo, 7); // tell 'foo' to use texture unit 7
gl.uniform1i(locationForBar, 9); // tell 'bar' to use texture unit 9