2012-01-25 26 views
12

Tôi đã cố gắng cô lập các vấn đề trong mã này:WebGL của kỳ quặc trả về -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 là alright, nó là 0. Nhưng textureLocation là -1, những gì tôi bị mất?

Trả lời

37

Bạn đang cố gắng lấy vị trí cho thuộc tính mà bạn khai báo nhưng không bao giờ sử dụng. đang vertex của bạn (mở rộng cho rõ ràng):

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

Trong lập đổ bóng "uv" của bạn sẽ được xác định là một tham số không sử dụng và được lột ra. Ngay cả khi bạn gán cho nó thay đổi trong bóng đổ này nhưng không bao giờ sử dụng nó trong trình đổ bóng phân đoạn, nó vẫn có thể bị loại bỏ vì nó được xác định là không đóng góp cho đoạn cuối cùng.

+0

Điểm này ở đây: "Ngay cả khi bạn gán cho nó thay đổi trong trình đổ bóng này nhưng không bao giờ sử dụng nó trong trình đổ bóng đoạn, nó vẫn có thể bị loại bỏ" là điều giúp tôi cuối cùng. Tôi biết rằng các thuộc tính không được sử dụng sẽ bị tước đi, nhưng tôi không biết rằng nó có thể tiếp tục giữa các đỉnh và các phần đổ bóng. Cảm ơn! – aclave1

Các vấn đề liên quan