2010-12-03 17 views
5

का उपयोग करते समय उल्लंघन का उल्लंघन करें मुझे वर्टेक्स बफर ऑब्जेक्ट का उपयोग करके कुछ ज्यामिति को प्रस्तुत करने में परेशानी है। मैं अंक के एक विमान को आकर्षित करना चाहता हूं, इसलिए मूल रूप से मेरी जगह में प्रत्येक अलग स्थिति में एक कशेरुका। हालांकि, मैं उस विमान को प्रस्तुत नहीं कर सकता, क्योंकि हर बार जब मैं glDrawElements (...) कहता हूं, तो एप्लिकेशन एक उल्लंघन उल्लंघन अपवाद लौटने पर क्रैश हो जाता है। प्रारंभिक होने पर कुछ गलती होनी चाहिए, मुझे लगता है। इस पृष्ठ पर दूसरे उदाहरण मेंओपनजीएल 3.x: वर्टेक्स बफर ऑब्जेक्ट और glDrawElements (...)


#define SPACE_X 512 
#define SPACE_Z 512 

typedef struct{ 
    GLfloat x, y, z; // position 
    GLfloat nx, ny, nz; // normals 
    GLfloat r, g, b, a; // colors 
} Vertex; 

typedef struct{ 
    GLuint i; // index 
} Index; 

// create vertex buffer 
GLuint vertexBufferObject; 
glGenBuffers(1, &vertexBufferObject); 

// create index buffer 
GLuint indexBufferObject; 
glGenBuffers(1, &indexBufferObject); 

// determine number of vertices/primitives 
const int numberOfVertices = SPACE_X * SPACE_Z; 
const int numberOfPrimitives = numberOfVertices; // As I'm going to render GL_POINTS, number of primitives is the same as number of vertices 

// create vertex array 
Vertex* vertexArray = new Vertex[numberOfVertices]; 

// create index array 
Index* indexArray = new Index[numberOfPrimitives]; 

// create planes (vertex array) 
// color of the vertices is red for now 
int index = -1; 
for(GLfloat x = -SPACE_X/2; x < SPACE_X/2; x++) { 
    for(GLfloat z = -SPACE_Z/2; z < SPACE_Z/2; z++) { 
     index++; 
     vertexArray[index].x = x; 
     vertexArray[index].y = 0.0f; 
     vertexArray[index].z = z; 
     vertexArray[index].nx = 0.0f; 
     vertexArray[index].ny = 0.0f; 
     vertexArray[index].nz = 1.0f; 
     vertexArray[index].r = 1.0; 
     vertexArray[index].g = 0.0; 
     vertexArray[index].b = 0.0; 
     vertexArray[index].a = 1.0; 
    } 
} 

// bind vertex buffer 
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject); 

// buffer vertex array 
glBufferData(GL_ARRAY_BUFFER, numberOfVertices * sizeof(Vertex), vertexArray, GL_DTREAM_DRAW); 

// bind vertex buffer again 
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject); 

// enable attrib index 0 (positions) 
glEnableVertexAttribArray(0); 

// pass positions in 
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), vertexArray); 

// enable attribute index 1 (normals) 
glEnableVertexAttribArray(1); 

// pass normals in 
glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), &vertexArray[0].nx); 

// enable attribute index 2 (colors) 
glEnableVertexAttribArray(2); 

// pass colors in 
glVertexAttribPointer((GLuint)2, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), &vertexArray[0].r); 

// create index array 
for(GLunit i = 0; i < numberOfPrimitives; i++) { 
    indexArray[i].i = i; 
} 

// bind buffer 
glBindBuffer(GL_ELEMENET_ARRAY_BUFFER, indexBufferObject); 

// buffer indices 
glBufferData(GL_ELEMENET_ARRAY_BUFFER, numberOfPrimitives * sizeof(Index), indexArray, GL_STREAM_DRAW); 

// bind buffer again 
glBindBuffer(GL_ELEMENET_ARRAY_BUFFER, indexBufferObject); 

// AND HERE IT CRASHES! 
// draw plane of GL_POINTS 
glDrawElements(GL_POINTS, numberOfPrimitives, GL_UNSIGNED_INT, indexArray); 

// bind default buffers 
glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

// delete vertex/index buffers 
glDeleteBuffers(1, &vertexBufferObject); 
glDeleteBuffers(1, &indexBufferObject); 

delete[] vertexArray; 
vertexArray = NULL; 

delete[] indexArray; 
indexArray = NULL; 
+0

कृपया हमेशा यह बताएं कि आप किस ओपनजीएल को लक्षित कर रहे हैं - 3.x थोड़ा अस्पष्ट है। बीटीडब्ल्यू- किसी भी 'glVertexAttribPointer' या' glEnableVertexAttribArray' से पहले एक कशेरुक सरणी वस्तु बनाने और बांधने का अच्छा अभ्यास है। आप शायद ओपनजीएल संगतता प्रोफ़ाइल का उपयोग कर रहे हैं, इसलिए आपको इसकी वजह से कोई त्रुटि नहीं मिली है। – Kos

+0

पर्याप्त मेला। मुझे लगता है कि 3.x थोड़ा अस्पष्ट है। मुझे लगा कि जीएल के मामूली संस्करणों के बीच भी बड़ा अंतर है। तो, वर्तमान में मैं ओपनजीएल 3.3 का उपयोग कर रहा हूं। – Walter

उत्तर

0

देखो और आप क्या किया की तुलना: http://www.opengl.org/wiki/VBO_-_just_examples

और तुम एक टाइपो है:

यह वही है मैं अब तक किया है GL_DTREAM_DRAW ।

+0

ऐसा लगता है जैसे मैंने पेड़ों के लिए लकड़ी नहीं देखी थी। मैं उस पृष्ठ को जानता था, लेकिन किसी कारण से मैंने इस तथ्य की निगरानी की थी कि "glEnableClientState (...)" को बहिष्कृत किया गया है! यह थोड़ी शर्मनाक है। आपको परेशान किया उसके लिए क्षमा करें। – Walter

+0

क्या यह एकमात्र समस्या थी? क्या आपका कोड ठीक से काम कर रहा है? – Bojan

+0

अच्छा, यह कुछ हद तक काम करता है। मुझे अब कुछ और समस्याएं हैं। GlEnableClientState (...) से छुटकारा पाने के बाद, मैं वास्तव में पहली बार एप्लिकेशन चलाने में सक्षम था। हालांकि, यह कुछ समय के बाद दुर्घटनाग्रस्त होने के बाद से काम नहीं करता है। इसलिए, मैं यह समझने की कोशिश करता हूं कि वास्तव में दुर्घटना का कारण क्या है। अगर मैं वर्टेक्स बफर ऑब्जेक्ट और उसके शिखर के चित्रण को छोड़ देता हूं, तो एप्लिकेशन अच्छी गति से ठीक काम करता है। लेकिन जैसे ही मैं उपरोक्त कोड जोड़ता हूं, इसमें शायद 15 सेकंड लगते हैं और एप्लिकेशन क्रैश हो जाता है। – Walter

0

विधि glEnableClientState (...) को बहिष्कृत किया गया है! क्षमा करें, किसी कारण से मैंने उस तथ्य की निगरानी की थी।

+1

glEnableClientState न केवल बहिष्कृत है, बल्कि यहां गलत है- याद रखें कि आप एक वीबीओ में चरम पर इंगित करना चाहते हैं (इसलिए GPU की स्मृति पर, क्लाइंट की स्मृति नहीं)। यदि यह वीबीओ में है तो अब ग्राहक स्थिति नहीं है। :) – Kos

6

जब आप बफर ऑब्जेक्ट्स का उपयोग कर रहे हैं, gl * पॉइंटर और gldrawElements में चौथा पैरामीटर में अंतिम पैरामीटर अब मुख्य मेमोरी (आपका अभी भी हैं!) में पते नहीं हैं, लेकिन बफर ऑब्जेक्ट्स में ऑफ़सेट हैं। इन ऑफसेट्स को बाइट्स में गणना करना सुनिश्चित करें! "ऑफ़सेट" मैक्रो वहां बहुत उपयोगी है।

+0

यह सही है - यदि कोई भी VBO 'GL_ELEMENT_ARRAY_BUFFER' से जुड़ा हुआ है, तो अंतिम तर्क आधार को संबोधित करने के रूप में बफर की सापेक्ष स्थिति का उपयोग करता है। मान '0' का अर्थ है" वर्तमान में बाध्य वीबीओ की शुरुआत "। ऑपरेटर 'ऑफ़सेट 'वास्तव में आपकी मदद करेगा। – Kos

+0

यह एक दिलचस्प बात है। तो अगर मैं इसे सही समझता हूं, तो रंगों के लिए इसे इस तरह दिखना चाहिए: glVertexAttribPoint (1, 4, GL_FLOAT, GL_FALSE, sizeof (Vertex), (GLvoid *) (ऑफ़सेट (Vertex, r)); क्या यह सही है? – Walter

+0

आप सही हैं! यह मेरी समस्या का समाधान है! यह केवल तथ्य ही नहीं था कि मैंने गलत तरीके से glEnableClientState (...) का उपयोग किया, लेकिन मैंने आपके द्वारा वर्णित पैरामीटर को भी गलत समझा। उस संकेत के लिए धन्यवाद। मेरा आवेदन अब ठीक काम करता है ... – Walter