2010-11-27 10 views
7

अरे। मैं ओपनजीएल ईएस के लिए नया हूं लेकिन मेरे पास सामान्य ओपनजीएल के साथ अनुभव का मेरा हिस्सा है। मुझे बताया गया है कि कैशे मिस से बचने के अनुकूलन के कारण कशेरुक बफर के लिए अंतःस्थापित सरणी का उपयोग करना बहुत तेज है।
मैं एक शीर्ष प्रारूप है कि मुझे लगता है कि लगता है कि यहओपनगल वेरटेक्स विशेषता

 
struct SVertex 
{ 
    float x,y,z; 
    float nx,ny,nz; 
    float tx,ty,tz; 
    float bx,by,bz; 
    float tu1,tv1; 
    float tu2,tv2; 
}; 

तब मैं प्रयोग किया जाता का उपयोग करेगा विकसित किया है "glVertexAttribPointer (सूचकांक, 3, GL_FLOAT, GL_FALSE, कदम, वी)," कशेरुक सरणी को इंगित करने के लिए। इंडेक्स वह विशेषता है जिसमें मैं उपयोग करना चाहता हूं और बाकी सब कुछ ठीक है सिवाय इसके अलावा। यह समीकरण में जोड़ने का फैसला करने से पहले यह काम करता था। मैंने दोनों को आकार (एसवीरटेक्स) के रूप में पारित किया और 13 * 4 की तरह लेकिन उनमें से कोई भी काम नहीं कर रहा है।
यह किसी भी महत्व मैं एक ही तरह के अगले विशेषता को यह

glDrawElements(GL_TRIANGLES,surface->GetIndexCount()/3,GL_UNSIGNED_INT,surface->IndPtr());
ओपन चश्मा में यह है कि कदम विशेषता के अंत से बाइट में आकार (इस मामले z में) होना चाहिए लिखा है की तरह पुरातन आकर्षित किया है (इस मामले में एक्स)। तो मेरी गणना से यह 13 (एनएक्स, एनई, एनजे, टीएक्स, टाई .... tuv2, tv2) बार 4 (एक फ्लोट का आकार) होना चाहिए।
ओह और एक और बात यह है कि प्रदर्शन बस खाली है।
क्या कोई मेरी मदद कर सकता है?
बहुत बहुत धन्यवाद।

+1

मैंने कहा कि 13 मान सोचते हैं कि मुझे पहले 3 को घटाना है (यदि आपके पास सिर्फ एक्स, वाई, जेड है तो 0 है); – Sanctus2099

उत्तर

6

यदि आपके पास ऐसी संरचना है, तो stride केवल sizeof SVertex है और यह प्रत्येक विशेषता के लिए समान है। यहाँ कुछ भी जटिल नहीं है।

यदि यह काम नहीं करता है, तो कहीं और अपनी त्रुटि देखें।

उदाहरण यहाँ के लिए:

surface->GetIndexCount()/3

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

surface->GetIndexCount()

+1

धन्यवाद। यह सूचकांक गिनती थी। यद्यपि यदि आप ओगल चश्मा देखते हैं " गिनती-प्रदान किए जाने वाले तत्वों की संख्या निर्दिष्ट करता है।" – Sanctus2099

+0

मेरा मानना ​​है कि spec का अर्थ है कि एक "तत्व" इस संदर्भ में "vertex" के समान है। रेखाएं, त्रिकोण, quads, बहुभुज, आदि को एक साथ "primitives" के रूप में जाना जाता है। – Kos

+0

असल में दूसरा तर्क ** इंडेक्स की संख्या है, न कि शिखर **। चश्मे के बारे में "तत्व" का अर्थ है * प्राइमेटिव्स टोपोलॉजी मोड * के अनुसार सूचकांक के साथ निर्माण करते हैं। लेकिन दिन के अंत में यह केवल सूचकांक गिनती है। – Stringer

2

तब मैं इस्तेमाल किया "glVertexAttribPointer (सूचकांक, 3, GL_FLOAT, GL_FALSE, कदम, वी)," कशेरुक सरणी को इंगित करने के लिए । सूचकांक विशेषता मैं का उपयोग करना चाहते में से एक है और सब कुछ ठीक कदम

यह texcoord के लिए काम नहीं करता है को छोड़कर है (यदि आप 2 x 2 तैरता या 1x 4 तैरता है)।

कदमों के बारे में, जैसे कोस ने कहा, मुझे लगता है कि आप 16 * sizeof(float) के एक कदम (अपने SVertex का आकार) पास करना चाहिए।

उल्लेख करने के लायक एक और बात भी। आप कहते हैं कि आप प्रदर्शन के लिए अनुकूलित करना चाहते हैं। आप अधिकतम में अपने कशेरुक को संपीड़ित क्यों नहीं करते हैं, और अनावश्यक मानों को दबाते हैं? यह बहुत सारी बैंडविड्थ बचाएगा।

x, y, z ठीक है, लेकिन nx और ny आपके मानक सामान्यीकृत होने पर स्वयं पर्याप्त हैं (जो मामला हो सकता है)। आप वर्टेक्स शेडर nz (निकालने के लिए कि आपके पास शेडर क्षमताएं हैं) में निकालें।एक ही बात tx और ty के लिए लागू होती है। आपको bx, by, bz की आवश्यकता नहीं है क्योंकि आप जानते हैं कि यह normal और tangent का क्रॉस उत्पाद है।

struct SPackedVertex 
{ 
    float x,y,z,w;  //pack all on vector4 
    float nx,ny,tx,ty; 
    float tu1,tv1;tu2,tv2; 
}; 
+1

अनावश्यकता के बारे में यहां कुछ अच्छी टिप्पणियां हैं, लेकिन क्या यह सामान्य पैकिंग परिणाम वास्तव में बेहतर प्रदर्शन में है? लगता है (जीपीयू मेमोरी विलंबता ज्यादातर मामलों में वर्टेक्स प्रोसेसिंग पावर की तुलना में शायद एक कठिन बाधा है), लेकिन क्या बेंचमार्क वास्तव में इसकी पुष्टि करते हैं? – Kos

+2

मुझे नहीं पता, बस अनुमान लगा रहा है। हमेशा की तरह, बेंचमार्क, बेंचमार्क, बेंचमार्क! :) यदि ओपी ओजीएल ईएस का उपयोग कर रहा है, तो उसका कोड शायद हैंडहेल्ड डिवाइस पर चलता है जो डेस्कटॉप जीपीयू (मुझे लगता है) से मेमोरी बैंडविड्थ के मामले में बहुत दूर है, इसलिए यह कोशिश करने लायक हो सकता है .. – Stringer

+2

मुझे यह भी नहीं पता कि यह क्या कर सकता है यहां आवेदन करें, लेकिन वर्टेक्स का आकार प्री-वीएस कैश के लिए भी महत्वपूर्ण है (शायद 32 या 64 बाइट 48 से बेहतर है ..) उस स्थिति में मैं 32 बाइट्स तक और भी संपीड़ित करने की कोशिश करता हूं। यह मानक, टेंगेंट और टेक्साकोर्ड के लिए आधे फ्लोट (GL_OES_vertex_half_float) का उपयोग करके किया जा सकता है: http://developer.amd.com/gpu_assets/GDC06-ATI_Session-Zarge-PerfTools.pdf – Stringer

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