2012-03-28 11 views
5

आइए कहें कि मेरे पास 2 प्रजातियां हैं जैसे मनुष्य और टट्टू। उनके पास अलग कंकाल प्रणाली हैं इसलिए प्रत्येक प्रजाति के लिए एक समान हड्डी सरणी अलग होनी चाहिए। क्या मुझे दो अलग-अलग शेडर प्रोग्रामों को लागू करने में सक्षम है जो प्रत्येक हड्डी सरणी को सही ढंग से प्रस्तुत करने में सक्षम हैं या क्या गतिशील सरणी को गतिशील रूप से घोषित करने का तरीका है और इसके बजाय उस गतिशील सरणी के माध्यम से पुनरावृत्ति करना है?(ओपनजीएल 3.1 - 4.2) गतिशील वर्दी सरणी?

दिमागी प्रदर्शन को ध्यान में रखते हुए (सभी शेडर्स निर्णय शाखा में घूमते हैं)।

उत्तर

12

ओपनजीएल 4.3 तक, जीएलएसएल में सरणी एक निश्चित, संकलन-समय आकार का होना था। 4.3 शेडर स्टोरेज बफर ऑब्जेक्ट्स के उपयोग की अनुमति देता है, जो उनकी अंतिम लंबाई को "असंबद्ध" होने की अनुमति देता है। मूल रूप से, आप यह कर सकते हैं:

buffer BlockName 
{ 
    mat4 manyManyMatrices[]; 
}; 

ओपन यह पता लगाने जाएगा कि कितने मैट्रिक्स कार्यावधि में इस सरणी में कैसे आप glBindBufferRange का उपयोग के आधार पर कर रहे हैं। तो आप लंबाई प्राप्त करने के लिए अभी भी manyManyMatrices.length() का उपयोग कर सकते हैं, लेकिन यह संकलन-समय स्थिर नहीं होगा।

हालांकि, यह सुविधा (इस संपादन के समय) बहुत नई है और केवल बीटा में लागू की गई है। इसके लिए जीएल 4.x-class हार्डवेयर (उर्फ: डायरेक्ट 3 डी 11-क्लास हार्डवेयर) भी आवश्यक है। अंत में, चूंकि यह शेडर स्टोरेज ब्लॉक का उपयोग करता है, इसलिए डेटा तक पहुंच धीमी हो सकती है, जिसके लिए उम्मीद हो सकती है।

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

10

आप एन-बाय-1-बनावट का उपयोग सरणी के प्रतिस्थापन के रूप में कर सकते हैं। बनावट आकार को रन-टाइम पर निर्दिष्ट किया जा सकता है। मैं अपने शेडरों को मनमाने ढंग से रोशनी की गुजरने के लिए इस दृष्टिकोण का उपयोग करता हूं। मुझे आश्चर्य है कि कई लूप और शाखाओं के बावजूद यह कितनी तेजी से चलता है। उदाहरण के लिए jgeality स्रोतों में jogl3.glsl.nontransp में polygon.f shader फ़ाइल देखें।

uniform sampler2D sys_globalLights; 
uniform int sys_numGlobalDirLights; 
uniform int sys_numGlobalPointLights; 
uniform int sys_numGlobalSpotLights; 

...

int lightTexSize = sys_numGlobalDirLights*3+sys_numGlobalPointLights*3+sys_numGlobalSpotLights*5; 

    for(int i = 0; i < numDir; i++){ 
     vec4 dir = texture(sys_globalLights, vec2((3*i+1+0.5)/lightTexSize, 0)); 

...

संबंधित मुद्दे