我是Open GL的新手,來到這裏清除了我的困惑。我感謝任何幫助!瞭解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定義第一個變量「position」是一個三個座標爲float的頂點。第二個glVertexAttribPointer定義第二個變量「texCoord」,它是一對紋理座標,每個紋理座標都是浮點型座標。所以,如果我的理解到目前爲止是正確的,那麼我假設我們首先需要綁定頂點緩衝區對象,但即使在註釋掉這一行之後,即使在註釋掉這一行之後也不例外。
它仍然有效。我很困惑。它如何知道我們正在討論哪個緩衝區對象,因爲有兩個vbos?
我很感激任何幫助。非常感謝!
沒有兩個VBO。有一個VBO和一個IBO。他們都可以(並且必須)同時保持約束。 – fintelia
那麼這是否意味着如果有兩個VBO,那麼我們需要顯式綁定它,但既然只有一個,那麼默認綁定它? – user3256520
@fintelia:其實沒有。在調用'gl ... Pointer'後,您可以安全地解除綁定VBO,在調用'gl ... Pointer'函數時與VBO綁定的關聯不會丟失。 – datenwolf