我最近一直在使用glsl着色器,并刚开始使用花哨的新曲面细分阶段。
它完美地工作了一段时间然后突然间,砰,它失败了。
每当我使用原始参数等运行它时,它会中断,
glDrawElements(GL_PATCHES, numIndicies, GL_UNSIGNED_INT, 0)
,访问冲突位于0x00000054。
我已经梳理了我的代码,从我所看到的,一切都检查出来。
但事情就是这样,当我将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
答案 0 :(得分:0)
我已经看到glDrawElements在未正确设置VAO之前执行此操作。您的初始化代码看起来是正确的,但问题可能是您没有在函数结束时解除绑定您的VAO。这意味着对glBindBuffer等的任何后续调用都可以改变VAO状态。尝试在CreateIcosahedron()结束时取消绑定VAO,看看是否有帮助。
[编辑] 如果您的代码看起来与上面发布的完全相同,那么这可能无济于事。看来你没有取消绑定VAO,但无论如何你在函数返回后立即绑定它。为了帮助您缩小问题范围,您应该知道glDrawElements的行为会根据在调用时是否绑定元素数组缓冲区而发生更改。如果存在数组绑定,则最后一个参数被解释为元素数组中的字节偏移量。否则它被解释为一个指针,我认为这是你的情况。