मैं वर्तमान में एक गेम इंजन विकसित कर रहा हूं जो सुचारू प्रक्रियात्मक ज्यामिति प्रदर्शित करने के लिए एक रेंडरिंग तकनीक के रूप में हस्ताक्षरित दूरी के क्षेत्रों का उपयोग करता है (अब के लिए आपके लिंक में सरल प्राइमेटिव्स के साथ उत्पन्न, भविष्य में जूलिया और आईएफएस भग्न को लागू करने की तलाश में)। चूँकि मेरे इंजन को प्रक्रियात्मक पीढ़ी पर केंद्रित किया गया है और उन्हें इस तरह से आंकड़ों को परिभाषित करना चाहिए जो उन्हें किरण-मार्कर के अनुकूल बनाता है, इसलिए मैं इस प्रश्न का उत्तर देने के लिए एक अच्छी जगह हूं।
स्ट्रीमिंग के संबंध में, सरल उपाय यह है कि किसी प्रकार के टाइप किए गए बफ़र का उपयोग करें और जब आप अपना रे-मार्च करना चाहते हैं, तो इसे GPU पर फेंक दें। बफ़र का प्रत्येक तत्व एक जटिल प्रकार है (उदाहरण के लिए C / C ++ में एक संरचना), और प्रत्येक प्रकार में तत्व होते हैं जो यह निर्धारित करने के लिए कि आपको किस फ़ंक्शन का उपयोग करना चाहिए, यह स्थिति, रोटेशन, स्केल आदि है, और एक औसत रंग है। प्रक्रिया तब सरल हो जाती है:
- अपने दृश्य को एक प्रबंधनीय उपसमुच्चय में नोट करें (ध्यान दें कि कुंठित खुरचना और रोना बंद करना आंशिक रूप से किरण-मार्च एल्गोरिथ्म वैसे भी स्वचालित रूप से किया जाता है)
- अपने रेंडर इनपुट बफर में सबसेट पास करें
- जीपीयू को बफर पास करें यदि यह पहले से ही नहीं है, तो अपने दृश्य को साधारण पारंपरिक किरण-मार्चिंग के साथ प्रस्तुत करें। आपको मूल्यांकन करने के लिए किसी प्रकार की प्रति-चरण खोज करने की आवश्यकता होगी कि इनपुट-बफर में कौन सी वस्तु, किरण-मार्चर के प्रत्येक पुनरावृत्ति के लिए प्रत्येक किरण के सबसे करीब है, और आपको किरणों (या किस स्थिति में) को लागू करने की आवश्यकता होगी जीपीयू तक पहुँचने से पहले आपको फिगर रोटेशन को पलटना होगा) या डिस्टेंस फंक्शंस (स्थिति में बदलाव के लिए फंक्शन ओरिजिन को आगे बढ़ाना, जैसे एडजस्ट करने के लिए क्यूबिक साइड की लंबाई को एडजस्ट करना) आदि सबसे सरल तरीका है कि पहले किरणों को संशोधित करें आप उन्हें वास्तविक कोर डिस्टेंस फंक्शन में पास करते हैं।
आकृति के रंगों के बारे में, याद रखें कि शेड्स आपको जटिल प्रकारों के साथ-साथ आदिम; यह आपको सी-स्टाइल संरचना में सब कुछ फेंकने की अनुमति देता है, फिर उन संरचनाओं को अपने दूरस्थ फ़ंक्शन से वापस पास करें।
मेरे इंजन में, प्रत्येक संरचना में एक दूरी, एक रंग और एक आईडी होती है, जो इसे इनपुट बफर में संबंधित आंकड़ा परिभाषा से जोड़ती है। प्रत्येक आईडी प्रासंगिक दूरी फ़ंक्शन के आस-पास के संदर्भ से प्रेरित है (चूंकि मेरी मैपिंग फ़ंक्शन इनपुट बफ़र के माध्यम से प्रत्येक चरण के लिए प्रत्येक किरण के निकटतम आंकड़ा खोजने के लिए है, मैं प्रत्येक एसडीएफ कहे जाने पर लूप काउंटर के मूल्य का सुरक्षित रूप से इलाज कर सकता हूं उस फ़ंक्शन के लिए आंकड़ा आईडी के रूप में), जबकि दूरी मान को एक मनमाना कोर एसडीएफ (जैसे) का उपयोग करके परिभाषित किया गया हैpoint - figure.pos
एक गोले के लिए), और रंगों को या तो चित्र बफर में उपयुक्त तत्व के औसत रंग से परिभाषित किया जाता है (इसलिए यह आंकड़ा आईडी के चारों ओर रखने के लिए उपयोगी क्यों है) या संग्रहीत औसत की ओर भारित एक प्रक्रियात्मक रंग के माध्यम से (एक उदाहरण हो सकता है) मंडेलबुलब पर कुछ बिंदुओं के लिए एक पुनरावृत्ति गणना, एफपी रंग अंतरिक्ष से पूर्णांक रंग स्थान के लिए अपने "औसत रंग" की मैपिंग, फिर XOR'ing द्वारा पैलेट के रूप में मैप किए गए रंग का उपयोग करके पुनरावृत्ति गिनती के खिलाफ)।
प्रक्रियात्मक बनावट एक और दृष्टिकोण है, लेकिन मैंने उन्हें खुद कभी इस्तेमाल नहीं किया है। iq ने उस क्षेत्र में काफी शोध किया है और Shadertoy पर कुछ दिलचस्प प्रदर्शन पोस्ट किए हैं, ताकि कुछ अतिरिक्त जानकारी इकट्ठा करने का एक तरीका हो सके।
भले ही आपका रंग प्रत्येक आकृति के लिए स्थिर हो, प्रक्रियात्मक रूप से उत्पन्न, या जादुई रूप से एक प्रक्रियात्मक बनावट से नमूना लिया गया हो, मूल तर्क समान है: कुछ प्रकार के मध्यवर्ती जटिल प्रकार (जैसे एक संरचना) में सार आंकड़े, स्थानीय दूरी और स्थानीय दोनों को संग्रहीत करते हैं उस प्रकार के एक उदाहरण में रंग, फिर अपनी दूरी फ़ंक्शन से वापसी मान के रूप में जटिल प्रकार पास करें। आपके कार्यान्वयन के आधार पर, आउटपुट रंग स्क्रीन से सीधे गुजर सकता है, या आपके प्रकाश कोड में टकराव बिंदु का पालन कर सकता है।
मुझे नहीं पता कि ऊपर पर्याप्त स्पष्ट था या नहीं, इसलिए यह पूछने की चिंता न करें कि क्या कुछ भी मतलब नहीं है। मैं वास्तव में कोई भी GLSL / पिक्सेल-शेडिंग कोड के नमूने नहीं दे सकता क्योंकि मैं HLSL के साथ काम कर रहा हूं और छायांकन की गणना कर रहा हूं, लेकिन मैं कोशिश कर रहा हूं और ऐसी किसी भी चीज पर जाऊंगा जिसे मैंने पहले से ठीक से नहीं लिखा था :)।