我有一个sprite类来处理初始化精灵并绘制它但我一直收到此错误Exception thrown at 0x68ECC760 (nvoglv32.dll)
这似乎主要是因为_vboID
和_vertNum
我是不完全确定他们有什么问题,这里是它的源代码
void Sprite::init(int vertNum, float r, Shape shape) {
_vertNum = vertNum;
if (_vboID = 0) {
glGenBuffers(1, &_vboID);
}
std::vector<Vertex> vertexData(vertNum);
if (shape == Shape::CIRCLE) {
for (int i = 0; i < vertNum; i++) {
vertexData[i].setPosition(r*cos(i), r*sin(i));
}
}
for (int i = 0; i < _vertNum; i++) {
vertexData[i].setColor(1, 1, 1, 1);
}
glBindBuffer(GL_VERTEX_ARRAY, _vboID);
glBufferData(GL_VERTEX_ARRAY, sizeof(vertexData), vertexData.data(), GL_DYNAMIC_DRAW);
glBindBuffer(GL_VERTEX_ARRAY, 0);
}
void Sprite::draw() {
//bind buffer array
glBindBuffer(GL_VERTEX_ARRAY, _vboID);
//use first vertex attrib array
glEnableVertexAttribArray(0);
//pointer to vertices location
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, position));
//pointer to vertices color
glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, color));
//Draw the 6 vertices to the screen
glDrawArrays(GL_POLYGON, 0, _vertNum);
//Disable the vertex attrib array. This is not optional.
glDisableVertexAttribArray(0);
//Unbind the VBO
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
答案 0 :(得分:0)
GL_VERTEX_ARRAY
不是有效的缓冲区绑定目标。您要找的是GL_ARRAY_BUFFER
。
在期望缓冲区绑定目标的上下文中使用GL_VERTEX_ARRAY
时,应该只会出现GL_INVALID_ENUM
错误,并且调用将不再有效。因此,在GL_ARRAY_BUFFER
调用期间,您没有绑定glVertexAttribPointer
,这在遗留或核心配置文件中将导致GL将您的指针解释为指向客户端内存的指针。
您应该添加一些错误检查,或者使用调试回调,这样就可以及早发现这些简单的错误。