2

我正在尝试使用 WebGL 进行硬件蒙皮,但似乎无法让它与包含我所有矩阵的纹理一起使用。我正在喂一个像这样的浮动纹理:

var buffer = new Float32Array(...);
... 
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, buffer.byteLength / 16, 1, 0, gl.RGBA, gl.FLOAT, buffer);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);

除了纹理之外,我还发送每个矩阵和向量相对于纹理总大小的相对大小 - 这用于将骨骼索引映射到纹理坐标,因为 WebGL 中没有纹理提取。例如,如果我有 40 块骨头,那么每个矩阵是 1/40,每个向量是 1/40/4。

以下是相关的顶点着色器部分:

...
uniform sampler2D u_bone_map;
uniform float u_matrix_fraction;
uniform float u_vector_fraction;
...
mat4 boneMatrix(float bone) {
  return mat4(texture2D(u_bone_map, vec2(u_matrix_fraction * bone, 0)),
              texture2D(u_bone_map, vec2(u_matrix_fraction * bone + u_vector_fraction, 0)),
              texture2D(u_bone_map, vec2(u_matrix_fraction * bone + u_vector_fraction * 2.0, 0)),
              texture2D(u_bone_map, vec2(u_matrix_fraction * bone + u_vector_fraction * 3.0, 0)));
}
...

这不起作用,无论我如何尝试更改它,我都会在屏幕上显示垃圾。如果没有像 texelFetch (和实际的统一缓冲区)这样的健全功能,这是否可行?

我使用统一的矩阵数组运行相同的代码,但在我当前的设置下,它不能支持超过 62 个骨骼(因为最大统一向量的限制),这对于某些 3D 模型来说是不够的。

4

0 回答 0