2012-05-14 25 views
5

मुझे वेबजीएल में glsl के साथ एक बहुत ही परेशानी समस्या है।वेबजीएल जीएलएसएल शेडर: बनावट 2 डी तक पहुंच अन्य बनावट को ओवरराइड करता है

यह शेडर काम करता है के रूप में उम्मीद:

uniform sampler2D tColor; 
uniform sampler2D tNormal; 
varying vec2 vUv; 

void main() { 
    gl_FragColor = texture2D(tColor, vUv); 
} 

लेकिन यह एक कुल अलग बर्ताव करता है:

uniform sampler2D tColor; 
uniform sampler2D tNormal; 
varying vec2 vUv; 

void main() { 
    vec4 test = texture2D(tNormal, vUv); 
    gl_FragColor = texture2D(tColor, vUv); 
} 

tNormal बनावट पहुँचने से, tColor बनावट ओवरराइड की गई है। यह कैसे संभव है?

+2

संभव नहीं होना चाहिए। क्या आप यह सुनिश्चित करने के लिए अपने क्लाइंट साइड कोड (बनावट, शेडर्स, बाइंडिंग इत्यादि) डाल सकते हैं कि वहां कुछ भी गलत नहीं है? – Tim

+0

आप इसे किस मंच पर देख रहे हैं? क्रोम एंगल/ओपनजीएल, एफएफ, विन, मैक इत्यादि? और क्या आप सुनिश्चित हैं कि आपका रंग बनावट लक्ष्य प्रस्तुत करने के लिए बाध्य नहीं है? – MikaelEmtinger

उत्तर

7

मैंने अतीत में समान व्यवहार देखा है, और यह लगभग हमेशा होता है क्योंकि मैं अपने बनावट को अनुचित तरीके से बाध्य कर रहा हूं। सबसे हाल ही में घटना की वजह से किया गया था जब मैं बहुत तरह मेरे बनावट बाध्य करने का प्रयास किया:

gl.activeTexture(gl.TEXTURE0); 
gl.bindTexture(gl.TEXTURE_2D, colorTexture); 
gl.uniform1i(colorUniform, gl.TEXTURE0); 

gl.activeTexture(gl.TEXTURE1); 
gl.bindTexture(gl.TEXTURE_2D, normalTexture); 
gl.uniform1i(normalUniform, gl.TEXTURE1); 

जब सही सिंटैक्स वास्तव में है:

gl.activeTexture(gl.TEXTURE0); 
gl.bindTexture(gl.TEXTURE_2D, colorTexture); 
gl.uniform1i(colorUniform, 0); // 0 to indicate texture unit 0! 

gl.activeTexture(gl.TEXTURE1); 
gl.bindTexture(gl.TEXTURE_2D, normalTexture); 
gl.uniform1i(normalUniform, 1); // 1 to indicate texture unit 1! 

यह एक बहुत ही आम गलती है, और दुर्भाग्य से WebGL नहीं है वास्तव में पहले कोड स्निपेट (वेबजीएल मेलिंग सूची में हालिया चर्चा का विषय) पर एक त्रुटि फेंक दें और यह सीमित मामलों में काम करने के लिए प्रतीत हो सकता है, इसलिए गलती से यह सोचना आसान है कि यह वैध कोड है।

मुझे नहीं पता कि यह आपकी विशिष्ट समस्या है, लेकिन शायद यह सबसे अच्छी सलाह है जो मैं बिना किसी विवरण के प्रदान कर सकता हूं।

+2

नोट: इस स्थिति को नवीनतम क्रोम और फ़ायरफ़ॉक्स दोनों में एक त्रुटि उत्पन्न करनी चाहिए और अब वेबजीएल अनुरूपता परीक्षण का हिस्सा है – gman

+0

यह समाधान है, धन्यवाद! – Torsten

+0

खुशी है कि यह काम किया! @gman: यह बहुत अच्छा है! मुझे पता है कि इस पर चर्चा की गई थी लेकिन मैंने कभी नहीं सुना कि यह वास्तव में लागू किया गया था। – Toji