首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ShaderMaterial‘剥皮’属性设置为‘`true`’原因‘太多制服’错误

将ShaderMaterial‘剥皮’属性设置为‘`true`’原因‘太多制服’错误
EN

Stack Overflow用户
提问于 2017-04-03 17:06:30
回答 1查看 663关注 0票数 0

我有以下函数,它从JSON文件中加载一个网格:

代码语言:javascript
复制
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函数执行以下操作:

代码语言:javascript
复制
 static createShaderMaterial(vertex, fragment, uniforms) {
    if (uniforms === undefined) uniforms = {};
    return new THREE.ShaderMaterial({
      uniforms: uniforms,
      vertexShader: vertex,
      fragmentShader: fragment,
    });
  }

现在我不断地犯着这个卑鄙的错误:

代码语言:javascript
复制
THREE.WebGLProgram: shader error:  0 gl.VALIDATE_STATUS false gl.getProgramInfoLog invalid shaders ERROR: too many uniforms 

如果我不做mesh.material.skinning = true,它就会消失,但是当然,我需要在着色器中设置剥皮标志,所以我需要它。

我的问题似乎和我通过谷歌找到的其他人不一样。我不会从另一个网格中重用我的几何图形。我也在构建一个SkinnedMesh,而不是任何旧的网格。我的设置可以支持1024套制服。我很困惑。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-04 11:01:23

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

现在的问题是为什么allocateBones函数THREE.WebGLPrograms会这样做:

代码语言:javascript
复制
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宏设置为适当的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43190434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档