我试图在 webgl 上编写一个片段着色器,它将有 13 个制服,因为我需要在每个像素的基础上进行大量的每像素计算、纹理图集映射、颜色转换等。但所有这些都会随着形状而改变。因此,当我考虑将多个形状批处理到一个绘图调用中时,我必须将每个形状的所有这 13 个制服打包成一个统一数组。但是这个统一数组使我的着色器执行非常慢(在我在单个数组中跨越大约 80-90 个统一之后)。由于这个原因,我想为所有制服使用 1D 纹理,但我已经在我的着色器中使用 2D 纹理图集来处理每个像素的颜色。现在我怎样才能将这个 1D 纹理与现有的 2D 一起使用。我的理解是我们只能做 1 个 gl.activeTexture() 。任何人都可以帮助我。我还有其他方法可以打包制服吗?
问问题
189 次
1 回答
1
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
于 2013-12-31T02:31:27.133 回答