2013-06-26 11 views
6

meine Vertex- und Fragment-Shader hier:WebGL: enablevertexattribarray Index außerhalb des zulässigen Bereichs

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

Und hier ist mein 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"); 
} 

Der Fehler von dieser Linie kommt:

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

Wie gehe ich damit um?

+0

Sorry für meine erste Antwort, es ist früh am Morgen;) – Marius

+0

Danke @Marius, das ist hilfreich, ich werde versuchen, es jetzt zu beheben. – MrROY

Antwort

16

Das ist einfach, weil Sie aTextureCoord in Ihrem Vertex-Programm nicht verwenden, so dass der GLSL-Compiler es optimiert, indem es es entfernt. Sie sollten das Ergebnis von gl.GetAttribLocation() auf Fehler überprüfen und nur die Attribute aktivieren, die in Ihrem Programm vorhanden sind. Eine Warnung für den Fall, dass ein Attribut fehlt, würde ausreichen, ich kenne keine Möglichkeit, Shader-Authoring-Fehler von Optimierungen durch den Compiler zu unterscheiden.

+0

Hey, @Marius, Könntest du mir mit [ein anderes Problem] helfen (http://StackOverflow.com/questions/17316171/webgl-drawrarays-attribs-not-setup-correctly)? – MrROY

Verwandte Themen