2012-01-25 9 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

संबंधित मुद्दे