2012-04-27 9 views
14

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

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

Left shows RGBA, right shows SRGBA

दूसरा सवाल मैं पूछना चाहूँगा किस बिंदु सुधार वास्तव में हार्डवेयर द्वारा किया जाता है पर है? उदाहरण के लिए मैं एक एफबीओ में फ्रेम लिख रहा हूं, फिर बाद में मैं एक एफबीओ रंग बफर (मैं जल्द ही स्थगित छायांकन में स्विच करने का इरादा रखता हूं) का उपयोग करके बैक बफर में एक स्क्रीन आकार का ट्रैक्टर प्रस्तुत कर रहा हूं। क्या मुझे एफबीओ से जुड़े एसआरबीबी बनावट का उपयोग करना चाहिए, या क्या मुझे बैक बफर लक्ष्य के रूप में केवल एक एसआरबीबी बनावट निर्दिष्ट करने की आवश्यकता है? यदि आप एसआरबीबी का उपयोग कर रहे हैं, तो क्या सभी बनावट संसाधन एसआरबीबी होना चाहिए?

उत्तर

34

नोट: निम्न चर्चा मानती है कि आप समझते हैं कि एसआरबीबी रंगस्थान क्या है, गामा सुधार क्या है, एक रैखिक आरजीबी रंगस्थान क्या है, और आगे। यह मुख्य रूप से प्रौद्योगिकी के ओपनजीएल कार्यान्वयन पर केंद्रित है।

आप इन विषयों के बारे में गहराई से चर्चा चाहते हैं, मैं अपने ट्यूटोरियल पर HDR/Gamma correction (रेखीय colorspaces और गामा को समझने के लिए), और साथ ट्यूटोरियल sRGB images and how they handle gamma correction पर रखने का सुझाव देते हैं।

सबसे पहले, क्या कोई मेरे स्क्रीनशॉट से पुष्टि कर सकता है कि आप यही देखने की उम्मीद करेंगे?

मुझे यकीन नहीं है कि मैं समझता हूं कि आप उस प्रश्न से क्या मतलब रखते हैं। यदि आप उचित गामा सुधार (जो एसआरबीबी कम या ज्यादा करता है) लागू करते हैं, तो आपको आमतौर पर छवि के गहरे क्षेत्रों और "उज्ज्वल" परिणाम में अधिक जानकारी मिल जाएगी।

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

दूसरा प्रश्न मैं पूछना चाहता हूं कि वास्तव में हार्डवेयर द्वारा वास्तव में क्या सुधार किया गया है?

यह "उदाहरण के लिए" भाग से एक बहुत अलग सवाल है जिसे आप कवर के साथ जारी रखते हैं।

sRGB छवियों (याद रखें: एक बनावट चित्र शामिल हैं, लेकिन framebuffers भी छवियां हो सकती हैं): के साथ (उदाहरण के लिए सीधे छवि के लिए उपयोगकर्ता से

  • स्थानांतरित कर रहा है डेटा, निम्नलिखित संदर्भों में इस्तेमाल किया जा सकता glTexSubImage2D और बहुत आगे)। ओपनजीएल मानता है कि आप पहले से ही एसआरबीबी रंगस्थान में डेटा प्रदान कर रहे हैं। इसलिए जब आप इसे अपलोड करते हैं तो डेटा का कोई अनुवाद नहीं होता है।ऐसा इसलिए किया जाता है क्योंकि यह सबसे अधिक समझ में आता है: आम तौर पर, किसी कलाकार से प्राप्त होने वाली कोई भी छवि एसआरबीबी रंगक्षेत्र में होगी जब तक कि कलाकार ने इसे किसी अन्य रंगस्थान में रखने के लिए बड़ी पीड़ा नहीं ली। लगभग हर छवि संपादक सीधे एसआरबीबी में काम करता है।

  • नमूने के माध्यम से शेडर्स में मूल्य पढ़ना (यानी: एक बनावट तक पहुंच)। यह भी काफी सरल है। ओपनजीएल जानता है कि छवि में टेक्स्टल डेटा एसआरबीबी रंगस्थान में है। ओपनजीएल मानता है कि शेडर रैखिक आरजीबी रंग डेटा चाहता है। इसलिए, sRGB image format के साथ बनावट से नमूना देने के सभी प्रयासों के परिणामस्वरूप एसआरबीबी-> एलआरबीबी रूपांतरण होगा। जो मुफ़्त है, बीटीडब्ल्यू।

    और प्लस तरफ, यदि आपके पास जीएल 3.x + सक्षम हार्डवेयर है, तो आप लगभग निश्चित रूप से रैखिक रंगस्थान में फ़िल्टरिंग प्राप्त करेंगे, जहां यह समझ में आता है। एसआरबीबी एक गैर रेखीय रंगस्थान है, इसलिए एसआरबीबी मूल्यों का रैखिक इंटरपोलेशन हमेशा गलत होता है।

  • फ्रेमबफर छवियों में खंड शेडर से मान आउटपुट संग्रहीत करना। यह वह जगह है जहां यह थोड़ा जटिल हो जाता है। भले ही आप जिस फ्रेमबफर छवि को प्रतिपादित कर रहे हैं वह एसआरबीबी रंगस्थान में है, यह रूपांतरण को मजबूर करने के लिए पर्याप्त नहीं है। आपको स्पष्ट रूप से glEnable(GL_FRAMEBUFFER_SRGB) होना चाहिए; यह ओपनजीएल को बताता है कि आप अपने खंड शेडर से लिख रहे मूल्य रैखिक रंगस्थान मान हैं। इसलिए, ओपनजीएल को उन्हें

    पर संग्रहीत करते समय एसआरबीबी में परिवर्तित करने की आवश्यकता है, यदि आपको जीएल 3.x + हार्डवेयर मिल गया है, तो आप लगभग निश्चित रूप से रैखिक रंगस्थान में मिश्रण प्राप्त करेंगे। यही है, ओपनजीएल फ्रेमबफर से एसआरबीबी वैल्यू पढ़ेगा, इसे रैखिक आरजीबी वैल्यू में परिवर्तित करेगा, इसे आने वाले रैखिक आरजीबी वैल्यू (जिसे आपने अपने शेडर से लिखा था) के साथ मिश्रित करें, मिश्रित मान को एसआरबीबी रंगस्थान में परिवर्तित करें और इसे स्टोर करें । फिर, यही वही है जो आप चाहते हैं; एसआरबीबी रंगस्थान में मिश्रण हमेशा खराब होता है।

अब हम समझते हैं कि, हम आपका उदाहरण देखें।

उदाहरण के लिए मैं एक FBO को फ्रेम लिख रहा हूँ, फिर बाद में मैं वापस बफर एक FBO रंग बफर (मैं जल्द ही आस्थगित छायांकन के लिए स्विच करने का इरादा कर रहा हूँ) का उपयोग करने के लिए एक स्क्रीन आकार ट्रैक्टर प्रतिपादन कर रहा हूँ।

समस्या यह है कि आप सही प्रश्न नहीं पूछ रहे हैं। आपको ध्यान में रखने की आवश्यकता है, विशेष रूप से जब आप स्थगित प्रतिपादन में जाते हैं, तो यह प्रश्न है:

क्या यह रैखिक आरजीबी है या नहीं?

सामान्य रूप से, आपको जितना संभव हो सके गामा-सही स्थान में किसी भी मध्यवर्ती डेटा को संग्रहीत करने पर रोक लगनी चाहिए। तो कोई इंटरमीडिएट बफर (यानी: जहां आप अपनी रोशनी जमा करते हैं) एसआरबीबी होना चाहिए।

यह रूपांतरण की लागत के बारे में नहीं है; यह वास्तव में आप क्या कर रहे हैं के बारे में है। यदि आप स्थगित प्रतिपादन कर रहे हैं, तो आप शायद एचडीआर प्रकाश व्यवस्था भी कर रहे हैं और आगे भी। तो आपके प्रकाश संचय बफर को फ़्लोटिंग-पॉइंट होना चाहिए। और फ्लोट बफर हमेशा रैखिक होते हैं; उनके लिए रैखिक नहीं होने का कोई कारण नहीं है।

आपकी अंतिम छवि, डिफ़ॉल्ट फ्रेमबफर, एसआरबीबी होना चाहिए यदि आप मुफ्त गामा सुधार (और आप करते हैं) का लाभ लेना चाहते हैं। यदि आप एचडीआर फ्लोट बफर में अपना पूरा काम करते हैं, और फिर अंतिम प्रदर्शन के लिए परिणाम को टोन-मैप करें, तो आपको इसे एक एसआरबीबी छवि में लिखना चाहिए।

+1

शानदार। धन्यवाद निकोल, और टट्स के लिए। – Robinson

+0

चलिए देखते हैं कि मैं ठीक से समझता हूं या नहीं। मेरा मुख्य फ्रेम बफर एसआरबीबी है क्योंकि मैंने ऐसा करने के लिए जीएलएफडब्ल्यू 3 से पूछा था। मेरे शेडर्स सभी रैखिक में काम करते हैं, और उनका परिणाम रैखिक है (मेरे पास अभी तक बनावट नहीं है इसलिए एसआरबीबी से पढ़ना कोई मुद्दा नहीं है)। मैं एचडीआर का उपयोग नहीं करता, मैं सीधे मुख्य फ्रेम बफर पर प्रस्तुत करता हूं, इसलिए कोई स्वर मैपिंग नहीं। मैं समझता हूं कि सही गामा सुधार लागू करने के लिए 'glEnable (GL_FRAME_BUFFER_SRGB)' को कॉल करने के लिए पर्याप्त है। मुझे घाटे की गणना करने की आवश्यकता नहीं है। सही बात? – Niriel

+0

मेरा मानना ​​है कि यह सही है, हां। यदि आप इंटरमीडिएट बफर का उपयोग करते हैं, तो उन्हें एसआरबीबी नहीं होना चाहिए। – Robinson

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