मैं अपनी 2.5D दुनिया में एक साथ गहराई परीक्षण और बनावट पारदर्शिता का उपयोग कैसे करूं?


11

नोट: मुझे पहले से ही एक उत्तर मिल गया है (जो मैं इस प्रश्न के बाद पोस्ट करूंगा) - मैं बस सोच रहा था कि क्या मैं इसे सही कर रहा था, या अगर कोई बेहतर तरीका है।

मैं OpenGL ES (JOGL) का उपयोग करके एक "2.5D" आइसोमेट्रिक गेम बना रहा हूं। "2.5 डी" से मेरा मतलब है कि दुनिया 3 डी है, लेकिन इसे 2 डी आइसोमेट्रिक टाइलों का उपयोग करके प्रदान किया गया है।

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

हालांकि, मुझे एक समस्या का सामना करना पड़ा। यदि आप उपयोग करते हैं GL_DEPTH_TESTऔर GL_BLENDएक साथ, यह एक प्रभाव पैदा करता है जहां वस्तुओं को पृष्ठभूमि के साथ मिश्रित किया जाता है इससे पहले कि वे जेड ऑर्डर द्वारा "क्रमबद्ध" हों (जिसका अर्थ है कि आपको एक अजीब तरह का ओवरलैप मिलता है जहां पारदर्शिता होनी चाहिए)।

पारदर्शिता ओवरलैप की समस्या

यहाँ कुछ छद्म कोड है जो समस्या का वर्णन करना चाहिए (संयोग से, मैं एंड्रॉइड के लिए libgdx का उपयोग कर रहा हूं)।

create() {
    // ...
    // some other code here
    // ...

    Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
    Gdx.gl.glEnable(GL10.GL_BLEND);
}

render() {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    Gdx.gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

    // ...
    // bind texture and create vertices
    // ...
}

तो सवाल यह है: मैं पारदर्शिता ओवरलैप समस्या को कैसे हल करूं?


2
बस आपको यह बताने के लिए एक टिप्पणी कि मैं अपने 2D इंजन के लिए बिल्कुल वैसे ही गया हूं: पहले खुद ही चालाक और Z- तरह की टाइल बनाने की कोशिश कर रहा था, फिर एहसास हुआ कि कोई कारण नहीं था कि दृश्य सपाट होना चाहिए, इस प्रकार मेरी टाइलें एक Z अल्फा परीक्षण का समन्वय और सक्रियकरण करता है। सुनिश्चित नहीं हैं कि आप सही हैं, लेकिन आप अकेले नहीं हैं :-)
sam hocevar

जवाबों:


7

ठीक है, तो यहां मेरा समाधान है (कृपया टिप्पणी करें कि क्या यह बेहतर किया जा सकता है) ...

पता चलता है कि मुझे वास्तव में अल्फा परीक्षण का उपयोग करना चाहिए (हालांकि, मुझे यह दुर्घटना से पता चला, इसलिए मुझे पूरी तरह से यकीन नहीं है कि यह क्यों काम करता है)।

create() {
    // ...
    // some other code here
    // ...

    Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
    Gdx.gl.glEnable(GL10.GL_ALPHA_TEST);
}

render() {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    Gdx.gl10.glAlphaFunc(GL10.GL_GREATER, 0);

    // ...
    // bind texture and create vertices
    // ...
}

के उपयोग पर ध्यान दें GL_ALPHA_TEST, और glAlphaFunc


इसने मेरी समस्या को भी हल कर दिया। साझा करने के लिए धन्यवाद। आप महान हैं
मैथलोवर

2

अल्फा परीक्षण का उपयोग रेंडरर ड्राइंग पिक्सल को किसी भी बफर में रोकने के लिए किया जाता है, जिसमें z बफर भी शामिल है। अल्फा सम्मिश्रण केवल एक दृश्य वस्तु है - मान अभी भी zbuffer के लिए लिखे गए हैं, जिसके परिणामस्वरूप समस्याएँ हो सकती हैं - अदृश्य पिक्सेल बाद में प्रदान किए गए पिक्सेल से अधिक प्रभावित होते हैं, जिसका अर्थ है कि जब आप नए पिक्सेल खींचते हैं तो वे zestest को विफल कर देंगे। यह वही है जो आप अपनी दी गई छवि में देख सकते हैं, एक सबसे बड़ी असफलता।

Z लेखन बंद करने से भी वही सिरों को प्राप्त होगा लेकिन आपको यह सुनिश्चित करना होगा कि आप हर चीज को वापस आर्डर पर वापस लाएं। यह आपके सममितीय खेल में करने के लिए काफी आसान होना चाहिए।


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