用opengl(现代)绘制多个项目

Posted

技术标签:

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

QtOpenGLWidget drawing triangle 的后续问题

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

  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);

我做错了什么?

【问题讨论】:

【参考方案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 了解投票的重要性。

以上是关于用opengl(现代)绘制多个项目的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正交项目将 3d 渲染图像(透视项目)绘制回另一个视口。同时使用多个视口和 OpenGL [关闭]

在 OpenGL 中绘制多个 2D 纹理

如何在 OpenGL 3.2+ 中渲染多个形状和对象?

Modern OpenGL 3.x 及更高版本如何绘制图元?

如何使用 VBO 和单个 OpenGL drawelements 调用绘制多个对象?

带有 FBO 的 OpenGL 阴影映射 - 多个拖尾绘制