2012-01-25 14 views
12

sono riuscito a isolare il problema in questo codice:di WebGL ritorna stranamente -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 va bene, è 0. Ma textureLocation è -1, che cosa mi manca?

risposta

37

Stai cercando di ottenere il percorso per un attributo che dichiari ma non usi mai. Il codice di vertex shader è (espansa per chiarezza):

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

Durante la compilazione del vostro shader di "UV" saranno identificati come parametro inutilizzato e spogliare fuori. Anche se lo assegni a uno shader diverso, ma non lo usi mai nello shader di frammenti, potrebbe ancora essere rimosso perché è stato identificato come non contribuire al frammento finale.

+0

Questo punto qui: "Anche se lo assegni a uno shader diverso ma non lo usi mai nello shader dei frammenti, potrebbe ancora essere rimosso" è ciò che mi ha aiutato alla fine. Sapevo che gli attributi non utilizzati sarebbero stati strappati via, ma non sapevo che avrebbe potuto passare tra vertici e frammenti di shader. Grazie! – aclave1