Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Three.js 将ShaderMaterial“skinning”属性设置为“true”会导致';制服太多';错误_Three.js_Glsl - Fatal编程技术网

Three.js 将ShaderMaterial“skinning”属性设置为“true”会导致';制服太多';错误

Three.js 将ShaderMaterial“skinning”属性设置为“true”会导致';制服太多';错误,three.js,glsl,Three.js,Glsl,我有一个从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.BASI

我有一个从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
,它就会消失,但当然,我需要在着色器中设置蒙皮标志,所以我需要在那里设置


到目前为止,我的问题似乎与通过谷歌找到的其他问题不一样。我不会重复使用其他网格中的几何体。我也在构建一个皮肤网格,而不是任何旧的网格。我的设置可以支持1024种制服。我很困惑。任何帮助都将不胜感激。

当然,这一定是愚蠢的事情,比如ThreeJS WebGLProgram将我的着色器文件中的
MAX_BONES
宏设置为1024,我在着色器中使用该值初始化此统一:
uniform mat4 boneMatrices[MAX_BONES]
,我的系统最多只支持1024件制服

现在的问题是为什么
thire的
allocateBones
功能会这样做:

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;

        }

    }
函数分配框(对象){
if(capabilities.floatvertextures&&object&&object.skeleton&&object.skeleton.usevertexture){
返回1024;
}否则{
//未指定对象时的默认值
//(例如,将预构建着色器用于多个对象时)
//
//-为其他制服留出额外空间
//-此处限制为角度的254最大均匀向量
//(最多54个应该是安全的)
var invertexuniforms=能力。maxVertexUniforms;
var nVertexMatrices=数学层((nVertexUniforms-20)/4);
var maxBones=nVertexMatrices;
if(object!==未定义&&(object&&object.isSkinnedMesh)){
maxBones=Math.min(object.skeleton.bones.length,maxBones);
if(maxBones

也就是说,为什么满足
capabilities.floatVertextures&&object&&object.skeleton&&object.skeleton.useVertexture
要求
MAX_BONES
自动为1024。但这是另一个问题,我现在并不特别关心这个问题。因此,我决定只使用
RawShaderMaterial
并手动将我的
MAX\u BONES
宏设置为适当的值。

这听起来像个bug。。。如果可以,three.js会对骨骼使用浮点纹理。如果不能,那么它就使用制服。它使用浮点纹理,因为没有足够的制服。在您的例子中,它看起来像是有一个bug,因为在您突出显示的代码中,它认为它可以使用浮点纹理,但实际上它没有使用它们,而是分配了太多的制服。我最近对所有这些进行了一点重构。您是否介意检查
dev
分支,看看这是否仍然是一个问题?它不再是一个问题。(v103)