【发布时间】:2016-04-03 07:07:19
【问题描述】:
除非我弄错了,否则“访问冲突读取位置 0x00000000”意味着您正在尝试延迟尚未初始化的指针,这就是为什么我被这个错误难住了。下面粘贴的是我的代码,并带有注释,指出 Visual Studio 调试器告诉我发生错误的位置。它让我感到困惑,因为我传递给函数的参数都不是指针。有什么想法吗?
void Mesh::Render(Shader* shader)
{
glBindVertexArray(m_vao);
glEnableVertexAttribArray(shader->GetAttributeLocation("position"));
glVertexAttribPointer(0, 3, GL_FALSE, GL_FALSE, sizeof(Vertex), 0);
glDrawElements(GL_TRIANGLES, m_size, GL_UNSIGNED_INT, 0); // error here
glDisableVertexAttribArray(shader->GetAttributeLocation("position"));
glBindVertexArray(0);
}
m_size 被声明为非指针整数
如果它有帮助,调试器会将我带到一些不可用的源,因此调试器会在反汇编中指向这一行:
001DFEC7 mov edi,dword ptr [esi]
我不知道组装,所以我不确定这是否有任何帮助。
编辑
如果有人想知道,我正在绑定使用 VAO 所需的元素数组缓冲区。 Mesh 类的其余部分在下面
Mesh::Mesh()
{
glGenVertexArrays(1, &m_vao);
glGenBuffers(1, &m_vbo);
glGenBuffers(1, &m_ibo);
m_size = 0;
}
Mesh::~Mesh()
{
glDeleteVertexArrays(1, &m_vao);
glDeleteBuffers(1, &m_vbo);
glDeleteBuffers(1, &m_ibo);
}
void Mesh::AddVertices(Vertex* vertices, int vertSize, int* indices, int indexSize)
{
m_size = indexSize;
glBindVertexArray(m_vao);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glBufferData(GL_ARRAY_BUFFER, vertSize * sizeof(Vertex), vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexSize * sizeof(int), indices, GL_STATIC_DRAW);
}
【问题讨论】:
-
确定有指针。
this是一个指针,shader是一个指针,glVertexAttribPointer的最后一个参数是一个指针(您已将其设置为零......) -
这里使用的 m_vao 和其他变量都是全局的吗?
-
As mentioned in this question(和其他人),您绑定了一个无效缓冲区,该缓冲区仅在调用
glDrawElements时才被访问。你应该测试你对 OpenGL 函数的所有调用,看看它们中是否有任何失败。其中一个可能已失败,因此您没有有效的缓冲区绑定,但您仍尝试继续渲染。 -
由于您使用的是顶点数组对象 (
m_vao),如果您想使用glDrawElements(和其他基于索引的渲染调用)进行渲染,它必须绑定一个 GL_ELEMENT_ARRAY_BUFFER。虽然您没有显示设置 VAO 的代码,但这可能是问题所在。尝试使用索引绑定和加载元素数组。 -
@ArifBurhan
m_vao和其他变量是 Mesh 类的成员。 @Cornstalks 好吧,我的断点导致我查看glDrawElements并且其他人说我不能使用 0 作为最后一个参数(应该可以正常工作)我更改了它并得到了相同的错误但位置不同,所以我我不知道发生了什么。
标签: c++ pointers visual-c++ access-violation unhandled-exception