2

私はimmediateRenderCallbackメソッドを持つオブジェクトを含むThree.jsシーンを持っています。カスタムシェーダーも作成し、MeshShaderMaterial(myShader)を使用しようとしています。

シェーダーマテリアルは、基本的なThree.jsオブジェクトで警告なしに機能します。通常のマテリアルは、カスタムのimmediateRenderCallbackオブジェクトで正常に機能します。

シェーダーマテリアルは、カスタムのimmediateRenderCallbackオブジェクトで使用すると、警告をスローします。警告は次のとおりです。

    WebGL: INVALID_VALUE: enableVertexAttribArray: index out of range
    WebGL: INVALID_VALUE: vertexAttribPointer: index out of range

現在、これらの警告にもかかわらず、すべてが正常に機能しているようです。オブジェクトが表示され、シェーダーは正しく機能しますが、これらの警告が表示される理由と、それらを安全に無視できるかどうかはわかりません。

これが私のimmediateRenderCallback関数です:

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);
    }
}

これが私のシェーダーです:

'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")
}

ありがとう!

4

1 に答える 1

2

私はここで関連する問題からこれを理解しました:WebGL:glsl属性の問題、getProgramParameterは間違った数の属性を返します

私のカスタムは、Three.js内のデフォルト属性である属性とにimmediateRenderCallback値を割り当てます。ただし、私の頂点シェーダーは属性を利用しないため、GLSLコンパイラーは属性宣言を最適化し、データを割り当てる属性がないため、immediateRenderCallbackが文句を言います。positionnormalnormalnormalnormal

同じジオメトリで2つの異なるシェーダー(2つのパス)を使用していて、もう1つの(フォン)シェーダーには通常の情報が必要なため、深度シェーダーでは、normal属性値を頂点シェーダーの変化に割り当てて、それが起こらないようにしました。最適化されています。

于 2012-09-17T20:41:38.733 に答える