我正在尝试使用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>