我有以下的功能,從JSON文件加載網:設置ShaderMaterial`skinning`屬性爲TRUE;使「太多制服」的錯誤
loadJSONModel(filename, modelName) {
let loader = new THREE.JSONLoader();
loader.load(`assets/${filename}`, (geometry, materials) => {
let material = Shader.createShaderMaterial(Shader.LINEAR_BLEND_SKINNING_VERT, Shader.BASIC_FRAG);
let mesh = new THREE.SkinnedMesh(geometry, material);
mesh.material.skinning = true;
mesh.rotation.x = 0.5 * Math.PI;
mesh.rotation.z = 0.7 * Math.PI;
this.scene.add(mesh);
});
其中Shader.createShaderMaterial
函數執行以下操作:
static createShaderMaterial(vertex, fragment, uniforms) {
if (uniforms === undefined) uniforms = {};
return new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader: vertex,
fragmentShader: fragment,
});
}
現在我不斷收到這種卑鄙的錯誤:
THREE.WebGLProgram: shader error: 0 gl.VALIDATE_STATUS false gl.getProgramInfoLog invalid shaders ERROR: too many uniforms
這如果我沒有做mesh.material.skinning = true
就會消失,但是當然,我需要在着色器中設置蒙皮標誌,所以我需要在那裏。
我的問題似乎與我迄今爲止通過Google找到的其他人不一樣。我不會重複使用其他網格中的幾何體。我也構建了一個SkinnedMesh,而不是任何舊的網格。我的設置可以支持1024個制服。我很困惑。任何幫助將非常感激。
這聽起來像一個bug ...如果可以的話,three.js將骨骼浮點紋理用於骨骼。如果它不能,那麼它使用制服。它使用浮點紋理,因爲沒有足夠的制服。在你的情況下,它看起來像有一個錯誤,因爲在你突出顯示的代碼中,它認爲它可以使用浮點紋理,但是它沒有真正使用它們,而是分配太多的制服。 – gman
我最近重新構造了這一點。你介意檢查'dev'分支,看看這是否仍然是一個問題? – mrdoob