2012-01-25 17 views
12

Bu kodda sorunu yalıtmak başarmış:WebGL en getAttribLocation tuhaf döner -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, iyi mi o 0'dır Ama textureLocation -1, ne eksik?

cevap

37

Bildirdiğiniz bir özelliğin yerini almaya çalışıyorsunuz, ancak asla kullanmıyorsunuz. Kişisel tepe tarayıcı kodu (netlik için genişletilmiş) dahilindedir: Shader "uv" derlenirken

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

kullanılmayan bir parametre olarak tespit edilecek ve dışarı çıkarılabilir. Bu gölgelendiricide bir değişkene atansanız bile, ancak fragman gölgelendiricisinde kullanmazsanız bile, son parçaya katkıda bulunmadığı tespit edildiğinden hala çıkarılabilir.

+0

Buradaki nokta şu şekildedir: "Bu gölgelendiricide bir değişkene atarsanız bile, bunu parça gölgelendiricide kullanmazsanız, yine de çıkarılabilir" sonuçta bana yardımcı oldu. Kullanılmayan özniteliklerin ortadan kaldırılacağını biliyordum, ancak köşe ve parça gölgelendiriciler arasında taşınabileceğini bilmiyordum. Teşekkürler! – aclave1