很简单,我的问题是这个。我的代码如下所示,用于在OpenGL中跟踪和处理顶点缓冲区对象的C ++头文件。为了符合核心标准,它必须使用顶点数组(VAO)。由于调用了glGenVertexArrays()
和其他相关方法,这种渲染方法是否仍然存储在GPU或RAM中的信息?
class VertexBuffer
{
private:
int vertCount;
GLuint vertArray;
GLuint vertBuffer;
public:
VertexBuffer();
void renderInterleaved();
void createInterleaved(GLfloat*, int);
void destroy();
GLuint* getVboId();
};
VertexBuffer::VertexBuffer()
{
glGenVertexArrays(1, &vertArray);
glGenBuffers(1, &vertBuffer);
}
void VertexBuffer::renderInterleaved()
{
glBindVertexArray(vertArray);
glBindBuffer(GL_ARRAY_BUFFER, vertBuffer);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
int stride = 7 * sizeof(GLfloat);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, stride, (void*) 0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, stride, (void*)(3 * sizeof(GLfloat)));
glDrawArrays(GL_TRIANGLES, 0, vertCount);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
void VertexBuffer::createInterleaved(GLfloat* data, int vertices)
{
vertCount = vertices;
glBindBuffer(GL_ARRAY_BUFFER, vertBuffer);
glBufferData(GL_ARRAY_BUFFER, vertices * 21 * sizeof(GLfloat), data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
void VertexBuffer::destroy()
{
glDeleteBuffers(1, &vertBuffer);
glDeleteVertexArrays(1, &vertArray);
}
GLuint* VertexBuffer::getVboId()
{
return &vertBuffer;
}
答案 0 :(得分:4)
术语"顶点缓冲对象"是,并且一直是一个用词不当,由引入缓冲区对象的扩展的不幸命名创建。
没有"顶点缓冲区对象。"只有buffer object,表示OpenGL管理的内存的线性数组。缓冲区对象可以用于存储顶点数据以进行渲染操作,但是没有任何关于任何特定缓冲区对象的内在可以让它做到这一点。这只是你如何使用它的问题。
如果您的对象封装了您将用于glVertexAttribPointer
的参数,那么它不会仅封装缓冲区对象。缓冲区对象不知道如何呈现自身或它包含哪些数据;它只是一个缓冲区。它所代表的最接近的OpenGL概念是一个顶点数组对象。
但是你的代码也没有真正使用VAO。每次拨打renderInterleaved
时,您都会设置已作为VAO的一部分存储的状态。所有这些glVertexAttribPointer
和glEnableVertexAttribArray
来电都会记录到VAO中。这是你应该设置一次的东西,然后再绑定VAO并用它渲染。所以,是的,它是效率较低的VAO。
但是你的类封装了更多而不是VAO。它知道如何渲染自己。所以你班上最好的名字是" mesh"或者那种效果。