Q100514: इंस्टेंस ऐरे इंस्टेंसिंग के साथ दृश्य ग्राफ़ कुक प्रदर्शन बढ़ाना

सारांश

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

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

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

इंस्टेंस एरेज़

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

इंस्टेंस ऐरे में, इंस्टेंस स्थानों को "इंस्टेंस ऐरे" प्रकार के एकल स्थान पर विशेषताओं के माध्यम से एक या अधिक इंस्टेंस स्रोतों से मैप किया जाता है। इंस्टेंस ऐरे पदानुक्रमित इंस्टेंसिंग के समान होते हैं, और इनका अतिरिक्त लाभ यह है कि एकाधिक इंस्टेंस स्रोतों को आसानी से सेट किया जा सकता है। एक कमी यह है कि प्रत्येक इंस्टेंस के लिए सामग्री में बदलाव नहीं किया जा सकता है।

इंस्टेंस ऐरे लोकेशन में geometry.instanceSource और कम से कम एक ट्रांसफ़ॉर्मेशन विशेषता होनी चाहिए। यदि instanceSource में केवल एक ही पथ है, तो geometry.instanceIndex वैकल्पिक है, ऐसी स्थिति में उस इंस्टेंस स्रोत का उपयोग इंस्टेंस ऐरे के सभी इंस्टेंस के लिए किया जाता है।

ज्यामिति.instanceSource

एक या अधिक इंस्टेंस स्रोतों के दृश्य ग्राफ़ स्थान पथों वाली स्ट्रिंग या स्ट्रिंग सरणी विशेषता

ज्यामिति.instanceIndex

आवश्यक इंस्टेंस के समान तत्वों वाली एक सरणी विशेषता। इस सरणी में संग्रहीत मान geometry.instanceSource सरणी में वांछित इंस्टेंस स्रोत का सूचकांक दर्शाते हैं। दूसरे शब्दों में, instanceIndex , इंस्टेंस इंडेक्स से इंस्टेंस स्रोत इंडेक्स तक एक मैपिंग बनाता है।

ज्यामिति.instanceMatrix ज्यामिति.instanceTranslate ज्यामिति.instanceRotateX ज्यामिति.instanceRotateY
ज्यामिति.instanceRotateZ ज्यामिति.instanceScale

इनमें से प्रत्येक विशेषता प्रति-आवृत्ति रूपांतरणों की एक समतल सरणी है। प्रत्येक विशेषता का अर्थ पारंपरिक रूपांतरण विशेषताओं के समान ही है, और इन्हें एनीमेशन का समर्थन करने के लिए बहु-नमूनाकृत किया जा सकता है।

नोट: RenderMan केवल geometry.instanceMatrix विशेषता के उपयोग का समर्थन करता है।

इंस्टेंसिंग विशेषता सम्मेलनों के बारे में अधिक जानकारी के लिए, कृपया Katana डेवलपर गाइड: इंस्टेंसिंग पर जाएं।

एक बिंदु क्लाउड के लिए सरणी इंस्टेंसिंग

इंस्टेंस ऐरे का लाभ यह है कि इंस्टेंस को रखने के लिए केवल एक ही स्थान का उपयोग किया जाता है, जिससे हज़ारों इंस्टेंस लोकेशन वाले दृश्यों में भी दृश्य ग्राफ़ छोटा रहता है। इंस्टेंस ऐरे, इंस्टेंस ऐरे बनाने के लिए इंस्टेंस स्रोतों के स्थानों वाले geometry.instanceSource विशेषता को पढ़ते हैं। इंस्टेंस स्रोतों के इंडेक्स की एक सरणी, प्रत्येक इंस्टेंस के लिए एक, वाली geometry.indexArray विशेषता का उपयोग करके कई इंस्टेंस स्रोतों को संदर्भित किया जा सकता है। पॉइंट क्लाउड में बिंदुओं के लिए इंस्टेंस ज्यामिति के लिए एक इंस्टेंस ऐरे बनाने के चरण निम्नलिखित हैं।

1. एक पॉइंट क्लाउड ऑब्जेक्ट बनाएँ या आयात करें और उसके स्थान के प्रकार विशेषता को AttributeSet नोड का उपयोग करके पॉइंटक्लाउड पर सेट करें। पॉइंट क्लाउड geometry.point.P विशेषता वाली कोई भी ज्यामिति हो सकती है, जैसे कि PrimitiveCreate नोड से।

mceclip0.png

फिर आप देखेंगे कि दृश्य ग्राफ में बिंदु बादल का स्थान प्रकार बदल गया है:

mceclip4.png

2. फिर उस ज्यामिति को बनाएँ या आयात करें जिसे आप इंस्टेंस स्रोत के रूप में उपयोग करना चाहते हैं। फिर किसी अन्य AttributeSet नोड का उपयोग करके उसके मूल स्थान के प्रकार विशेषता को इंस्टेंस स्रोत पर सेट करें।

उदाहरण के लिए, यदि ज्यामिति /root/world/geo/src/teapot पर है, तो /root/world/geo/src इंस्टेंस स्रोत स्थान होना चाहिए। आप बाद में एकाधिक इंस्टेंस स्रोतों का उपयोग करने के लिए इस स्थान के अंतर्गत और ऑब्जेक्ट जोड़ सकते हैं।

mceclip1.png

फिर आप दृश्य ग्राफ में अपने इंस्टेंस स्रोत का स्थान प्रकार परिवर्तित देखेंगे:

mceclip0.png

3. दोनों नेटवर्कों को एक साथ मिलाकर कुछ इस प्रकार बनाएं:

mceclip0.png

4. मर्ज के बाद, एक OpScript नोड बनाएँ और उसके applyWhere पैरामीटर को at specific location में बदलें। अब आपको OpScript नोड के पैरामीटर्स के शीर्ष पर एक नया location पैरामीटर दिखाई देगा। location पैरामीटर का मान यह निर्धारित करेगा कि दृश्य ग्राफ़ में इंस्टेंस ऐरे कहाँ जनरेट किया जाएगा। इस उदाहरण के लिए, हम /root/world/geo/instances का उपयोग कर रहे हैं।

5. OpScript नोड में, एक user.pointCloudLocation स्ट्रिंग पैरामीटर बनाएँ और उसे पॉइंट क्लाउड के सीन ग्राफ़ लोकेशन पथ पर सेट करें। फिर, Scene Graph Locations विजेट प्रकार के साथ एक user.instanceSourceLocations स्ट्रिंग ऐरे पैरामीटर बनाएँ और अपने इंस्टेंस स्रोत सीन ग्राफ़ लोकेशन पथों को ऐरे में मानों के रूप में जोड़ें।

उपयोगकर्ता पैरामीटर बनाने और उनके विजेट प्रकार को बदलने के चरणों के लिए, कृपया Katana उपयोगकर्ता मार्गदर्शिका देखें: उपयोगकर्ता पैरामीटर जोड़ना

6. निम्नलिखित OpScript Lua कोड, Renderman Docs: Instancing पर पाए गए Pixar उदाहरण से छोटा किया गया है, जो एक बिंदु क्लाउड और इंस्टेंस स्रोत स्थानों के आधार पर एक इंस्टेंस सरणी बनाता है।

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

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

-- Read the point cloud's points
local pointAttr = Interface.GetAttr("geometry.point.P", pointCloudLocation)
local points = pointAttr :getNearestSample(Interface.GetCurrentTime())

-- Create a single location which will generate an array of instances
-- Set type for this location to 'instance array'
Interface.SetAttr(
'type' , StringAttribute( 'instance array' ))

-- This instance array location must point to the instance source locations
-- through the attribute 'geometry.instanceSource'
Interface.SetAttr(
'geometry.instanceSource' , instanceSourceLocations)

-- The indexArray attribute determines which instance source each instance location represents
local indexArray = {}

-- for each instance create an instance index
for i= 0 ,#points/ 3-1 do
 
-- For this example, the instances are arbitrarily assigned to an
-- instance source
-- a more stable apporach would be to use an arbitrary attribute
-- on the point cloud to assign an instance source

 indexArray[#indexArray
+1 ] = i%instanceSourceLocations:getNumberOfTuples()
end

-- Set index for instance array element

Interface.SetAttr(
'geometry.instanceIndex' , IntAttribute(indexArray, 1 ))

-- geometry.instanceMatrix
-- Get the transforms from the points
local numTimeSamples = pointAttr:getNumberOfTimeSamples()
local matrixArrayMap = {}
-- to get motion blur on the instances, create an instanceMatrix at each
-- time sample available from the point cloud points attribute
for idx=0,numTimeSamples -1 do
local sampleTime = pointAttr:getSampleTime(idx)
local points = pointAttr:getNearestSample(sampleTime)

-- each instance in array has its own matrix
local matrixArray = {}
local workMatrix = Imath.M44d():toTable()

-- for each instance build a matrix with a mocked up transformation
for i=0,#points/ 3-1 do
-- grab the points that represent this instance
x = points[ 3 *i +1 ]
y = points[ 3 *i +2 ]
z = points[ 3 *i +3 ]

-- set the translate of the matrix to the points in the point cloud
workMatrix[ 13 ] = x
workMatrix[ 14 ] = y
workMatrix[ 15 ] = z

for j = 1 , 16 do
matrixArray[#matrixArray +1 ]=workMatrix[j]
end
end
matrixArrayMap[sampleTime] = matrixArray
end

Interface.SetAttr('geometry.instanceMatrix', DoubleAttribute (matrixArrayMap, #matrixArrayMap))

उपरोक्त OpScript, इंस्टेंस ऐरे geometry.instanceSource विशेषता को user.instanceSourceLocations उपयोगकर्ता पैरामीटर पर सेट किए गए इंस्टेंस स्रोत स्थानों पर सेट करता है। इसके अतिरिक्त, इंस्टेंस ऐरे geometry.instanceIndex विशेषता को इंस्टेंस स्रोतों के बीच वैकल्पिक करने के लिए सेट किया गया है। अंत में, इंस्टेंस ऐरे geometry.instanceMatrix विशेषता को पॉइंट क्लाउड के प्रत्येक बिंदु से अनुवाद जानकारी से भर दिया जाता है।

7. अब इंस्टैंस बन गए हैं, पॉइंट क्लाउड की अब आवश्यकता नहीं है और हम इसे सीन से हटाने के लिए प्रून नोड का उपयोग कर सकते हैं।

mceclip5.png

अब आप अपने इंस्टैंस ऐरे को देखने के लिए रेंडर कर सकते हैं:

mceclip1.png

आप पूरा दृश्य यहां से डाउनलोड कर सकते हैं: instanceArray.katana

प्रति इंस्टेंस निर्दिष्ट सामग्री में परिवर्तन करने के लिए इंस्टेंस ऐरे समाधान

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

इंस्टेंस ऐरे बनाने के लिए कृपया ऊपर दिए गए पॉइंटक्लाउड सेक्शन में इंस्टेंस ऐरे देखें। इंस्टेंस ऐरे बन जाने के बाद, प्रत्येक इंस्टेंस स्रोत के लिए सामग्री को अलग-अलग करके इंस्टेंस के बैच के अनुसार सामग्री को बदला जा सकता है। किसी इंस्टेंस स्रोत के लिए सामग्री बदलने के लिए MaterialAssign नोड का उपयोग करें, और सामग्री असाइन उस विशिष्ट इंस्टेंस स्रोत का उपयोग करने वाले प्रत्येक इंस्टेंस स्थान पर ले जाती है। बस MaterialAssign नोड बनाएँ और इंस्टेंस स्रोतों के रूप में चुने गए दृश्य ग्राफ़ स्थानों पर सामग्री असाइन करें।

अग्रिम पठन

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

संलग्नक

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

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