2012-01-25 22 views
12

udało mi się wyizolować problem w ten kod:WebGL za getAttribLocation dziwnie zwraca -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 jest w porządku, to jest 0. Ale textureLocation jest -1 Czego mi brakuje?

Odpowiedz

37

Próbujesz uzyskać lokalizację dla zadeklarowanego atrybutu, ale nigdy go nie używaj. Twój kod vertex shader jest (rozszerzony dla jasności):

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

Podczas zestawiania swojej shader „UV” będą identyfikowane jako niewykorzystane parametru i być usuwane na zewnątrz. Nawet jeśli przypiszesz go do zmiennej tego modułu cieniującego, ale nigdy nie użyjesz go w module cieniującym, może on zostać usunięty, ponieważ został zidentyfikowany jako nie przyczyniający się do końcowego fragmentu.

+0

Ten punkt tutaj: "Nawet jeśli przypisujesz go różnym w tym cieniu, ale nigdy nie używasz go w cieniowanym ciele, to może on zostać usunięty" - to pomogło mi w końcu. Wiedziałem, że nieużywane atrybuty zostaną usunięte, ale nie wiedziałem, że może ono przenosić się pomiędzy wierzchołkami i fragmentami cieniowania. Dzięki! – aclave1

Powiązane problemy