代码之家  ›  专栏  ›  技术社区  ›  Jonas Byström

GLdrawElements闪烁并崩溃

  •  0
  • Jonas Byström  · 技术社区  · 15 年前

    使用gldrawElements()时,出现了可疑错误。我尝试渲染简单的原语(主要是矩形),以加快文本绘制等速度,但当我调用gldrawElements()时,一帧左右的整个屏幕都会闪烁黑色(不只是窗口区域)。下一帧将恢复为与以前相同的“窗口颜色”。所以它闪烁了几秒钟,最后在一个信息框里说

    The NVIDIA OpenGL Driver encountered an unrecoverable error
    and must close this application.
    
    Error 12
    

    在调用gldrawElements()之前,有没有需要重置的gl设置?我知道它不是一个悬空的glenableclientState(),我检查了它(我以前有一个,但后来gldrawElements()崩溃了)。

    想想看,它几乎像是一个后缓冲区错误…有什么建议吗?

    2 回复  |  直到 15 年前
        1
  •  5
  •   elmattic    15 年前

    显然,您正在混合vbo模式和va模式。这是完全可能的,但必须小心使用。

    当你打电话:

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    

    这意味着下次你用 glDrawElements(..., ..., ..., x) ,它将使用x作为索引数据上的指针,以及对顶点数据上的glvertexpointer点的最后一次调用。

    如果你 不要 取消绑定当前的vbo和ibo(使用上面的两个glbindbuffer调用),这意味着当使用相同的gldrawElements呈现时,x将用作索引数据的偏移量。 在I博 ,最后一次调用glvertexpointer作为顶点数据的偏移量 在vbo中 .

    根据x和glvertexpointer的值,可以使驱动程序崩溃,因为偏移量超出界限和/或基础数据的类型错误(nan)。

    因此,为了回答您的问题,在使用vbo模式绘制之后,然后使用va模式绘制:

    1. 解除绑定当前vbo
    2. 解除当前IBO的绑定
    3. 指定右顶点地址 glVertexPointer
    4. 指定正确的索引地址 glDrawElements

    然后一切都会好起来的。

        2
  •  0
  •   Jonas Byström    15 年前

    呸!找到它了。当我做到了

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    

    在渲染之前,闪烁+崩溃停止。这是预期的行为吗?抱歉浪费时间和空间。