Voxel रेंडरिंग के लिए, क्या अधिक कुशल है: पूर्व-निर्मित VBO या एक ज्यामिति shader?


26

एक काफी स्थिर स्वर स्वर को देखते हुए, अधिक कुशल क्या है: voxel चेहरों को प्रस्तुत करने के लिए VBO को पूर्व-जेनरेट करने के लिए सीपीयू का उपयोग करना (अब के लिए मार्चिंग क्यूब्स की तरह अधिक उन्नत रूपों की अनदेखी करना) या GPU उत्पन्न करने के लिए GPU पर ज्यामिति shader का उपयोग करना मक्खी पर चेहरे?

मैं बदलते स्वरों को अपडेट करने के बारे में चिंतित नहीं हूं, लेकिन निश्चित रूप से यह GPU-संस्करण का एक लाभ है क्योंकि आपको VBOs का पुनर्निर्माण नहीं करना है। इसके अलावा, जीएस दृष्टिकोण थोड़ा और अधिक आधुनिक लगता है :)

दूसरी ओर, मैंने इस विवरण पर गौर नहीं किया कि जीएस वास्तव में आधुनिक जीपीयू में रेखांकन पाइपलाइन के साथ कैसे काम करता है। क्या यह वर्टिकल को स्ट्रीम-कैश के एक प्रकार में आउटपुट करता है या बीच में सामान्य GPU मेमोरी के लिए वर्टिकल लिखा जाता है? यदि यह बाद की बात है, तो ऑन-द-फ्लाई जनरेटिंग मैं उपलब्ध जीपीयू कार्यों के बाकी हिस्सों से उपलब्ध बैंडविड्थ और प्रसंस्करण शक्ति को कम कर सकता हूं और फिर यह सीपीयू पर करना अधिक फायदेमंद होगा।

जवाबों:


9

मैं एक Minecraft प्रकार के दृश्य के बारे में सोच रहा हूं, जहां voxel द्वारा आप उन ब्लॉकों की एक दुनिया का मतलब है जो वास्तव में बहुभुज का उपयोग करके प्रदान किए जाते हैं:

यदि आप एक ज्यामिति shader का उपयोग करते हैं, तो वास्तव में तीन चेहरे (या जो भी) प्रति स्वर में होने से बचना मुश्किल होगा।

यदि आपके पास बहुत सारे आसन्न ब्लॉक हैं जो एक ही बनावट के हैं तो आप VBO दृष्टिकोण में अपनी (पतित) पट्टी में बहुत कम त्रिकोण होने के लिए बनावट के टाइलिंग का उपयोग कर सकते हैं। मेरा मतलब है, अगर घास के स्वरों का एक अच्छा बड़ा फ्लैट 6x6 क्षेत्र है, तो आप 64 के बजाय सिर्फ 2 त्रिकोण में पूरे शीर्ष को आकर्षित कर सकते हैं।

जीएस दृष्टिकोण के साथ आप निकटवर्ती स्वरों द्वारा घिरे हुए चेहरों के तुच्छ आवरण को नहीं कर सकते हैं जो कि वीबीओ दृष्टिकोण के साथ बहुत सीधा है।

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

मैंने प्रत्येक 6 चेहरों के लिए अलग-अलग वीबीओ का उपयोग किया है - आपको केवल उनमें से अधिकांश 3 पर स्पष्ट रूप से आकर्षित करने की आवश्यकता है। यह अलग-अलग बनावट के साथ अच्छी तरह से फिट बैठता है जो आमतौर पर मिनीक्राफ्ट-शैली के स्वर के शीर्ष-भागों पर उपयोग किया जाता है। क्योंकि प्रत्येक सेट के लिए सामान्य और ऐसा तब समान है।

के साथ एक एटलस में खड़ी टाइल वाले पिक्सैप्स का उपयोग GL_REPEATक्षैतिज अक्ष पर और एक ही एटलस में पिक्समैप्स के 90-डिग्रेड रोटेटेड वर्जन होने के कारण मैंने पाया कि मैं एक ही कॉल में एक ही वीबीओ का उपयोग करके जाहिरा तौर पर अलग-अलग ब्लॉकों की भारी मात्रा को आकर्षित कर सकता हूं। 6x6 घास के क्षेत्र के उदाहरण में, मैंने 12 त्रिकोणों में विभाजित किया है, क्योंकि मैं केवल अपने एटलस में एक आयाम पर दोहराता हूं।

मैं ज्यादातर इसे एकीकृत ग्राफिक्स चिप्स और मोबाइल के बहुत कम अंत पर काम करने के लिए प्राप्त कर रहा हूं, जहां जीएस सिर्फ एक चीज है जिसके साथ मैं एक दिन खेल सकता हूं।


3
आपको केवल प्रति स्वर में अधिकतम 3 चेहरों को आकर्षित करने की आवश्यकता है, लेकिन आपको दृष्टिकोण के आधार पर प्रत्येक स्वर के लिए अलग-अलग चेहरों को खींचने की आवश्यकता हो सकती है, इसलिए अनुकूलन इतना आसान नहीं है? एक पूर्व-निर्मित VBO में एक से अधिक स्वर होंगे। यदि आपका दृष्टिकोण voxels के बीच में है, तो आप एक के पूर्व और दूसरे के पश्चिम की ओर देखेंगे। इसका एकमात्र तरीका यह है कि आप वास्तविक बैक-फेसिंग चेहरों को तुच्छ समझ सकते हैं, लेकिन सबसे बुरी स्थिति यह है कि आप अभी भी 6 पक्षों में से 5 को स्वरों के समूह में प्रस्तुत करते हैं। यदि आपका दृष्टिकोण VBO की अक्षीय सीमा के बाहर है , तो आपको केवल 3 पक्षों को प्रस्तुत करना होगा।
ब्योर्न वेसेन

ब्योर्न पर हाजिर है, यह उल्लेखनीय है। (लेकिन मैं ब्लॉक के लिए VBO को आवश्यक रूप से बना रहा हूं और जो मैंने बनाया है उस पर पुनर्विचार कर रहा हूं, जब कैमरा हर समय पूरी दुनिया में रहने के बजाय चलता है; इसलिए मेरे पास इन विकल्पों को बनाने का स्वाभाविक समय है)
Will

10

तीसरे विकल्प के बारे में, इंस्टेंटेड ऐरे का उपयोग कर के बारे में क्या? मूल रूप से आप कई ड्रॉ बॉक्स (एक साधारण 8-वर्टेक्स क्यूब से बने) एक ड्रॉ कॉल के साथ खींचते हैं, पोजिशन (और अन्य डेटा) सोर्सिंग करते हैं, जो कि voxel-data VBO (उपयोग करके)glVertexAttribDivisor ओपनजीएल , मुझे यकीन है कि डीएक्स के पास वह भी है)। यह ज्योमेट्री शेडर एप्रोच से अधिक तेज हो सकता है, हालांकि एप्लिकेशन कोड (नॉन-शादर) काफी समान होना चाहिए, क्योंकि मुझे याद है कि ज्योमेट्री शेड्स स्लो होने के लिए प्रतिष्ठा रखते हैं, हालांकि मुझे उनके साथ कोई अनुभव नहीं है (या इंस्ट्रूमेंटिंग) जैसा कि मैं अभी भी बैठता हूं 2.1 हार्डवेयर पर।

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


हाँ यह इस समस्या का सबसे अच्छा समाधान है। मुझे क्यों नहीं सूझा? :)
नोटाबिन

कुछ प्रयोग के बाद मुझे आपको यह बताना होगा कि पके हुए ज्यामिति किसी भी उदाहरण को एक व्यापक अंतर से काटते हैं। मैंने अभी तक ज्यामिति शेड की कोशिश नहीं की है।
जरी कोमप्पा

@JariKomppa क्या आप पके हुए ज्यामिति से मतलब पर विस्तृत कर सकते हैं?
स्टीवन लू

पूर्व-अनुवाद किए गए उदाहरण और एकल जाल में कॉपी किए गए। जैसे कि एक जाल जो सौ क्यूब्स या जो कुछ भी दर्शाता है।
जरी कोमप्पा

@JariKomppa मैंने वही परिणाम देखे हैं, जहाँ जाल बनाना ज्यादा तेज है। हालांकि gtx 680 पर इंस्टेंसिंग विकल्प बहुत तेज, अजीब काम करता है।
लेवी एच।

1

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

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

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


2
यह एक अच्छा विचार हो सकता है कि ज्यामिति और / या शिखर छाया में आसन्न स्वरों के लिए जाँच की जाए और यदि वे ओत-प्रोत हों तो शीर्ष रेखाओं को छोड़ें या चेहरे को छोड़ दें। अन्यथा, GS समाधान उपयोग किए गए बैंडविड्थ को इसके बजाय बढ़ाएगा।
तमस्ची

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

@ तमस्ची: हाँ इस समस्या को लिखने के बाद मुझे यह समस्या हुई .. सीपीयू-संस्करण के लिए, ठोस पदार्थों के बीच के स्वरों को दबा दिया जाता है, लेकिन GPU पर यह असंभव हो सकता है कि प्री-पास के बिना एक साथ क्या होगा। अलग-अलग ..
ब्योर्न वेसेन

1
आप वर्टफ़ेयर बफर को एक आइमप्लर बफ़र या usamplerBuffer की शेप में समान रूप से बाँध सकते हैं, फिर बनावट (name_of_uniform, index) के साथ लुकअप कर सकते हैं। एक अन्य विकल्प बफर को एक समान सरणी में बाँधने के लिए होगा, जो आपको उस प्रारूप में अधिक स्वतंत्रता देता है जिसका आप उपयोग करना चाहते हैं।
तमसाची
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.