2013-06-26 18 views
6

Qui i miei vertex e fragment shader:WebGL: Indice enablevertexattribarray fuori portata

<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> 

Ed ecco il mio Shader initializer:

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

L'errore deriva da questa linea:

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

Come gestirlo?

+0

Ci scusiamo per la mia prima risposta, è mattino presto;) – Marius

+0

Grazie a @Marius, è utile, proverò a risolverlo ora. – MrROY

risposta

16

Questo è semplicemente perché non si utilizza aTextureCoord nel proprio programma di vertice, quindi il compilatore GLSL lo ottimizza rimuovendolo. Dovresti davvero controllare il risultato di gl.GetAttribLocation() per gli errori e abilitare solo gli attributi che sono presenti nel tuo programma. Emettere un avviso nel caso in cui manchi un attributo sarebbe sufficiente, non conosco alcun modo per distinguere gli errori di authoring dello shader dalle ottimizzazioni del compilatore.

+0

Ehi, @Marius, potresti aiutarmi con [un altro problema] (http://stackoverflow.com/questions/17316171/webgl-drawarrays-attribs-not-setup-correctly)? – MrROY

Problemi correlati