Webgl 带有MeshShaderMaterial抛出的Three.js ImmediaterCallback;“索引超出范围”;警告

Webgl 带有MeshShaderMaterial抛出的Three.js ImmediaterCallback;“索引超出范围”;警告,webgl,three.js,Webgl,Three.js,我有一个Three.js场景,其中包含具有ImmediaterEnterCallback方法的对象。我还创建了一个自定义着色器,并尝试使用MeshShaderMaterial(myShader) 着色器材质在基本Three.js对象上工作时没有警告。 常规材质适用于我的自定义ImmediaterRecallback对象 当我在自定义ImmediaterEnterCallback对象上使用着色器材质时,该材质会引发警告。以下是警告: WebGL: INVALID_VALUE: enable

我有一个Three.js场景,其中包含具有ImmediaterEnterCallback方法的对象。我还创建了一个自定义着色器,并尝试使用MeshShaderMaterial(myShader)

着色器材质在基本Three.js对象上工作时没有警告。 常规材质适用于我的自定义ImmediaterRecallback对象

当我在自定义ImmediaterEnterCallback对象上使用着色器材质时,该材质会引发警告。以下是警告:

    WebGL: INVALID_VALUE: enableVertexAttribArray: index out of range
    WebGL: INVALID_VALUE: vertexAttribPointer: index out of range
现在,尽管有这些警告,一切似乎都运转良好。对象出现时,着色器工作正常,但我不理解为什么会出现这些警告,以及是否可以安全地忽略这些警告

以下是我的ImmediaterRecallback函数:

THREE.Segment.prototype.immediateRenderCallback = function ( program, _gl, _frustum )
{
    if ( ! this.__webglPositionNormalBuffer ) this.__webglPositionNormalBuffer = _gl.createBuffer();
    if ( ! this.__webglStripBuffer ) this.__webglStripBuffer = _gl.createBuffer();

    _gl.bindBuffer( _gl.ARRAY_BUFFER, this.__webglPositionNormalBuffer );
    _gl.bufferData( _gl.ARRAY_BUFFER, this.interleavedData, _gl.STATIC_DRAW );
    _gl.enableVertexAttribArray( program.attributes.position );
    _gl.enableVertexAttribArray( program.attributes.normal );
    _gl.vertexAttribPointer( program.attributes.position, 3, _gl.FLOAT, false, 24, 0 );
    _gl.vertexAttribPointer( program.attributes.normal, 3, _gl.FLOAT, false, 24, 12 );

    _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, this.__webglStripBuffer );
    _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, this.stripData, _gl.STATIC_DRAW );

    for(var i=0; i<this.stripOffsets.length; i+=2)
    {
        var size = this.stripOffsets[i+1];
        var offset = this.stripOffsets[i]*2;
        _gl.drawElements( _gl.TRIANGLE_STRIP, size, _gl.UNSIGNED_SHORT, offset);
    }
}

谢谢

我从这里的一个相关问题中发现了这一点:

我的自定义
immediatendercallback
为属性
position
normal
赋值,这是Three.js中的默认属性。但是,由于我的顶点着色器不使用
normal
属性,因此GLSL编译器优化了
normal
属性声明,导致ImmediaterCallback抱怨,因为它没有
normal
属性来分配数据


因为我在同一几何体上使用了两个不同的着色器(在两个过程中),而另一个(phong)着色器需要法线信息,所以在深度着色器中,我只需将
normal
属性值指定给顶点着色器中的variable,以防止其被优化。

感谢您回答自己的问题。很有帮助
'depthPacked': {
    uniforms: {},

    vertexShader: [
        "void main() {",
            "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
            "gl_Position = projectionMatrix * mvPosition;",
        "}"
    ].join("\n"),

    fragmentShader: [
        "vec4 pack_depth( const in highp float depth ) {",
            "const highp vec4 bit_shift = vec4( 256.0, 256.0*256.0, 256.0*256.0*256.0, 0.0 );",
            "float power = floor(log2(depth));",
            "float mantissa = (power + 127.0) / 256.0;",
            "vec4 res = (depth/exp2(power)) * bit_shift;",
            "res = fract(floor(res) / 256.0);",
            "res.w = mantissa;",
            "return res;",
        "}",
        "void main() {",
            "gl_FragData[0] = pack_depth( gl_FragCoord.z );",
        "}"
    ].join("\n")
}