OpenGL:使用退化三角形绘制线

Posted

技术标签:

【中文标题】OpenGL:使用退化三角形绘制线【英文标题】:OpenGL : drawing line using degenerate triangle 【发布时间】:2015-05-14 17:06:54 【问题描述】:

在我的引擎中,我想避免使用线条和单独的三角形类型。我想使用两个顶点相同的三角形来绘制线条。但是在opengl中,这个三角形不会显示,因为它的面积为零,因此不能覆盖一个像素。

在内部,在驱动程序级别,使用退化三角形绘制一条 opengl 线,并使用不同的光栅化规则,每条扫描线至少绘制一个像素。

D3d 有一些选项,您可以将光栅化设置为始终绘制每条扫描线的第一个像素——有效地完成我在 d3d 中想要的。

但是我怎么能用opengl做到这一点呢?我没有看到任何可以让您更改光栅化规则的命令。

【问题讨论】:

可能是 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);但是如果你必须改变线条和多边形的opengl状态,那么不使用GL_LINES的优势在哪里? 你说的 D3d 选项是什么? 我想我也没有听说过 D3D 标志...通常退化三角形在 GL 和 D3D 的顶点设置阶段都会被拒绝(例如,即使顶点着色器也不会被执行,更不用说像素/片段着色器了)。如果您正在渲染三角形条带,禁用退化拒绝会相当奇怪,因为对于任何通用模型数据,通常都有大量退化。你会得到……到处都是线条,我不知道为什么会这样? 我没有确切的标志,也没有它显示的 Directx 版本。d3d 标志设置为模拟线框显示而不使用线条。它将光栅化更改为每扫描线输出 1 个像素,无论它是否覆盖一个像素。这将允许您绘制一个退化的三角形,它会显示为一条线。 你的意思是 D3D11_FILL_WIREFRAME? 【参考方案1】:

好吧,我通过三个必要的顶点完成了这件事,使用前两个作为线的起点,然后在线渲染对象的开头使用glPolygonMode(GL_FRONT_AND_BACK, GL_LINE),最后使用glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)

将其与面部剔除的适当启用和禁用相结合,您就拥有了一个仍然使用三角形设置的完美线渲染器。

【讨论】:

这不是我所希望的,但我能够使用它。我有 1 个需要同时保存线条和三角形的顶点缓冲区。我将线条添加为退化三角形,然后在渲染时,我使用 GL_FILL 渲染 VB 一次,然后使用 GL_LINES 再次渲染 VB。

以上是关于OpenGL:使用退化三角形绘制线的主要内容,如果未能解决你的问题,请参考以下文章

顶点着色器后的OpenGL三角形退化?

用于三角形的 OpenGL 3.3 glDrawArrays

如何使对象在 Opengl 中沿用户定义的线移动

OpenGL

OpenGL

绘制大量三角形的有效方法(OpenGL)