WebGL - 具有骨骼纹理的硬件蒙皮

时间:2013-06-20 00:28:54

标签: glsl webgl

我正在尝试使用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模型来说是不够的。 / p>

0 个答案:

没有答案