【问题标题】:drawing multiple items with opengl (modern)用opengl(现代)绘制多个项目
【发布时间】:2018-08-27 10:53:17
【问题描述】:

QtOpenGLWidget drawing triangle 的后续问题

我想画一个三角形和一些线,我写了这段代码(在 stackoverflow 社区的人的帮助下)它画了三角形和线。但是,当我想同时绘制三角形和线条时,我看不到线条。

  GLfloat vertices[] = { 0.0f, 0.707f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f };
 GLfloat colors[] = { 1.f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f};
 shader->setAttributeArray(posAttribute, vertices, 3, 0);
 shader->setAttributeArray(colAttribute, colors, 3, 0);
 glEnableVertexAttribArray(posAttribute);
 glEnableVertexAttribArray(colAttribute);
 glDrawArrays(GL_TRIANGLES, 0, 3);
 glDisableVertexAttribArray(posAttribute);
 glDisableVertexAttribArray(colAttribute);

 GLfloat lvertices[] = { 0.907f, 0.907f, 0.5f, -0.957f, -0.957f, 0.5f };
 GLfloat lcolors[] =   { 1.0f,    0.0f, 0.0f,    1.0f,    .0f , 0.0f};
 shader->setAttributeArray(posAttribute, lvertices, 3, 0);
 shader->setAttributeArray(colAttribute, lcolors, 3, 0);
 //glLineWidth(.03f);
 glDrawArrays(GL_LINE_STRIP, 0, 6);
 glDisableVertexAttribArray(posAttribute);
 glDisableVertexAttribArray(colAttribute);

我做错了什么?

【问题讨论】:

    标签: qt opengl qt5


    【解决方案1】:

    绘制多边形后,禁用顶点属性 (glDisableVertexAttribArray),但在绘制线条之前,您不会再次启用它们。

    在绘制多边形后跳过禁用顶点属性来解决问题。


    此外,默认深度函数 (glDepthFunc) 是 GL_LESS。如果启用了深度测试,则丢弃片段,如果之前在相同位置绘制片段,其深度(z 坐标)小于或等于,则新片段的深度。这意味着该片段被前一个片段覆盖。

    如果您希望线条始终绘制在多边形之上,那么您必须在绘制线条之前禁用深度测试。

    // clear color buffer and depth buffer
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    // enable the depth test
    glEnable(GL_DEPTH_TEST);
    
    // enable vertex attributes
    glEnableVertexAttribArray(posAttribute);
    glEnableVertexAttribArray(colAttribute);
    
    // draw the polygons
    GLfloat vertices[] = { 0.0f, 0.707f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f };
    GLfloat colors[] = { 1.f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f};
    shader->setAttributeArray(posAttribute, vertices, 3, 0);
    shader->setAttributeArray(colAttribute, colors, 3, 0);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    
    // disable the depth test
    glDisable(GL_DEPTH_TEST);
    
    // draw the lines
    GLfloat lvertices[] = { 0.907f, 0.907f, 0.5f, -0.957f, -0.957f, 0.5f };
    GLfloat lcolors[] =   { 1.0f,    0.0f, 0.0f,    1.0f,    .0f , 0.0f};
    shader->setAttributeArray(posAttribute, lvertices, 3, 0);
    shader->setAttributeArray(colAttribute, lcolors, 3, 0);
    glDrawArrays(GL_LINE_STRIP, 0, 6);
    
    // disable vertex attributes
    glDisableVertexAttribArray(posAttribute);
    glDisableVertexAttribArray(colAttribute);
    

    【讨论】:

    • @RingZero,如果这对你有用并且你喜欢这个答案,请考虑支持它。拨打tour 了解投票的重要性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多