使用OpenGL(现代)绘制多个物体

3

关于QtOpenGLWidget绘制三角形的后续问题

我想要绘制一个三角形和一些线段,我写了下面这段代码(在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);

我做错了什么吗?
1个回答

3
在绘制多边形后,您需要禁用顶点属性(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了解为什么投票很重要。 - scopchanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接