2013-06-26 38 views
6

Đây đỉnh và mảnh của tôi shaders:WebGL: chỉ số enablevertexattribarray ra khỏi phạm vi

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

Và đây là khởi tạo đổ bóng của tôi:

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ỗi xuất phát từ dòng này:

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

Làm cách nào để giải quyết vấn đề này?

+0

Xin lỗi vì câu trả lời đầu tiên của tôi, vào sáng sớm;) – Marius

+0

Cảm ơn @Marius, điều đó rất hữu ích, tôi sẽ cố gắng khắc phục ngay bây giờ. – MrROY

Trả lời

16

Thats đơn giản chỉ vì bạn không sử dụng aTextureCoord trong chương trình đỉnh của bạn, do đó trình biên dịch GLSL tối ưu hóa nó bằng cách xóa nó. Bạn thực sự nên kiểm tra kết quả của gl.GetAttribLocation() cho các lỗi, và chỉ cho phép các thuộc tính có mặt trong chương trình của bạn. Việc đưa ra cảnh báo trong trường hợp một thuộc tính bị thiếu sẽ là đủ, tôi không biết cách nào để phân biệt các lỗi do tác giả tạo ra từ các trình tối ưu hóa của trình biên dịch.

+0

Hey, @Marius, Bạn có thể giúp tôi với [một vấn đề khác] (http://stackoverflow.com/questions/17316171/webgl-drawarrays-attribs-not-setup-correctly) không? – MrROY

Các vấn đề liên quan