मैं ओपन जीएल में एक नौसिखिया हूं और मेरे पास एक भ्रम को दूर करने के लिए यहां आया था। मैं किसी भी मदद की सराहना करता हूं!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 हैं?
मैं किसी भी मदद की सराहना करता हूं। आपका बहुत बहुत धन्यवाद!
वहाँ दो VBOs नहीं हैं। एक वीबीओ और एक आईबीओ है। वे दोनों एक ही समय में (और जरूरी) बंधे रह सकते हैं। – fintelia
तो इसका मतलब यह है कि यदि दो वीबीओ थे तो हमें इसे स्पष्ट रूप से बांधना होगा, लेकिन चूंकि केवल एक ही है तो यह डिफ़ॉल्ट रूप से बाध्य होता है? – user3256520
@ फिंटेलिया: वास्तव में नहीं। 'Gl ... पॉइंटर' पर कॉल करने के बाद आप सुरक्षित रूप से एक वीबीओ को अनबिंड कर सकते हैं, 'ग्लो ... कॉलर' फ़ंक्शन के कॉल के समय बाउंड वाले वीबीओ के साथ संबंध खो नहीं जाता है। संक्षेप में – datenwolf