2011-08-12 15 views
5

मैं अपने आवेदन की गति को बढ़ाने के लिए वीबीओ को अपने वर्टेक्स सरणी कार्यों में स्थानांतरित कर रहा हूं।वर्टिस प्रस्तुत करने के लिए वीबीओ का उपयोग करने में समस्याएं - ओपनजीएल

यहाँ अपने मूल काम कर रहे शिखर सरणी प्रतिपादन फ़ंक्शन था:

void BSP::render() 
{ 
    glFrontFace(GL_CCW); 

    // Set up rendering states 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &vertices[0].x); 

    glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &vertices[0].u); 

    // Draw 
    glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, indices); 

    // End of rendering - disable states 
    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
} 

महान काम किया!

अब मैं उन्हें वीबीओ में ले जा रहा हूं और मेरे कार्यक्रम ने वास्तव में मेरे ग्राफिक्स कार्ड को जवाब देना बंद कर दिया है। मेरे शिखर और सूचकांक पर सेटअप बिल्कुल वही हैं।

नए सेटअप:

vboId तो जैसे bsp.h में सेटअप है: GLuint vboId [2];

मुझे कोई त्रुटि नहीं मिलती है जब मैं केवल createVBO() फ़ंक्शन चलाता हूं!

void BSP::createVBO() 
{ 

    // Generate buffers 
    glGenBuffers(2, vboId); 

    // Bind the first buffer (vertices) 
    glBindBuffer(GL_ARRAY_BUFFER, vboId[0]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

    // Now save indices data in buffer 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId[1]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 

} 

और VBOS के लिए प्रतिपादन कोड। मुझे पूरा यकीन है कि यह यहां है। बस वर्टिक्स सरणी में किए गए वीबीओ में क्या प्रस्तुत करना चाहते हैं।

प्रस्तुत:

void BSP::renderVBO() 
{ 
    glBindBuffer(GL_ARRAY_BUFFER, vboId[0]);   // for vertex coordinates 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId[1]); // for indices 

    // do same as vertex array except pointer 
    glEnableClientState(GL_VERTEX_ARRAY);    // activate vertex coords array 
    glVertexPointer(3, GL_FLOAT, 0, 0);    // last param is offset, not ptr 

    // draw the bsp area 
    glDrawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0)); 

    glDisableClientState(GL_VERTEX_ARRAY);   // deactivate vertex array 

    // bind with 0, so, switch back to normal pointer operation 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 
} 

सुनिश्चित नहीं हैं कि क्या त्रुटि है, लेकिन मैं यकीन है कि मैं अपने प्रतिपादन समारोह गलत है हूँ। इच्छा है कि इस पर एक और एकीकृत ट्यूटोरियल था क्योंकि ऑनलाइन एक गुच्छा है लेकिन वे अक्सर एक-दूसरे से विरोधाभास कर रहे हैं।

+1

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

+0

@ क्रिस्टियन राउ मैंने तब तक इसे छोड़ दिया जब तक कि मुझे वर्टेक्स सरणी की बेहतर समझ न हो। तब मैं वीबीओ के लिए जाऊंगा क्योंकि मुझे लगता है कि वे समान हैं। धन्यवाद! –

उत्तर

0

यदि आप वीडीओ का उपयोग नहीं कर रहे हैं और वीबीओ बफर के लिए एक ही डेटा का उपयोग नहीं करते हैं तो आप glDrawElements पर एक ही डेटा गुजर रहे हैं। फिर पैरामीटर थोड़ा अलग है, एफबीओ के बिना आपने GL_UNSIGNED_SHORT और एफबीओ के साथ GL_UNSIGNED_BYTE का उपयोग किया है। तो मुझे लगता है कि VBO कॉल कि तरह दिखना चाहिए:

glDrawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_SHORT, 0); 

इसके अलावा this tutorial को देखो, वहाँ VBO बफ़र्स बहुत अच्छी तरह से समझाया जा सकता है।

+0

अभी भी मेरे ग्राफिक्स ड्राइवर को उत्तरदायी बनने का कारण बनता है। और संपूर्ण BUFFER_OFFSET (0) कई ट्यूटोरियल में शामिल है। फिर भी धन्यवाद! –

+0

क्या आप ग्लो फ़ंक्शंस में पास होने वाले प्रत्येक चर के लिए घोषणाएं भी पोस्ट कर सकते हैं? – kravemir

2
अलावा क्या Miro कहा ( GL_UNSIGNED_BYTE GL_UNSIGNED_SHORT होना चाहिए), मुझे नहीं लगता कि आप अपने गैर-VBO कॉल में numVertices लेकिन numIndices, की तरह उपयोग करना चाहते हैं में

glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, 0); 

अन्यथा आपका कोड काफी मान्य दिखता है और यदि यह आपकी समस्या को ठीक नहीं करता है, तो शायद त्रुटि कहीं और है।

और जिस तरह से BUFFER_OFFSET(i) बात usuaully है सिर्फ एक ((char*)0+(i)) के लिए परिभाषित है, तो आप भी सिर्फ बाइट सीधे ऑफसेट में पारित कर सकते हैं, खासकर जब यह 0.

संपादित है द्वारा: बस एक और एक देखा। यदि आप गैर-वीबीओ संस्करण (जिसे मैंने ऊपर माना है) के लिए उपयोग की जाने वाली सटीक डेटा संरचनाओं का उपयोग करते हैं, तो आपको glVertexPointer में चरण पैरामीटर के रूप में sizeof(Vertex) का उपयोग करने की आवश्यकता है।

0

आप शिखर और सूचकांक कैसे घोषित करते हैं?

glBufferData के लिए आकार पैरामीटर बाइट में बफर के आकार के होने चाहिए और यदि आप sizeof (कोने) पास यह घोषित सरणी का कुल आकार वापस आ जाएगी (न केवल क्या आवंटित किया जाता है)।

sizeof (वर्टेक्स) की तरह कुछ की कोशिश करो * numVertices और sizeof (सूचकांक [0]) * numIndices बजाय।

+1

मान लीजिए कि वह सरणी (गतिशील रूप से आवंटित भंडारण की बजाय) का उपयोग करता है, 'आकार (शिखर) 'पूरी तरह से मान्य होना चाहिए। Othwerise यह निश्चित रूप से एक समस्या है। –