use*_*520 3 opengl 3d vbo opengl-3
我来这里是为了向专家们澄清一些关于opengl的困惑。我感谢您的帮助!
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);
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);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glDrawElements(GL_TRIANGLES, size, GL_UNSIGNED_INT, 0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
顶点着色器代码如下所示
#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”定义为一对纹理坐标,每个坐标都是浮点数。
现在让我困惑的是我们使用 glVertexAttribPointer 来理解存储在 vbo 到 opengl 中的数据。现在,为什么我们不使用另一个 glVertexAttribPointer 或类似的代码来理解 ibo 中的数据。为什么这个缓冲区对象被单独留下?
我很感激任何帮助。多谢!
原因是,在绘制调用中只能有一个索引缓冲区处于活动状态。索引缓冲区的格式在绘制调用中指定(请参阅glDrawElements,第三个参数)。
您还可以将对 glVertexAttribPointer 的调用视为 vbo 到着色器中 in 变量的绑定。由于索引缓冲区永远不会附加到统一,因此您不必调用 glVertexAttribPointer。