2012-01-25 10 views
12

he logrado aislar el problema en este código:de WebGL vuelve extrañamente -1

var gl; 
_main_web = function() { 
    gl = document.getElementById("canvas").getContext("experimental-webgl"); 

    gl = WebGLDebugUtils.makeDebugContext(gl, 
    function (err, funcName, args) { 
     throw(WebGLDebugUtils.glEnumToString(err) + " was caused by call to " + funcName); 
    } 
    ); 

    vert_shader = gl.createShader(gl.VERTEX_SHADER); 
    gl.shaderSource(vert_shader,"attribute vec4 vertex;attribute vec2 uv; void main(void) {gl_Position = vertex;}\n"); 
    gl.compileShader(vert_shader); 
    if(!gl.getShaderParameter(vert_shader,gl.COMPILE_STATUS)) { 
     throw 0; 
    } 
    frag_shader = gl.createShader(gl.FRAGMENT_SHADER); 
    gl.shaderSource(frag_shader,"void main(void) { gl_FragColor = vec4(1.0,1.0,1.0,1.0); } \n"); 
    gl.compileShader(frag_shader); 
    if(!gl.getShaderParameter(frag_shader,gl.COMPILE_STATUS)) { 
     throw 1; 
    } 
    program = gl.createProgram(); 
    gl.attachShader(program,vert_shader); 
    gl.attachShader(program,frag_shader); 
    gl.linkProgram(program); 
    if(!gl.getProgramParameter(program,gl.LINK_STATUS)) { 
     throw 2; 
    } 

    vertexLocation = gl.getAttribLocation(program,"vertex"); 
    textureLocation = gl.getAttribLocation(program,"uv"); 
} 

vertexLocation está bien, es 0. Pero textureLocation es -1, lo que me estoy perdiendo?

Respuesta

37

Estás tratando de obtener la ubicación de un atributo que declaras pero nunca usas. Su código de sombreado de vértices está (ampliado para mayor claridad):

attribute vec4 vertex; 
attribute vec2 uv; 
void main(void) { 
    gl_Position = vertex; 
} 

Durante la compilación de su shader "UV" se considera un instrumento sin usar y desnudar a cabo. Incluso si lo asigna a una variación en este sombreador pero nunca lo usa en el sombreador de fragmentos, aún puede ser eliminado porque se ha identificado que no contribuye al fragmento final.

+0

Este punto aquí: "Incluso si se lo asigna a una variación en este sombreador pero nunca lo use en el sombreador de fragmentos, aún puede ser eliminado" es lo que me ayudó al final. Sabía que los atributos no utilizados serían eliminados, pero no sabía que podría trasladarse entre el vértice y los sombreadores de fragmentos. ¡Gracias! – aclave1