2012-01-14 35 views
8

मैं पहली बार अपने कशेरुक शेडर में एक बूलियन पारित करने की कोशिश कर रहा हूं; मैं अभी तक केवल फ्लोट का उपयोग कर रहा हूं।ओपनजीएल ईएस (2.0) छायांकन भाषा: वर्लेक्स शेडर में बुलियन इनपुट कैसे करें और टुकड़े टुकड़े को पास करें?

प्रश्न में बूलियन आदिम-विशिष्ट है इसलिए इसे वर्दी के रूप में पारित नहीं किया जा सकता है। हालांकि यह किसी दिए गए आदिम के सभी शिखरों के लिए समान मूल्य है।

यह ख्रोनोस के नमूने से लगता है कि 'भिन्न' खंड खंड में डेटा पास करने का एकमात्र तरीका है, लेकिन अविश्वसनीय रूप से 'अलग-अलग बूल my_bool' घोषित करता है; मेरे vertex shader में परिभाषित जब एक पार्सर त्रुटि का कारण बनता है।

attribute bool a_my_bool; 

मैं एक टुकड़ा शेडर को पारित करने की कोशिश में अलग-अलग निर्धारित करें::

varying bool v_my_bool; 
void main() { 
    // ... 
    v_my_bool = a_my_bool; 
} 

किसी कृपया मुझे कैसे बता सकते हैं

मैं के रूप में मेरे शिखर शेडर में बूलियन गुजर रहा हूँ मैं क्या हासिल कर सकता हूं?

उत्तर

12

The OpenGL® ES Shading Language version 1.0.17 (PDF) की §4.3.5 से:

अलग क्वालीफायर डेटा प्रकार के साथ ही इस्तेमाल किया जा सकता तैरने लगते हैं, vec2, vec3, vec4, mat2, mat3, और mat4, या इनमें से सरणियों।

और §4.3.3 से:

विशेषता क्वालीफायर केवल डेटा प्रकार के साथ तैरने लगते हैं, vec2, vec3, vec4, mat2, mat3, और mat4 इस्तेमाल किया जा सकता। विशेषता चर को सरणी या संरचनाओं के रूप में घोषित नहीं किया जा सकता है।

तो तुम कल्पना के अनुसार, एक attribute bool नहीं हो सकता, अकेले एक varying bool

यदि आपको वास्तव में प्रति चरम पर एक बूलियन मान की आवश्यकता है तो आप गलत के लिए 0.0 और सत्य के लिए 1.0 का उपयोग कर सकते हैं। परीक्षण करते समय, x > 0.5 देखें।उदाहरण:

// vertex shader 
attribute float a_my_bool; 
varying float v_my_bool; 
void main() { 
    // ... 
    v_my_bool = a_my_bool; 
} 

// fragment shader 
varying float v_my_bool; 
void main() { 
    if (v_my_bool > 0.5) { 
     // my_bool is true 
     // ... 
    } else { 
     // my_bool is false 
     // ... 
    } 
} 

जब तक प्रत्येक त्रिकोण में सभी कोष्ठक समान मूल्य रखते हैं तो यह काम करना चाहिए। यदि वे सुसंगत नहीं हैं, तो आप अलग-अलग व्यवहार के समान त्रिकोण के लिए अलग-अलग टुकड़ों के साथ समाप्त हो जाएंगे। (यदि आप 0.0 और 1.0 तक चिपकते हैं तो "अजीब" कोने के निकट त्रिकोण की चौथाई बाकी से अलग व्यवहार करेगी।)

3

मैं दृढ़ता से सलाह देता हूं कि आप विशेषता का उपयोग न करें और इसे वर्दी में स्विच करें, भले ही बूलियन किसी दिए गए आदिम से जुड़ा हुआ हो। वर्दी के साथ आप इसे एक बार सेट करते हैं और कई बार उपयोग करते हैं, विशेषता के साथ आप प्रत्येक ड्रॉ में आवश्यक मेमोरी बैंडविड्थ को बढ़ाते हैं। इसमें एकमात्र भावना यह है कि यदि आप अपने प्राइमेटिव्स का चरम बैचिंग करते हैं, लेकिन उस मामले में भी, इस समाधान के वास्तविक लाभों का सावधानी से मूल्यांकन किया जाना चाहिए क्योंकि जोखिम विपरीत प्रभाव प्राप्त करना है।

अलग चर के बारे में, एक आम गलती दोनों वर्टेक्स और टुकड़ा shaders में अलग-अलग घोषित करने और 2.

में से एक यह एक जोड़ने त्रुटि उठाएंगे याद आती है और आप संकलन की जाँच करके यह वैसे भी ध्यान दिया, नहीं करने के लिए है और परिणाम जोड़ने।

एक और पहलू मैं आपके स्थान पर जांचूंगा यह सुनिश्चित करना है कि चर कोड को आपके कोड में असाइन किया गया है और उपयोग किया जाता है क्योंकि कंपाइलर अप्रयुक्त सामग्री (मृत कोड अनुकूलन) स्ट्रिप्स करता है और इसके परिणामस्वरूप एक बहुत ही आम समस्या होती है।