我想在对象中创建多个顶点缓冲区(每个对象一个)。构造函数是:
VertexBuffer::VertexBuffer(const GLvoid *data,
GLsizeiptr size,
GLenum mode,
GLsizei count,
GLsizei stride,
ShaderInterface *shaderInterface,
GLvoid *positionOffset,
GLvoid *normalOffset)
: _mode(mode),
_count(count),
_stride(stride),
_shaderInterface(shaderInterface),
_positionOffset(positionOffset),
_normalOffset(normalOffset)
{
glGenBuffers(1, &_vertexBufferID);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferID);
glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
//
GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glEnableVertexAttribArray(0); //??????
glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferID);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
//
}
如果我创建了一个对象VertexBuffer,这个可以正常工作。但是如果我创建了另一个对象(我不会使用它),我再次绘制第一个对象的结果是不正确的(例如,显示的对象在其他地方)。为什么?
1条答案
按热度按时间olhwl3o21#
你似乎没有把
vao
存储在任何地方,但是你应该这样做。在绘制每个对象之前,你应该在调用任何glDraw*
之前把glBindVertexArray
存储在它的vao
(而不是_vertexBufferID
)。另请参见this answer,了解VAO包含的状态。