2012-07-08 10 views
14

मेरे पास एक प्रतिपादन प्रणाली है जहां मैं एक बहुआयामी रेंडरबफर के साथ एक एफबीओ को आकर्षित करता हूं, फिर नमूना को हल करने के लिए नमूने को हल करने के लिए इसे बनावट के साथ किसी अन्य एफबीओ में फिसलता हूं ताकि पाठ को पढ़ने के लिए बनावट को पढ़ने के लिए बनावट को पढ़ा जा सके। बैकबफर (एफबीओ इंडेक्स 0)।glEnable (GL_FRAMEBUFFER_SRGB) कब कॉल करें?

अब मैं कुछ सही एसआरबीबी आउटपुट प्राप्त करना चाहता हूं ... समस्या यह है कि प्रोग्राम का व्यवहार ओएस एक्स और विंडोज़ पर चलाने के दौरान असंगत है और यह मशीन के आधार पर भी बदलता है: विंडोज़ पर इंटेल एचडी 3000 के साथ यह एसआरबीबी nonlinearity लागू नहीं होगा, लेकिन मेरी दूसरी मशीन पर एक Nvidia GTX 670 के साथ यह करता है। ओएस एक्स में इंटेल एचडी 3000 पर यह भी लागू होगा।

तो शायद इसका मतलब है कि मैं अपने GL_FRAMEBUFFER_SRGB प्रोग्राम में सही बिंदुओं पर राज्य सक्षम नहीं कर रहा हूं। हालांकि मुझे ऐसा कोई ट्यूटोरियल नहीं मिल रहा है जो वास्तव में मुझे बताएगा कि मुझे इसे कब सक्षम करना चाहिए, उन्होंने केवल यह उल्लेख किया है कि यह आसान है और कोई प्रदर्शन लागत नहीं है।

मैं वर्तमान में किसी भी बनावट में लोड नहीं कर रहा हूं इसलिए मुझे अभी तक उनके रंगों को रेखांकित करने की आवश्यकता नहीं है।

प्रोग्राम को मजबूर करने के लिए रैखिक रंग मानों को वापस थूकने के लिए मजबूर करने के लिए, मैंने जो कोशिश की है वह मेरी glDisable(GL_FRAMEBUFFER_SRGB) लाइन पर टिप्पणी कर रहा है, जिसका प्रभावी अर्थ यह है कि यह सेटिंग पूरी पाइपलाइन के लिए सक्षम है, और मैं वास्तव में इसे वापस मजबूर करता हूं हर फ्रेम पर।

मुझे नहीं पता कि यह सही है या नहीं। यह निश्चित रूप से रंगों के लिए एक nonlinearization लागू करता है लेकिन मैं यह नहीं बता सकता कि यह दो बार लागू हो रहा है (जो बुरा होगा)। यह गामा को लागू कर सकता है क्योंकि मैं अपने पहले एफबीओ में प्रस्तुत करता हूं। यह तब हो सकता है जब मैंने दूसरे एफबीओ में पहला एफबीओ फटकारा। क्यों नहीं? ,

मैं आरजीबी के लिए इनपुट रंग सेट (1:

मैं अब तक के रूप में अपने अंतिम फ्रेम का स्क्रीन शॉट लेने के लिए और रंग मैं उन्हें कार्यक्रम में करने के लिए सेट करने के लिए अपरिष्कृत पिक्सेल रंग मूल्यों की तुलना करने के लिए चले गए हैं 2,3) और आउटपुट आरजीबी (13,22,28) है।

ऐसा लगता है कि कम अंत में बहुत सारे रंग संपीड़न की तरह लगता है और मुझे गामा कई बार लागू होने पर सवाल उठता है।

मैं बस अब sRGB समीकरण के माध्यम से चले गए हैं और इस बात की पुष्टि कर सकते हैं कि रूपांतरण के रूप में ही रैखिक 1/255, 2/255 एक बार लागू किया जा रहा है, और 3/255 वास्तव में sRGB 13/255, 22 के लिए नक्शे है/255, और 28/255 समीकरण 1.055*C^(1/2.4)+0.055 का उपयोग कर। यह देखते हुए कि इन कम रंग मूल्यों के लिए विस्तार इतना बड़ा है कि एसआरबीबी रंग परिवर्तन एक से अधिक बार लागू हो रहा है, तो यह वास्तव में स्पष्ट होना चाहिए।

तो, मैंने अभी भी यह निर्धारित नहीं किया है कि सही काम क्या है। glEnable(GL_FRAMEBUFFER_SRGB) केवल अंतिम फ्रेमबफर मूल्यों पर लागू होता है, इस मामले में मैं इसे अपने जीएल इनिट दिनचर्या के दौरान बस सेट कर सकता हूं और इसके बारे में भूल सकता हूं?

उत्तर

17

GL_FRAMEBUFFER_SRGB सक्षम है, सभी an sRGB image format के साथ एक छवि को लिखते हैं मान लेंगे कि इनपुट रंग (रंग लिखे गए हैं) एक रैखिक रंगस्थान में हैं। इसलिए, यह उन्हें एसआरबीबी रंगस्थान में परिवर्तित कर देगा।

जो चित्र है कि sRGB प्रारूप में नहीं हैं प्रभावित नहीं होना चाहिए करने के लिए लिखता है। तो यदि आप एक फ्लोटिंग-पॉइंट छवि पर लिख रहे हैं, तो कुछ भी नहीं होना चाहिए। इस प्रकार, आप इसे चालू करने और इसे इस तरह से छोड़ने में सक्षम होना चाहिए; ओपनजीएल को पता चलेगा कि आप एक एसआरबीबी फ्रेमबफर को कब प्रस्तुत कर रहे हैं।

सामान्य रूप से, आप यथासंभव लंबे समय तक एक रैखिक रंगस्थान में काम करना चाहते हैं।पोस्ट-प्रोसेसिंग के बाद ही आपका अंतिम रेंडर, एसआरबीबी रंगस्थान को शामिल करना चाहिए। तो आपका बहुआयामी फ्रेमबफर शायद रैखिक रहना चाहिए (हालांकि आपको सटीकता को संरक्षित रखने के लिए इसे अपने रंगों के लिए उच्च रिज़ॉल्यूशन देना चाहिए। GL_RGB10_A2, GL_R11F_G11F_B10F, या GL_RGBA16F अंतिम उपाय के रूप में उपयोग करें)।

इस के लिए के रूप में:

के साथ इंटेल HD 3000

Windows पर यह sRGB nonlinearity

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

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

+1

ठीक है, यह बात है। जब मैं प्रारंभ में 'GL_FRAMEBUFFER_SRGB' सक्षम करता हूं और इसे हमेशा के लिए स्पर्श नहीं करता हूं, यहां तक ​​कि विंडोज़ में इंटेल एचडी 3000 पर भी यह सही परिवर्तन करेगा। ऐसा लगता है कि ऐसा लगता है कि इसे एनवीडिया की तुलना में कोड पथ के अधिक सक्षम करने की आवश्यकता है। –

+0

आपने जो कहा वह बहुत समझ में आता है कि बफर के एसआरबीबी प्रारूप को यह निर्धारित करना चाहिए कि एसआरबीबी मूल्य उन्हें लिखे गए हैं या नहीं। मैं यह देखने के लिए जांच करूंगा कि यह सही तरीके से लागू किया गया है, और यह निश्चित रूप से मुझे प्रति चैनल 8 बिट्स से बहुत अधिक लाभ प्राप्त करने की अनुमति देगा। मुझे आशा है कि बहुउद्देशीय संकल्प चरण यह सही ढंग से भी करता है: मुझे पहले गलत गलत नमूना संकल्प के परिणाम सामने आए थे लेकिन मैं उस समय गलत मोड में काम कर रहा था। (इस विषय को देखें http://www.opengl.org/discussion_boards/showthread.php/165081-Multisample-resolve-is-not-gamma-correct-with-FBOs) –

+0

क्या इंटेल ऐप्पल पर अपने प्रोसेसर के लिए ओपनजीएल ड्राइवर बनाए रखता है मशीनों? मैं इस धारणा के तहत था कि ऐप्पल ने सबकुछ खुद लिखा था (जो, मेरे अनुभव में, यह समझाएगा कि उनका एएमडी ड्राइवर इतनी खराब क्यों है।) – Philip

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