2012-01-25 4 views
12

이 코드의 문제를 분리하는 데 성공했다 :WebGL을의 getAttribLocation는 이상한 -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는, 무사는 0입니다 그러나 textureLocation가 -1, 내가 무엇을 놓치고를?

답변

37

선언했지만 사용하지 않는 속성의 위치를 ​​얻으려고합니다. 귀하의 버텍스 쉐이더 코드 (명확성을 위해 확장)입니다 : 셰이더 "자외선"의 컴파일시

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

는 사용되지 않는 매개 변수로 식별됩니다 밖으로 제거한다. 이 셰이더에서 다양한 셰이더에 할당하지만 프래그먼트 셰이더에서는 사용하지 않더라도 최종 조각에 영향을주지 않는 것으로 확인 되었기 때문에 여전히 제거 될 수 있습니다.

+0

여기에 "이 쉐이더에서 다양하게 지정했는데 프래그먼트 쉐이더에서 사용하지 않아도 여전히 껍질을 벗겨 낼 수 있습니다"라는 말은 결국 나를 도왔습니다. 사용되지 않는 속성은 제거 될 것이라는 것을 알았지 만, 그것이 정점 셰이더와 조각 셰이더 사이를 옮길 수 있다는 것을 알지 못했습니다. 감사! – aclave1

관련 문제