2013-06-26 14 views
6

のうちenablevertexattribarray指数私の頂点とフラグメントシェーダ:のWebGL:ここでは範囲

<script id="shader-fs" type="x-shader/x-fragment"> 
     precision mediump float; 

     uniform sampler2D uSampler; 

     varying vec4 vColor; 
     varying vec2 vTextureCoord; 

     void main(void) { 
      gl_FragColor = vColor; 
      // gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t)); 
     } 
    </script> 
    <script id="shader-vs" type="x-shader/x-vertex"> 
     attribute vec3 aVertexPosition; 
     attribute vec4 aVertexColor; 
     attribute vec2 aTextureCoord; 

     uniform mat4 uMVMatrix; 
     uniform mat4 uPMatrix; 

     varying vec4 vColor; 
     varying vec2 vTextureCoord; 

     void main(void) { 
      gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); 
      vColor = aVertexColor; 
      // vTextureCoord = aTextureCoord; 
     } 
    </script> 

そして、ここでは私のシェーダ初期化子です:

function initShaders() { 
    var fragmentShader = getShader(gl, "shader-fs"); 
    var vertexShader = getShader(gl, "shader-vs"); 

    shaderProgram = gl.createProgram(); 

    gl.attachShader(shaderProgram, vertexShader); 
    gl.attachShader(shaderProgram, fragmentShader); 
    gl.linkProgram(shaderProgram); 

    if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { 
     alert("Could not initialise shaders"); 
    } 
    gl.useProgram(shaderProgram); 

    shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); 
    gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute); 

    shaderProgram.vertexColorAttribute = gl.getAttribLocation(shaderProgram, "aVertexColor"); 
    gl.enableVertexAttribArray(shaderProgram.vertexColorAttribute); 

    shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); 
    gl.enableVertexAttribArray(shaderProgram.textureCoordAttribute); 

    shaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, "uPMatrix"); 
    shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); 
    shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); 
} 

エラーがこの行から来ている:

gl.enableVertexAttribArray(shaderProgram.textureCoordAttribute); 
    >> enablevertexattribarray index out of range 

どうすれば対処できますか?

+0

私の最初の答えは申し訳ありませんが、早朝です;) – Marius

+0

ありがとう@マリアス、それは参考になりました、私は今それを修正しようとします。 – MrROY

答えて

16

あなたの頂点プログラムではaTextureCoordを使用していないだけなので、GLSLコンパイラはそれを削除して最適化します。 gl.GetAttribLocation()の結果をエラーでチェックし、プログラム内に存在する属性のみを有効にする必要があります。属性が不足している場合に警告を出すだけで十分ですが、シェーダのオーサリングエラーとコンパイラの最適化を区別する方法はわかりません。

+0

ねえ、マリアス、[別の問題](http://stackoverflow.com/questions/17316171/webgl-drawarrays-attribs-not-setup-correctly)で私を助けることができますか? – MrROY

関連する問題