2014-07-21 9 views
5

मैं ओपन जीएल में एक नौसिखिया हूं और मेरे पास एक भ्रम को दूर करने के लिए यहां आया था। मैं किसी भी मदद की सराहना करता हूं!glvertexAttribPointer समझ रहा है?

private int vbo; 
private int ibo; 

vbo = glGenBuffers(); 
ibo = glGenBuffers(); 

glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, Util.createFlippedBuffer(vertices), GL_STATIC_DRAW); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, Util.createFlippedBuffer(indices), GL_STATIC_DRAW); 




glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 
//glEnableVertexAttribArray(2); 

//glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glVertexAttribPointer(0, 3, GL_FLOAT, false, Vertex.SIZE * 4, 0); 
glVertexAttribPointer(1, 2, GL_FLOAT, false, Vertex.SIZE * 4, 12); 
//glVertexAttribPointer(2, 3, GL_FLOAT, false, Vertex.SIZE * 4, 20); 

//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
glDrawElements(GL_TRIANGLES, size, GL_UNSIGNED_INT, 0); 

glDisableVertexAttribArray(0); 
glDisableVertexAttribArray(1); 
//glDisableVertexAttribArray(2); 

शिखर शेडर कोड लग रहा है

#version 330 

layout (location = 0) in vec3 position; 
layout (location = 1) in vec2 texCoord; 

out vec2 texCoord0; 

uniform mat4 transform; 

void main() 
{ 
    gl_Position = transform * vec4(position, 1.0); 
    texCoord0 = texCoord; 
} 

तो, यहाँ मेरी समझ है की तरह। GlVertexAttribPointer का उद्देश्य वर्टेक्स बफर ऑब्जेक्ट में डेटा के प्रारूप को परिभाषित करना है। तो, vbo में यह डेटा के रूप में इस प्रकार है

buffer.put(vertices[i].getPos().getX()); 
buffer.put(vertices[i].getPos().getY()); 
buffer.put(vertices[i].getPos().getZ()); 
buffer.put(vertices[i].getTexCoord().getX()); 
buffer.put(vertices[i].getTexCoord().getY()); 
buffer.put(vertices[i].getNormal().getX()); 
buffer.put(vertices[i].getNormal().getY()); 
buffer.put(vertices[i].getNormal().getZ()); 

तो, हम दो glVertexAttribPointer लाइनों है क्योंकि हम दो चर शिखर शेडर में परिभाषित किया गया है संग्रहीत करता है। तो मूल रूप से हम परिभाषित कर रहे हैं कि ये दो चर क्या इंगित करते हैं। तो, पहला glVertexAttribPointer परिभाषित करता है कि पहली चर "स्थिति" एक चरम है जिसमें तीन समन्वय प्रत्येक फ्लोट होते हैं। दूसरा glVertexAttribPointer दूसरे चर "texCoord" को परिभाषित करता है जो बनावट की एक जोड़ी है जो प्रत्येक फ्लोट होता है। इसलिए, अगर मेरी समझ अब तक सही है तो मुझे लगता है कि हमें सबसे पहले वर्टेक्स बफर ऑब्जेक्ट को बांधने की आवश्यकता है, लेकिन इस लाइन को

glBindBuffer (GL_ARRAY_BUFFER, vbo);

यह अभी भी काम करता है। मैं उलझन में हूं। यह कैसे पता चलता है कि हम किस बफर ऑब्जेक्ट के बारे में बात कर रहे हैं क्योंकि दो vbos हैं?

मैं किसी भी मदद की सराहना करता हूं। आपका बहुत बहुत धन्यवाद!

+1

वहाँ दो VBOs नहीं हैं। एक वीबीओ और एक आईबीओ है। वे दोनों एक ही समय में (और जरूरी) बंधे रह सकते हैं। – fintelia

+0

तो इसका मतलब यह है कि यदि दो वीबीओ थे तो हमें इसे स्पष्ट रूप से बांधना होगा, लेकिन चूंकि केवल एक ही है तो यह डिफ़ॉल्ट रूप से बाध्य होता है? – user3256520

+2

@ फिंटेलिया: वास्तव में नहीं। 'Gl ... पॉइंटर' पर कॉल करने के बाद आप सुरक्षित रूप से एक वीबीओ को अनबिंड कर सकते हैं, 'ग्लो ... कॉलर' फ़ंक्शन के कॉल के समय बाउंड वाले वीबीओ के साथ संबंध खो नहीं जाता है। संक्षेप में – datenwolf

उत्तर

14

@ डेटनवॉल्फ पहले से ही एक टिप्पणी में मुख्य पहलू को कवर किया गया है। कुछ और विस्तार से बता दें:

आप ऐसा नहींglDrawElements() कॉल करने से पहले फिर से GL_ARRAY_BUFFER बाध्य करने के लिए है। क्या मायने रखता है कि जब आप glVertexAttribPointer() उस विशेषता के लिए कॉल करते हैं तो उस बफर को आप किसी दिए गए गुण को स्रोत करना चाहते हैं।

इस तस्वीर के लिए सबसे अच्छा तरीका यह है कि जब आप इस फोन करना:

glVertexAttribPointer(0, 3, GL_FLOAT, false, Vertex.SIZE * 4, 0); 

आप सभी राज्य ओपन बता जहां (पहला तर्क) से विशेषता 0 के लिए डेटा प्राप्त करने के लिए आवश्यक निर्दिष्ट कर रहे हैं, और इसे कैसे पढ़ा जाए। है कि राज्य के अधिकांश सीधे तर्कों द्वारा दिया जाता है:

  • यह 3 घटक हैं
  • घटकों नाव को महत्व देता
  • कोने 20 बाइट के एक कदम के साथ पढ़ा जाता है ...
  • ... और बफर

की बाइट 0 पर शुरू लेकिन जब आप कॉल करने के राज्य के एक अतिरिक्त गर्भित टुकड़ा है कि है भी विशेषता 0 के लिए दूर संग्रहीत नहीं है:

  • डेटा बफर वर्तमान में GL_ARRAY_BUFFER

करने के लिए बाध्य दूसरे शब्दों में से पढ़ी जाती है, राज्य प्रत्येक विशेषता के साथ जुड़े के बफर विशेषता डेटा से ली जाती है आईडी भी शामिल है। यह एकाधिक/सभी विशेषताओं के लिए एक ही बफर हो सकता है, या यह प्रत्येक विशेषता के लिए एक अलग बफर हो सकता है।

नोट है कि एक ही GL_ELEMENT_ARRAY_BUFFER के लिए सही नहीं है। यही कारण है कि एक glDrawElements() कॉल के समय के लिए बाध्य किया जाना चाहिए। हालांकि यह कुछ हद तक असंगत लगता है, यह आवश्यक सूचकांक सरणी के लिए glVertexAttribPointer() करने के लिए कोई बराबर है, क्योंकि वहाँ है। एपीआई को इस प्रकार की कॉल करने के लिए परिभाषित किया जा सकता था, लेकिन ... यह नहीं था। कारण सबसे अधिक संभावना है कि यह बस आवश्यक नहीं था, के बाद से केवल एक सूचकांक सरणी एक ड्रॉ कॉल के लिए इस्तेमाल किया जा सकता है, जबकि कई शीर्ष बफ़र्स इस्तेमाल किया जा सकता है।

+0

मैं पहले से ही इन दोनों बफ़र्स .. glBindBuffer (GL_ARRAY_BUFFER, vbo) आबद्ध है; glbindBuffer (GL_ELEMENT_ARRAY_BUFFER, ibo); इसलिए मुझे पुनर्जीवित करने की ज़रूरत नहीं है .. सही? – user3256520

+0

निश्चित रूप से, आपको पहले से बाध्य बफर को पुनर्निर्मित करने की आवश्यकता नहीं है। जो मैं अपने जवाब में कवर करने की कोशिश कर रहा था वह था कि कौन से बफर को कॉल करने के लिए बाध्य होना पड़ता है। –

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