डायनामिक दुनिया के लिए डिस्टेंस फील्ड फील्ड रे मार्चिंग को कैसे लागू किया जाता है?


10

मुझे लगता है कि मैं हस्ताक्षरित दूरस्थ क्षेत्र रे मार्चिंग की मूल बातें समझता हूं। आप अपने दृश्य को दूरस्थ क्षेत्रों के एक समूह के साथ मॉडल करते हैं (जैसे कि ये: http://iquilezles.org/www/articles/distfunctions/distfunctions.htm ), फिर प्रत्येक पिक्सेल के लिए आप एक किरण डालते हैं, किरण की शुरुआत से शुरू करते हैं उस बिंदु पर निकटतम वस्तु की दूरी का पता लगाएं, और जब तक आप कुछ हिट न करें, तब तक निकटतम दूरी से बिंदु को बढ़ाएं। मैं एक साधारण रेंडरर करने में कामयाब रहा, और यही वह जगह है जहाँ तकनीक के अधिकांश विवरण बंद हो जाते हैं।

यह मुझे कुछ सवालों के साथ छोड़ देता है कि वास्तविक विश्व परिदृश्य में एसडीएफ रे मार्चिंग का उपयोग कैसे किया जा सकता है:

प्रश्न 1: एक वास्तविक गेम में, दृश्य आमतौर पर सीपीयू पर जटिल होता है और कई गतिशील वस्तुओं के साथ लोड होता है। मैं मूल रोड़ा को समझने (जैसे कि ऑक्टर्स), और बहु-स्तरीय रेंडरिंग के साथ, मैं रेंडर करने के लिए फ़्रिज़रम में वस्तुओं की सूची (सीपीयू पर) बनाऊंगा।

तो, कल्पना कीजिए कि मेरे पास बहुत ही जटिल दृश्य है जिसमें सीपीयू द्वारा नियंत्रित स्क्रीन पर कई पात्रों और गतिशील वस्तुओं के साथ चलती है। मैं उन वस्तुओं को कैसे स्ट्रीम करूंगा जिन्हें मैं प्रत्येक फ्रेम में जीपीयू को प्रस्तुत करना चाहता हूं? हर उदाहरण GLSL में दृश्य हार्डकोड किया गया है। क्या कोई स्तर के एक उदाहरण को शेडर को गतिशील रूप से स्ट्रीम किया जा सकता है?

प्रश्न 2: वस्तुओं के कई रंग कैसे हो सकते हैं? डिस्टेंस फ़ंक्शंस केवल एक दूरी लौटाते हैं, लेकिन कार्यान्वयन आमतौर पर रंग कैसे वापस करते हैं? (उदाहरण के लिए, आपने एक लाल गोला मारा और एक नीला घन नहीं।) यदि यह सीपीयू कार्यान्वयन होता, तो मैं दूरी फ़ंक्शन के अंदर एक वैश्विक फ़ंक्शन को कॉल कर सकता था जब यह किरण मार्चर को समाप्त करने के लिए हिट होता है, और यह हिट ऑब्जेक्ट को भी पास कर सकता है बनावट / रंग। लेकिन, आप GLSL में आइटम के रंग या बनावट को कैसे लौटाएंगे?

धन्यवाद।

जवाबों:


2

यह एक न्यूनतम उत्तर है, लेकिन यदि आपको बेहतर उत्तर नहीं मिला तो जानकारी साझा करना चाहते हैं।

असली खेल रे मार्चिंग का उपयोग कैसे करते हैं, इस बारे में वे आमतौर पर नहीं करते। केवल पिछले कुछ वर्षों में गेम ने स्क्रीन स्पेस रिफ्लेक्शन करने के लिए डेप्थ बफर को रेमर्श करना शुरू कर दिया है, लेकिन कोई गेम मुझे आपके द्वारा वर्णित तरीके से रे मार्चिंग के उपयोग के बारे में पता नहीं है - अभी तक?

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

आशा है कि आपके लिए कम से कम कुछ मदद हो! आपको ग्राफिक्स स्टैक एक्सचेंज साइट से भी अच्छे उत्तर मिल सकते हैं।


2
"कोई भी गेम मुझे आपके द्वारा वर्णित तरीके से रे मार्चिंग के उपयोग के बारे में पता नहीं है" मीडिया अणु के आगामी गेम ड्रीम्स उपयोगकर्ता द्वारा जनरेट किए गए कंटेंट स्कल्पिंग के लिए हस्ताक्षरित दूरी क्षेत्रों का उपयोग करता है, लेकिन अगर मैं सही ढंग से समझता हूं कि फ़ील्ड मेरे बजाय रेंडर करने के लिए एक बिंदु क्लाउड में परिवर्तित हो गए हैं प्रत्यक्ष रूप से पुनर्विकसित किया जा रहा है। : यह लेख कुछ विचार हो सकता है dualshockers.com/2015/08/15/...
DMGregory

1
@DMGregory नीस है, लेकिन मुझे लगता है कि यह सख्ती से रे मार्चिंग नहीं है। तो यह बिंदु अभी भी मान्य है, खेल आमतौर पर रे मार्चिंग का उपयोग नहीं करते हैं।
अवधारणा ३ डी

1
इस थ्रेड को अपडेट करना - आगामी गेम क्लेबुक ने अपने दृश्यों को रेंडर का उपयोग करके सीधे दूरी वाले क्षेत्रों के माध्यम से निकाल दिया , बजाय इसके कि वे पहले पारंपरिक ज्यामिति में परिवर्तित हो जाएं। तो "अभी तक?" प्रतीत होता है कि दो साल का समय हो गया है। :)
DMGregory

1

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

स्ट्रीमिंग के संबंध में, सरल उपाय यह है कि किसी प्रकार के टाइप किए गए बफ़र का उपयोग करें और जब आप अपना रे-मार्च करना चाहते हैं, तो इसे GPU पर फेंक दें। बफ़र का प्रत्येक तत्व एक जटिल प्रकार है (उदाहरण के लिए C / C ++ में एक संरचना), और प्रत्येक प्रकार में तत्व होते हैं जो यह निर्धारित करने के लिए कि आपको किस फ़ंक्शन का उपयोग करना चाहिए, यह स्थिति, रोटेशन, स्केल आदि है, और एक औसत रंग है। प्रक्रिया तब सरल हो जाती है:

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

आकृति के रंगों के बारे में, याद रखें कि शेड्स आपको जटिल प्रकारों के साथ-साथ आदिम; यह आपको सी-स्टाइल संरचना में सब कुछ फेंकने की अनुमति देता है, फिर उन संरचनाओं को अपने दूरस्थ फ़ंक्शन से वापस पास करें।

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

प्रक्रियात्मक बनावट एक और दृष्टिकोण है, लेकिन मैंने उन्हें खुद कभी इस्तेमाल नहीं किया है। iq ने उस क्षेत्र में काफी शोध किया है और Shadertoy पर कुछ दिलचस्प प्रदर्शन पोस्ट किए हैं, ताकि कुछ अतिरिक्त जानकारी इकट्ठा करने का एक तरीका हो सके।

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

मुझे नहीं पता कि ऊपर पर्याप्त स्पष्ट था या नहीं, इसलिए यह पूछने की चिंता न करें कि क्या कुछ भी मतलब नहीं है। मैं वास्तव में कोई भी GLSL / पिक्सेल-शेडिंग कोड के नमूने नहीं दे सकता क्योंकि मैं HLSL के साथ काम कर रहा हूं और छायांकन की गणना कर रहा हूं, लेकिन मैं कोशिश कर रहा हूं और ऐसी किसी भी चीज पर जाऊंगा जिसे मैंने पहले से ठीक से नहीं लिखा था :)।

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