कण प्रणाली में स्वतंत्र पारदर्शिता का आदेश दें


9

मैं एक कण प्रणाली लिख रहा हूं और बिना छंटे कणों के बिना उचित अल्फा सम्मिश्रण प्राप्त करने के लिए एक चाल खोजना चाहूंगा क्योंकि:

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

अल्फा परीक्षण जीएलईएस 2.0 पर काफी तेज लगता है और गैर-पारदर्शी लेकिन "नकाबपोश" बनावट के लिए ठीक काम करता है। फिर भी, यह अर्ध-पारदर्शी कणों के लिए पर्याप्त नहीं है।

आप इसे कैसे संभालेंगे?


पूरी तरह से यह आवश्यक है कि उन्हें ठीक से कैसे सुलझाया जाए? क्या आपने वास्तव में वैनिला सम्मिश्रण का उपयोग करते हुए कोई (महत्वपूर्ण) कलाकृतियों को देखा है?
क्रिस

एक कण दूसरे कण के बजाय पृष्ठभूमि के साथ मिश्रण कर सकता है और फिर बिंदु-स्प्राइट का "आयत" सार बहुत ध्यान देने योग्य है। अल्फा परीक्षण यहाँ मदद करता है लेकिन कलाकृतियों अभी भी ध्यान देने योग्य हैं जब अल्फा मूल्य शांत कम होता है लेकिन टुकड़े को छोड़ने के लिए पर्याप्त नहीं है।
Stepan Zastupov

6
क्या आपने कणों को प्रस्तुत करते समय अक्षम गहराई-लेखन (गहराई परीक्षण को छोड़कर) की कोशिश की है? यह गलत क्रम कम स्पष्ट करना चाहिए।
एडम

2
कुछ प्रयोगों के बाद मैंने पाया कि गहराई से लिखना अक्षम करना ज्यादातर मामलों में सबसे अच्छा समाधान है।
Stepan Zastupov

जवाबों:


10

यहाँ मैं क्या करूँगा।

चरण 1: सॉर्ट न करें। बस कर दो। देखें कि क्या यह एक समस्या है। सबसे अधिक संभावना नहीं है।

चरण 2: ऐसे कणों को सीमित करें जिन्हें वास्तव में छंटाई की आवश्यकता नहीं है, जैसे:

  • बस ठोस (संभवतः अल्फा-टू-कवरेज किनारों के साथ)

    • Zbuffer छँटाई का ख्याल रखना।
  • बस योजक बिट्स

    • a + b = b + a, इसलिए ऑर्डर मायने नहीं रखता

चरण 3: यदि अधिक आवश्यक हो, तो कणों के विभाजन को बिट्स में विभाजित करें जो सामने और बाकी हिस्सों में हों, और कई पासों में प्रतिपादन करते हैं (उदाहरण के लिए, जटिल धुएं को ठीक कर सकते हैं)

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

आगे कुछ भी आपके विशिष्ट उपयोग के मामले के बारे में अधिक जानकारी की आवश्यकता होगी। लेकिन मुझे पूरा यकीन है कि आपको वास्तव में ऑर्डर इंडिपेंडेंस की जरूरत नहीं है। बस यादृच्छिक में पर्याप्त कणों का उपयोग करें और यह ठीक हो जाएगा =)


6

बस कणों को प्रस्तुत करते समय गहराई बफर को न लिखें। यह उन्हें सभी को एक दूसरे के साथ प्रदान और मिश्रित करने की अनुमति देगा। आपको अभी भी गहराई से परीक्षण करना चाहिए, ताकि दृश्य में ज्यामिति द्वारा उन्हें ठीक से प्रस्तुत किया जा सके।


5

योगात्मक सम्मिश्रण क्रम का उपयोग करना कोई मायने नहीं रखता है:

glEnable(GL_BLEND)
glDepthMask(GL_FALSE)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
DrawParticles();

// Now turn depth masking on and blending off, so state is unchanged.
glDepthMask(GL_TRUE)
glDisable(GL_BLEND)

यह मानता है कि आपकी स्प्राइट बनावट में पारदर्शी पृष्ठभूमि है।

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