2013-06-26 37 views
6

這裏:的WebGL:enablevertexattribarray指數走出我的頂點和片段着色器的範圍

<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-Compiler通過刪除它來優化它。你真的應該檢查gl.GetAttribLocation()的結果是否有錯誤,並且只啓用程序中存在的屬性。如果屬性缺失,發出警告就足夠了,我不知道編譯器的優化過程中是否存在着色器編寫錯誤。

+0

嘿,@瑪瑞,你能幫助我[另一個問題](http://stackoverflow.com/questions/17316171/webgl-drawarrays-attribs-not-setup-correctly)? – MrROY

相關問題