क्या मुझे shader प्रोग्राम बदलते समय वर्दी या विशेषताओं को फिर से बनाने की आवश्यकता है?


11

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

तो, क्या यह (सामान्य रूप से) shader प्रोग्राम्स को स्विच करने के बाद विशेषताओं और वर्दी को फिर से बनाने के लिए आवश्यक है? और क्यों?

यदि हां, तो क्या कार्यक्रम शुरू होने पर एक बार ऐसा करने का कोई तरीका है और उन्हें फिर से स्पर्श नहीं करना है (एक समान मूल्यों को छोड़कर)?

जवाबों:


12

आपको विशेषताओं को पुन: स्थापित करने की आवश्यकता नहीं है, इसलिए जब तक आप यह सुनिश्चित करते हैं कि उनका स्थान दोनों शेड्स में समान रहता है। (आमतौर पर layout(location = X)GLSL में सिंटैक्स का उपयोग किया जाता है, लेकिन glBindAttribLocationपूर्व उपलब्ध नहीं होने पर भी किया जा सकता है ।)

यूनीफॉर्म, हालांकि, Shader Object राज्य का हिस्सा हैं, और इसलिए इसे हर शैडर के लिए कम से कम एक बार सेट करने की आवश्यकता होगी। इसकी लागत को कम करने का एक तरीका यूनिफ़ॉर्म बफ़र ऑब्जेक्ट का उपयोग करना है , जिसमें आपके सभी समान मूल्य होंगे और फिर एक कॉल के साथ एक shader के लिए बाध्य हो सकता है।


आपके UBO लिंक पर: "अंतिम रूप से, उन्हें विभिन्न कार्यक्रमों के बीच जानकारी साझा करने के लिए उपयोग किया जा सकता है। इसलिए एक एकल बफर को संशोधित करना प्रभावी ढंग से कई कार्यक्रमों में वर्दी को अपडेट करने की अनुमति दे सकता है।"
Zouch
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.