Q100517: लीफ-स्तर (इंस्टेंस आईडी) इंस्टेंसिंग के साथ दृश्य ग्राफ़ कुक प्रदर्शन बढ़ाना

सारांश

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

अन्य उपलब्ध इंस्टेंसिंग दृष्टिकोणों पर अवलोकन के लिए, कृपया Katana डेवलपर गाइड में निम्नलिखित अनुभाग पढ़ें: इंस्टेंसिंग

कृपया पॉइंट क्लाउड इंस्टेंसिंग पर नीचे दिए गए अनुभागों को दर्शाने वाले उदाहरण प्रोजेक्ट के लिए Katana प्रोजेक्ट फ़ाइल “ PointcloudInstancingAndMaterialAssign_Arnold.katana ” देखें।

लीफ-स्तरीय इंस्टेंसिंग

निम्नलिखित अनुभाग लीफ-स्तरीय इंस्टेंसिंग का एक संक्षिप्त अवलोकन है। इंस्टेंसिंग पर अधिक गहन चर्चा के लिए, रेंडरमैन दस्तावेज़ीकरण: रेंडरमैन 26 दस्तावेज़ - Katana में इंस्टेंसिंग, इंस्टेंसिंग के परिचय के रूप में तीनों इंस्टेंसिंग विधियों को सेट अप करने का तरीका दर्शाता है।

लीफ-लेवल इंस्टेंसिंग में, पहले से मौजूद दोहराई जाने वाली ज्यामिति को इंस्टेंस किया जा सकता है, जिसका अर्थ है कि दृश्य में पहले से ही कई बार मौजूद ज्यामिति को केवल एक बार लोड किया जाएगा और ज्यामिति की कोई भी अतिरिक्त घटना मेमोरी में ज्यामिति डेटा के उसी सेट को संदर्भित करेगी। दोहराई जाने वाली ज्यामिति वाले मौजूदा Katana प्रोजेक्ट, जिन्हें इंस्टेंसिंग से लाभ होगा, उन्हें दृश्य ग्राफ़ में दोहराई जाने वाली ज्यामिति के स्थानों में instance.ID विशेषता जोड़कर आसानी से संशोधित किया जा सकता है। हालाँकि, एक कमी यह है कि केवल उन स्थानों को इंस्टेंस किया जा सकता है जिनमें कोई संतान नहीं है।

इसे प्राप्त करने के लिए, सभी समान स्थानों में एक मिलान करने वाली instance.ID विशेषता होनी चाहिए। रेंडरर द्वारा एक स्थान को इंस्टेंस स्रोत के रूप में चुना जाता है, फिर अन्य सभी स्थानों को उस स्थान के इंस्टेंस के रूप में माना जाता है।

नोट: इंस्टेंस स्रोत के रूप में ज्यामिति का चयन कैसे किया जाता है, यह समझना महत्वपूर्ण है ताकि यह तय किया जा सके कि सभी स्थानों में ज्यामिति होनी चाहिए या दृश्य ग्राफ़ में केवल सबसे ऊपरी स्थान में ही ज्यामिति की आवश्यकता है। इंस्टेंस स्रोत का चयन कैसे किया जाता है, यह समझने के लिए कृपया रेंडरर दस्तावेज़ देखें।

बिंदु क्लाउड के लिए लीफ-स्तरीय इंस्टेंसिंग

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

OpScript एक इंस्टेंस लोकेशन जनरेट करता है और पॉइंट क्लाउड में प्रत्येक पॉइंट के लिए instance.ID विशेषता की प्रतिलिपि बनाता है। OpScript द्वारा लोकेशन जनरेट होने के बाद, रेंडरर एक लोकेशन को ज्योमेट्री स्रोत के रूप में चुनता है, फिर बाकी सभी लोकेशन्स को उस लोकेशन के इंस्टेंस के रूप में माना जाता है । पॉइंट क्लाउड में लीफ-लेवल इंस्टेंसिंग प्राप्त करने के लिए निम्नलिखित चरण हैं।

1. Alembic_In का उपयोग करके एक पॉइंट क्लाउड और इंस्टेंस स्रोत आयात करें। फिर पॉइंट क्लाउड स्थान पर instance.ID नामक विशेषता को एक मनमाना स्ट्रिंग मान पर सेट करें। इस उदाहरण में, instance.ID bob पर सेट किया गया है।

2. एक OpScript नोड बनाएं और इसके स्थान पैरामीटर को एक दृश्य ग्राफ स्थान पर सेट करें जिसके तहत इंस्टेंस उत्पन्न किए जाएंगे, उदाहरण के लिए: /root/world/geo/derivedassets

3. OpScript नोड में, एक user.instanceSourceLocation पैरामीटर बनाएँ और उसे इंस्टेंस स्रोत के दृश्य ग्राफ़ स्थान पर सेट करें। फिर पॉइंट क्लाउड के दृश्य ग्राफ़ स्थान पर एक user.pointCloudLocation पैरामीटर बनाएँ। उपयोगकर्ता पैरामीटर बनाने के चरणों के लिए, Katana उपयोगकर्ता मार्गदर्शिका देखें: उपयोगकर्ता पैरामीटर जोड़ना । कृपया ध्यान दें कि लीफ-स्तरीय इंस्टेंसिंग में, इंस्टेंस स्रोत स्थान में चाइल्ड्स नहीं हो सकते, अन्यथा इंस्टेंसिंग काम नहीं करेगी।

4. फिर पॉइंट क्लाउड में प्रत्येक बिंदु के लिए इंस्टेंस स्थान उत्पन्न करने के लिए निम्नलिखित कोड को OpScript नोड के स्क्रिप्ट पैरामीटर में कॉपी करें।

 -- Read op arguments
local instanceSourceLocation = Interface.GetOpArg( "user.instanceSourceLocation" ):getValue()
local pointCloudLocation = Interface.GetOpArg( "user.pointCloudLocation" ):getValue()

if Interface.AtRoot() then
 
-- Read the point cloud
 
local points = Interface.GetAttr( "geometry.point.P" , pointCloudLocation):getNearestSample(Interface.GetCurrentTime())

 
-- Read the instanceID
 
local instanceID = Interface.GetAttr( "instance.ID" , pointCloudLocation):getNearestSample(Interface.GetCurrentTime())

 
-- Loop over points
 
local x, y, z
 
local gb = GroupBuilder()
 
for i= 0 , #points/ 3 - 1 do
      x = points[
3 *i+ 1 ]
      y = points[
3 *i+ 2 ]
      z = points[
3 *i+ 3 ]

     
-- Build op arguments for the child location
      gb:update(Interface.GetOpArg())
      gb:set(
"childAttrs" , Interface.GetAttr( "" , instanceSourceLocation))
      gb:set(
"childAttrs.geometry.instanceSource" , StringAttribute(instanceSourceLocation))
      gb:set(
"childAttrs.xform.interactive.translate" , DoubleAttribute({x, y, z}))
      gb:set(
"childAttrs.instance.ID" , StringAttribute(instanceID))

     
-- Create the child
      Interface.CreateChild(
         
string . format ( "child%04d" , i),
          Interface.GetOpType(),
          gb:build())
 
end
else
 
local childAttrs = Interface.GetOpArg( "childAttrs" )
 
for i= 0 , childAttrs:getNumberOfChildren() -1 do
      Interface.SetAttr(childAttrs:getChildName(i), childAttrs:getChildByIndex(i))
 
end
end

उपरोक्त OpScript, instance.ID विशेषता सहित, बिंदु क्लाउड में प्रत्येक बिंदु पर इंस्टेंस स्रोत की प्रतिलिपि बनाता है।

5. अंत में, प्रून नोड का उपयोग करके दृश्य ग्राफ़ से पॉइंट क्लाउड को हटाएँ ताकि वह रेंडर से छूट जाए। यह चरण इसलिए आवश्यक है ताकि रेंडरर पॉइंट क्लाउड को इंस्टेंस स्रोत के रूप में न चुने।

सामग्री असाइनमेंट के साथ सामग्री भिन्नता

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

बिंदु बादलों पर प्रत्येक बिंदु के लिए इंस्टेंस स्थान बनाने के लिए ओपस्क्रिप्ट के साथ लीफ-स्तर और पदानुक्रमित इंस्टेंसिंग का उपयोग करने से यह लाभ होता है कि सामग्रियों को प्रति इंस्टेंस स्थान के अनुसार निर्दिष्ट किया जा सकता है।

इंस्टेंस लोकेशन जनरेट करने के बाद, प्रत्येक इंस्टेंस के लोकेशन के अनुसार मटीरियल को बदला जा सकता है। विशिष्ट इंस्टेंस की पहचान करना सीन ग्राफ़ में इंस्टेंस लोकेशन को बड़ा करने और व्यूअर में वांछित इंस्टेंस चुनने जितना ही आसान है। दिए गए उदाहरण प्रोजेक्ट में, इंस्टेंस लोकेशन /root/world/geo/derivedassets लोकेशन के नीचे पाए जा सकते हैं।

इसके बाद, सामग्री को MaterialAssign नोड का उपयोग करके या सामग्री स्थान की ओर इशारा करते हुए, इंस्टेंस स्थान पर materialAssign विशेषता सेट करके, वांछित स्थानों पर असाइन किया जा सकता है।

अग्रिम पठन
इंस्टेंसिंग के अवलोकन के लिए, नीचे दिए गए पहले संसाधन लिंक को देखें। नीचे दिए गए अन्य संसाधन प्रत्येक इंस्टेंसिंग विधि पर अन्य उन्नत इंस्टेंसिंग विषयों पर गहराई से चर्चा करते हैं।

संलग्नक

हम चाहते हैं कि खेद व्यक्त करते हैं

कृपया हमें बताएँ कि