我有以下函数,它从JSON文件中加载一个网格:
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,它就会消失,但是当然,我需要在着色器中设置剥皮标志,所以我需要它。
我的问题似乎和我通过谷歌找到的其他人不一样。我不会从另一个网格中重用我的几何图形。我也在构建一个SkinnedMesh,而不是任何旧的网格。我的设置可以支持1024套制服。我很困惑。任何帮助都将不胜感激。
发布于 2017-04-04 11:01:23
当然,这必须是愚蠢的事情,比如ThreeJS WebGLProgram将我的着色器文件中的MAX_BONES宏设置为1024,我在着色器中使用这个值来初始化这个制服:uniform mat4 boneMatrices[MAX_BONES],而我的系统只支持1024制服最大值。
现在的问题是为什么allocateBones函数THREE.WebGLPrograms会这样做:
function allocateBones( object ) {
if ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {
return 1024;
} else {
// default for when object is not specified
// ( for example when prebuilding shader to be used with multiple objects )
//
// - leave some extra space for other uniforms
// - limit here is ANGLE's 254 max uniform vectors
// (up to 54 should be safe)
var nVertexUniforms = capabilities.maxVertexUniforms;
var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );
var maxBones = nVertexMatrices;
if ( object !== undefined && (object && object.isSkinnedMesh) ) {
maxBones = Math.min( object.skeleton.bones.length, maxBones );
if ( maxBones < object.skeleton.bones.length ) {
console.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' );
}
}
return maxBones;
}
}即。为什么满足capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture要求MAX_BONES自动为1024。但这是另一个问题,在这一点上我并不特别关心。因此,我决定只使用RawShaderMaterial并手动将MAX_BONES宏设置为适当的值。
https://stackoverflow.com/questions/43190434
复制相似问题