glDrawElements只会导致与GL_PATCHES的访问冲突

glDrawElements causes access violation with GL_PATCHES only

本文关键字:PATCHES 访问冲突 GL glDrawElements      更新时间:2023-10-16

我最近一直在摆弄glsl着色器,刚刚开始了一个奇特的新镶嵌阶段。它完美地工作了一段时间,然后突然,砰,它失败了。每当我用原始参数运行它时,它就会中断,在0x00000054处具有访问冲突的glDrawElements(GL_PATCHES, numIndicies, GL_UNSIGNED_INT, 0)

我已经梳理了我的代码,从我所看到的来看,一切都很顺利。但问题是,当我将GL_PATCHES更改为GL_TRIANGLES时,它可以完美地工作。当然,在禁用镶嵌控制和eval着色器之后。我也尝试过glDrawArrays,但GL_PATCHES仍然失败,所以我很有信心这与此有关。

目前,我在几何着色器中使用基本的镶嵌,但这很快就会过时。

我运行的是带有ATI Mobility Radeon HD 5650的Windows 7 x64,据我所知,它是最新的驱动程序。它说,如果有帮助的话,异常发生在atioglxx.dll中的某个地方。这是一些代码。

GLuint CreateIcosahedron(vec3, unsigned int&);
void DrawScene(){
static unsigned int numindices = 0;
static GLuint vao = CreateIcosahedron(vec3(0,0,0), vec3(1,2,1), numindices);
glBindVertexArray(vao);
glDrawElements(GL_PATCHES, numindices, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
}
GLuint CreateIcosahedron(vec3 center, unsigned int& numindices){
GLuint vaoID;
GLuint vboID;
GLuint iboID;
const int indices[] = {
// indices omitted for your viewing pleasure
};
const vec3 vertices[] = {
// vertices omitted for your viewing pleasure
};
const GLuint uPosition = 0;
numindices = sizeof(indices)/sizeof(indices[0]);
glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);
glGenBuffers(1, &vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(uPosition, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(uPosition);
glGenBuffers(1, &iboID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
return vaoID;
} 

我做错了什么?:c

我以前见过glDrawElements在VAO设置不正确时会这样做。您的初始化代码看起来是正确的,但问题可能是您没有在函数结束时解除VAO的绑定。这意味着对glBindBuffer等的任何后续调用都可以更改VAO状态。尝试在CreateIcosahedron()结束时解除VAO的绑定,看看这是否有帮助。

[编辑]如果你的代码看起来和你上面发布的一模一样,那么这可能不会有帮助。似乎您没有解除VAO的绑定,但在函数返回后立即进行绑定。为了帮助您缩小问题范围,您应该知道glDrawElements的行为会随着调用时是否有元素数组缓冲区绑定而变化。如果有数组绑定,最后一个参数将被解释为元素数组中的字节偏移量。否则,它被解释为一个指针,我认为这就是你的情况。