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”是具有三个坐标的顶点,每个坐标都是浮点数。第二个glVertexAttribPointer定义了第二个变量“texCoord”是一对纹理坐标,每个坐标都是浮点数。所以,如果我到目前为止的理解是正确的,那么我认为我们首先需要绑定顶点缓冲对象,但即使注释掉这一行也可以。glBindBuffer(GL_ARRAY_BUFFER, vbo);
它仍然工作。我感到困惑。由于存在两个VBO,它是如何知道我们正在谈论哪个缓冲对象的呢?
gl...Pointer
函数之后,您可以安全地解绑VBO,与调用该函数时绑定的VBO的关联不会丢失。 - datenwolf