【问题标题】:glDrawElements causes access violation with GL_PATCHES onlyglDrawElements 仅使用 GL_PATCHES 导致访问冲突
【发布时间】:2012-11-21 12:42:59
【问题描述】:

我最近一直在研究 glsl 着色器,并且刚刚开始使用花哨的新曲面细分阶段。 它工作了一段时间,然后突然之间,砰,它失败了。 每当我使用原始参数等运行它时,它就会中断, glDrawElements(GL_PATCHES, numIndicies, GL_UNSIGNED_INT, 0) 在 0x00000054 处存在访问冲突。

我已经梳理了我的代码,并且从我所看到的情况来看,一切都已验证。 但事情是这样的,当我将GL_PATCHES 更改为GL_TRIANGLES 时,它可以完美运行。当然在禁用曲面细分控制和评估着色器之后。 我也尝试过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

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    我之前看到 glDrawElements 在未正确设置 VAO 时会执行此操作。您的初始化代码看起来是正确的,但问题可能是您没有在函数末尾取消绑定您的 VAO。这意味着对 glBindBuffer 等的任何后续调用都可以更改 VAO 状态。尝试在 CreateIcosahedron() 结束时取消绑定 VAO,看看是否有帮助。

    [编辑] 如果您的代码看起来与您在上面发布的完全一样,那么这可能无济于事。似乎您没有取消绑定 VAO,但无论如何在函数返回后立即绑定它。为了帮助您缩小问题范围,您应该知道 glDrawElements 的行为会根据调用时是否绑定元素数组缓冲区而改变。如果存在数组绑定,则最后一个参数被解释为元素数组的字节偏移量。否则它会被解释为一个指针,我认为这就是你的情况。

    【讨论】:

    • 谢谢,我会试一试
    • 完美运行。在函数末尾取消绑定顶点数组修复了所有问题。非常感谢:D 你为我节省了几个小时的头发拉扯时间:p
    • 我来到这里是因为我遇到了同样的 0x00000054 崩溃。原来这是因为我没有将镶嵌控制和评估着色器附加到程序对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多