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

Glsl WebGL-具有骨骼纹理的硬件蒙皮,glsl,webgl,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, g

我正在尝试使用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中没有texel提取。 例如,如果我有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模型来说是不够的。

什么是“骨骼纹理”?将所有骨骼矩阵存储为“像素”的纹理对象,因此,您可以通过正常纹理访问功能在顶点着色器中访问它们。这适用于texelFetch或使用缓冲区纹理,因为它们用于任意数据,但如何仅在正常2D纹理抓取时利用它却不太明显。纹理比均匀的矩阵数组更好,因为它加载速度更快,并且尺寸限制更小(我在上面写过这些问题)。为什么使用2D纹理而只使用一行呢?等等,不要说WebGL甚至不支持1D纹理,嗯。您确定调用
glTexImage2D
成功了吗(glGetError说了什么?我记得ES(以及Web)对匹配的内部和外部格式的要求更严格,因此您可能希望使用浮点内部格式(
GL\u RGBA32F
)或字节外部格式(
GL\u UNSIGNED\u byte
)。@ChristianRau Yeah WebGL删除了OpenGL任何体面功能的支持(或者ES做过,但从未使用过)。纹理加载良好,WebGL自行报告错误,因此无需手动检查。我想我只需转储硬件蒙皮,WebGL对此太荒谬了。@user2503048我想知道您想要对哪种蜈蚣进行蒙皮,因为62块骨骼对人来说应该足够了。仅转储硬件蒙皮不是个好主意,since这是顶点着色器的教科书使用案例。它并没有删除太多的ES,它与桌面2.0没有什么不同,只是没有2.0之后的所有更新的东西,比如TBOs、UBOs等等。仍然浮动纹理实际上应该得到支持(至少通过扩展)。