आंशिक रूप से पारदर्शी बनावट को कैसे प्रस्तुत किया जाए?


13

गुड मॉर्निंग स्टैकओवरफ़्लो, मैं अभी थोड़ी समस्या कर रहा हूं क्योंकि मुझे ओपनजीएल के साथ पारदर्शी रूप से बनावट के हिस्से को प्रस्तुत करने का कोई तरीका नहीं मिल रहा है।

यहां मेरी सेटिंग है: मेरे पास एक क्वाड है, एक दीवार का प्रतिनिधित्व करता है, इस बनावट के साथ कवर किया गया है (अपलोडिंग प्रयोजनों के लिए पीएनजी में परिवर्तित)। जाहिर है, मैं चाहता हूं कि कांच के शीशे को छोड़कर दीवार अपारदर्शी हो। दीवार के पीछे एक और विमान है जो एक परिदृश्य को दिखाने वाला है। मैं खिड़की के पीछे से परिदृश्य देखना चाहता हूं। प्रत्येक बनावट अल्फा चैनल के साथ एक TGA है।

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

मैंने GLBlendFunc () को सक्षम करने के बाद इसे फील करने की कोशिश की, लेकिन यह ट्रिक नहीं लगती है।

क्या मैं एक महत्वपूर्ण कदम भूल रहा हूँ?

धन्यवाद :)


नमस्कार, gdse में आपका स्वागत है। मैंने थोड़ा संपादन किया, हम टैग्स को बहुत अधिक शीर्षक वाले प्रश्नों में रखना पसंद नहीं करते हैं। (विशेषकर जब आप टैग में टैग का उपयोग करते हैं :))। और आपके प्रश्न के लिए। क्या आप निश्चित पाइपलाइन या अपने स्वयं के शेड का उपयोग कर रहे हैं?
नोटाबिन

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

यह बहुत अच्छा होगा यदि आप चित्र को अपने प्रश्न में शामिल कर सकते हैं। ऐसा लगता है कि यह अपने मूल स्थान से गायब हो गया है।
या मैपर

जवाबों:


19

आपके द्वारा बताई गई सभी चीजों के अलावा (अल्फा चैनलों के साथ बनावट, दीवार + खिड़की खींचने से पहले परिदृश्य को चित्रित करना), आपको दो और चीजें करने की भी आवश्यकता है।

सबसे पहले, आपको OpenGL की सम्मिश्रित कार्यक्षमता को सक्षम करने की आवश्यकता है:

glEnable(GL_BLEND);

दूसरा, आपको ओपनजीएल को मिश्रित पिक्सल के रंगों की गणना करने का तरीका बताने की जरूरत है (जिसे ओपनजीएल "टुकड़े" कहता है, संयोग से)। इस मामले में, आप इस तरह से कुछ सरल के साथ ठीक हो जाएंगे:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

एक बार सम्मिश्रण चालू हो जाने के बाद, OpenGL पिक्सेल रंगों को जोड़ देगा, जो आपके द्वारा दिए गए फ़ंक्शन मापदंडों के अनुसार glBlendFunc में देगा। विशेष रूप से, यह "source.color * source.alpha + गंतव्य.color * (1-source.alpha)" करेगा, जहां "स्रोत" वह बनावट है जो आप वर्तमान में दे रहे हैं, और "गंतव्य" पहले से ही रंग है फ्रेमबफ़र (लैंडस्केप)। तो जहाँ भी आपका अल्फा चैनल सफेद है, आपको दीवार का रंग मिल जाएगा, और जहाँ भी अल्फा चैनल काला है, आपको परिदृश्य का रंग मिल जाएगा। यदि अल्फा चैनल ग्रे है, तो आपको दो रंगों के बीच कुछ क्रॉस-फेड मिलेगा।

यदि आपकी खिड़की पूरी तरह से पारदर्शी है, तो ऐसा करने के अन्य तरीके हैं, जहां आप दो बहुभुजों को खींचने का क्रम महत्वपूर्ण नहीं है, लेकिन यह अल्फा थ्रेसहोल्ड जैसे अधिक उन्नत अवधारणाओं में मिलना शुरू हो जाता है। संभवतः आपकी वर्तमान स्थिति के लिए आवश्यक नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.