GetAttribLocation Webgl странным образом возвращает -1 - PullRequest
13 голосов
/ 25 января 2012

Мне удалось выделить проблему в этом коде:

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 в порядке, это 0. Но textureLocation равно -1, что я пропустил?

1 Ответ

41 голосов
/ 26 января 2012

Вы пытаетесь получить местоположение для атрибута, который вы объявляете, но никогда не используете. Ваш код вершинного шейдера (расширен для ясности):

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

Во время компиляции вашего шейдера «uv» будет идентифицирован как неиспользуемый параметр и будет удален. Даже если вы назначаете его вариации в этом шейдере, но никогда не используете его в фрагментном шейдере, он все равно может быть удален, поскольку он был идентифицирован как не способствующий финальному фрагменту.

...