2013-04-10 6 views
10

मैं एक ओपन ES 2.0 टुकड़ा शेडर है कि एक धुरी के साथ कई बंद ढाल आउटपुट बनाने के लिए कोशिश कर रहा हूँ। यह पर्सेंट में परिभाषित बिंदुओं पर एकाधिक रंगों के बीच अंतर करना चाहिए।एकाधिक स्टॉप ग्रेडियेंट खंड शेडर कैसे बनाएं?

मैं if रों टुकड़ा शेडर का उपयोग कर, इस तरह कर यह उपलब्धि हासिल की है:

float y = gl_FragCoord.y; 
float step1 = resolution.y * 0.20; 
float step2 = resolution.y * 0.50; 

if (y < step1) { 
    color = white; 
} else if (y < step2) { 
    float x = smoothstep(step1, step2, y); 
    color = mix(white, red, x); 
} else { 
    float x = smoothstep(step2, resolution.y, y); 
    color = mix(red, green, x); 
} 

वे कहते हैं कि टुकड़ा शेडर में शाखाओं में प्रदर्शन मार सकते हैं। वहाँ कुछ चालाक प्रवंचना कि if रों का उपयोग किए बिना कई मूल्यों के बीच अंतर्वेशन लिए इस्तेमाल किया जा सकता है? क्या यह वास्तव में इसके लायक है (यह बहुत ही व्यक्तिपरक है, मुझे पता है, लेकिन अंगूठे के नियम के रूप में)?

इस GLSL सैंडबॉक्स कड़ी में मेरी समस्या, (हालांकि अभी भी कम) पूर्ण स्रोत को वर्णन करने के लिए: http://glsl.heroku.com/e#8035.0

+0

मैं यह समझ के रूप में, एक GPU पर सभी कोर एक ही समय में एक ही कार्रवाई करने के लिए उम्मीद है। यदि आपके पास शाखाएं हैं, तो जोखिम है कि विभिन्न कोरों को विभिन्न परिचालन करने की आवश्यकता होगी और इसलिए कुछ कोर प्रभावी रूप से अवरुद्ध हो जाते हैं। यह प्रदर्शन को मारता है। शेडर्स में शाखाओं से बचने के लिए वास्तव में यह अच्छा अभ्यास है। –

उत्तर

6

आप शाखाओं आप निम्न कर (Heroku से लिया गया) कर सकते हैं समाप्त करने के लिए चाहते हैं;

color = mix(white, red, smoothstep(step1, step2, y)); 
color = mix(color, blue, smoothstep(step2, step3, y)); 
color = mix(color, green, smoothstep(step3, resolution.y, y)); 

लेकिन मुझे यकीन नहीं है कि यह/elses से अधिक तेज है या नहीं।

+0

इस तरह का उत्तर मैं वास्तव में देख रहा था! यदि मेरे पास प्रदर्शन समस्याएं हैं, तो मैं विधियों के प्रदर्शन को बेंचमार्क कर दूंगा। – murgo

+1

इस कोड का एक कामकाजी उदाहरण: http://glslsandbox.com/e#39992.0 – neave

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