我是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