0

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

4

1 回答 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 回答