OpenGL ES 2.0 में ज्यामिति इंस्टेंटिंग


12

मैं OpenGL ES 2.0 में ज्यामिति इंस्टेंसिंग करने की योजना बना रहा हूं। मूल रूप से मैं एक ही ज्यामिति (एक कुर्सी) को अपने दृश्य में 1000 बार प्रस्तुत करने की योजना बना रहा हूं।

OpenGL ES 2.0 में ऐसा करने का सबसे अच्छा तरीका क्या है?

मैं एक विशेषता के रूप में मॉडल व्यू मैट 4 पास करने पर विचार कर रहा हूं। चूंकि विशेषताएँ प्रति शीर्ष डेटा के अनुसार हैं, इसलिए मुझे उसी त्रिभुज के प्रत्येक शीर्ष के लिए तीन बार इसी mat4 को पास करने की आवश्यकता है, (चूंकि त्रिकोण के सभी कोने में मॉडलव्यू स्थिर रहता है)।

यह GPU (2 अतिरिक्त कोने * 16 फ़्लोट्स * (त्रिकोणों की संख्या) अतिरिक्त डेटा की राशि) को भेजे गए बहुत से अतिरिक्त डेटा की राशि होगी।

या क्या मुझे त्रिकोण के अनुसार केवल एक बार mat4 भेजना चाहिए? लेकिन विशेषताओं का उपयोग करके यह कैसे संभव है क्योंकि विशेषताओं को "प्रति शीर्ष" डेटा के रूप में परिभाषित किया गया है?

OpenGL ES 2.0 में इंस्टेंटिंग करने का सबसे अच्छा और कुशल तरीका क्या है?


3
मुझे वास्तव में याद आती है glVertexAttribDivisor:(
विल

जवाबों:


9

ES2 में न तो GlVertexAttribDivisor है और न ही फ्लोटिंग पॉइंट टेक्सचर हैं इसलिए आपके विकल्प काफी सीमित हैं।

यदि आप पहले से ही ऐसा नहीं कर रहे हैं तो निश्चित रूप से अपने कुर्सी मॉडल को VBO में डाल दें। वहाँ से आप कम या ज्यादा व्यक्तिगत ड्रॉ कॉल - प्रति कुर्सी तक सीमित हैं - इसलिए यह प्रत्येक कुर्सी के लिए परिवर्तन मैट्रिक्स को GPU के रूप में कुशलता से प्राप्त करने का प्रश्न है।

आप नियमित रूप से glUniform कॉल के साथ ऐसा कर सकते हैं, या आप कुछ अतिरिक्त वर्टेक्स अट्रिब्यूट स्लॉट्स का दुरुपयोग कर सकते हैं और कुछ glVertexAttrib (नोट: glVertexAttribPointer नहीं) बना सकते हैं, प्रत्येक कुर्सी को खींचने से पहले कॉल करते हैं, मैट्रिक्स को 4 ऐसे स्लॉट्स का उपयोग करके निर्दिष्ट करते हैं, और ये मान "स्टिक" के लिए "स्टिक" होंगे। कुर्सी में प्रत्येक बाद के शीर्ष। यह कुछ हार्डवेयर पर एक तेज़ पर्याप्त पथ हो सकता है लेकिन दूसरे पर धीमा हो सकता है इसलिए आपको प्रयोग करना होगा।

यदि आपकी कुर्सियां ​​एक और चीज को घुमाती नहीं हैं, तो आप कर सकते हैं बस अपने शेडर को स्थिति भेजें और वहां मक्खी पर एक नया परिवर्तन मैट्रिक्स का निर्माण करें। यह भयानक लगता है, लेकिन यह वास्तव में अविश्वसनीय रूप से तेज है (यह सिर्फ 3 फ्लोट्स सेट कर रहा है) और काम कर सकता है।

हालांकि पूरे पर, और यह मानते हुए कि आप एक विशिष्ट मोबाइल प्लेटफ़ॉर्म के लिए लक्ष्य कर रहे हैं, मैं सोच रहा हूं कि आप जो भी करते हैं, ड्रॉ कॉल आपको मारने जा रहे हैं।


6

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


3

वुल्फेयर गेम्स में फास्ट ऑब्जेक्ट इंस्टेंसिंग के बारे में एक उत्कृष्ट ब्लॉग पोस्ट है । वे जो करते हैं वह मॉडल को कई बार प्रस्तुत करता है, लेकिन एक समान स्लॉट के लिए प्रत्येक ऑब्जेक्ट के लिए एक अलग मैट्रिक्स भेजता है।

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


+1 वैसे भी, मुझे अभी भी यकीन नहीं है कि एनवीडिया पाठ को संदर्भित करना मोबाइल पीवीआर चिप्स पर भी लागू है। विशेष रूप से ड्राइवर भाग के बारे में उनके उल्लेख के बारे में । http.download.nvidia.com/developer/SDK/Indateral_Samples/DEMOS/…
Eonil

1

http://www.youtube.com/watch?v=rfQ8rKGTVlg

यह WebGL पर एक Google टॉक है, जो जावास्क्रिप्ट के लिए OpenGL ES है, जिसका अर्थ है कि कोई ज्यामिति या तो नहीं है। यह आपको एक विचार दे सकता है, हालांकि यह बताना मुश्किल है क्योंकि मुझे नहीं पता कि आपकी अड़चन GPU या CPU पर है या नहीं।

हालांकि, आपको एक समान चर के बारे में सीखना चाहिए, एक विशेषता में एक मैट 4 भेजने की बिल्कुल आवश्यकता नहीं है, आपकी कुर्सी के सभी कोने एक ही मैट्रिक्स द्वारा बदल दिए जाएंगे, आपको इसे प्रति मॉडल केवल एक बार भेजना होगा, प्रति त्रिकोण नहीं। यूनिफ़ॉर्म वैरिएबल आपको ऐसा करने देते हैं, वे एक ख़ास तरह के वैरिएबल हैं जिन्हें आप शेडर प्रोग्राम में ही सेट कर सकते हैं।

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