क्या किसी भी इनपुट ज्यामिति के बिना ज्यामिति shader में primitives उत्पन्न करने का कोई तरीका है?


17

कुछ साल पहले मैंने ओपनिंग में इस जीपीयू जेम को लागू करने की कोशिश की, जिसमें मार्चिंग क्यूब्स का उपयोग करके 3 डी प्रक्रियात्मक इलाके उत्पन्न किए गए । लेख अधिकतम दक्षता के लिए ज्यामिति shader में मार्चिंग क्यूब्स को लागू करने का सुझाव देता है। इसका मतलब यह है कि मुझे डोमेन में प्रत्येक voxel के लिए एक बार shader चलाने की आवश्यकता है, और यह उस सेल में संपूर्ण ज्यामिति उत्पन्न करेगा।

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

तो, वहाँ वैसे भी है OpenGL बताने के लिए ज्यामिति shader से किसी भी इनपुट ज्यामिति के एक प्रतिपादन पास शुरू करने के लिए? या मुझे हमेशा चीजों को चलाने के लिए कुछ डमी पॉइंट्स को GPU पर भेजना होगा।

जवाबों:


15

नहीं, वास्तव में ऐसा करने का कोई तरीका नहीं है।

एक ज्यामिति शेडर आह्वान के लिए एक इनपुट आदिम की आवश्यकता होती है और 0 या अधिक आउटपुट आदिम उत्पन्न करता है। एक इनपुट आदिम के बिना, वास्तव में ज्यामिति shader को आह्वान करने का एक तरीका नहीं है । बेशक आप प्रत्येक इनपुट आदिम के लिए ज्यामिति shader की अधिकतम संख्या में आउटपुट प्राइमिटिव की सीमा को बढ़ा सकते हैं (अभी व्यावहारिक सीमा नहीं जानते हैं, हजारों के क्रम पर होना चाहिए)। तो आप शायद प्रत्येक बिंदु के लिए 1024 त्रिकोण उत्पन्न कर सकते हैं, लेकिन आपके पास हमेशा कुछ इनपुट प्राइमेटिव्स होने चाहिए।

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

लेकिन आपने वास्तव में क्या किया, प्रत्येक ग्रिड सेल के लिए एक बिंदु प्रदान करना और उस सेल के लिए मार्चिंग क्यूब्स त्रिकोण उत्पन्न करना, बिल्कुल सीधे-आगे का दृष्टिकोण है। बेशक इस सेल में क्या विशेषताएँ हैं, यह आपके ऊपर है, यह एक 3D स्थिति हो सकती है, एक टेक्सकोर्ड को 3D बनावट में, जो भी हो, लेकिन वे ग्रिड सेल हैं जिन्हें आप प्रस्तुत करते हैं। विशुद्ध रूप से बोली जाने वाली, आप वास्तव में उन बिंदुओं को "त्याग" नहीं करते हैं और फिर उन्हें त्रिकोण द्वारा "प्रतिस्थापित" करते हैं, आप प्रत्येक बिंदु को त्रिकोण के एक सेट में परिवर्तित करते हैं। यही कारण है कि ज्यामिति shader के लिए है और इसके बारे में "hacky" या "अनुचित" कुछ भी नहीं है। कोई नहीं कहता है कि ज्यामिति शेडर को उसी आउटपुट आदिम प्रकार को उत्पन्न करना है जैसा कि इनपुट "उचित" होना था


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

इसलिए, पूर्वव्यापी में मुझे अपने बयान को शुरू से ही रिलेट करना चाहिए: आप बिना किसी इनपुट प्राइमेटिव के प्राइमेटिव उत्पन्न नहीं कर सकते, लेकिन आप उन्हें बिना किसी इनपुट ज्यामिति के उत्पन्न कर सकते हैं

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