用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 [关闭]
Modern OpenGL 3.x 及更高版本如何绘制图元?