如何在 webgl 的单个纹理中同时使用 1D 和 2D 纹理

how to use 1D and 2D texture both in a single texture in webgl

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


gl.activeTexture 只是设置您当前正在影响的纹理单元。纹理单元是全局状态。例如。

1
2
3
4
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 个采样器。

1
2
uniform sampler2D foo;
uniform sampler2D bar;

您可以像这样告诉每个采样器要引用哪个纹理单元

1
2
gl.uniform1i(locationForFoo, 7);  // tell 'foo' to use texture unit 7
gl.uniform1i(locationForBar, 9);  // tell 'bar' to use texture unit 9