如何有效地渲染具有多边形边缘的网格表面?

Posted

技术标签:

【中文标题】如何有效地渲染具有多边形边缘的网格表面?【英文标题】:How to efficiently render mesh surface with the polygon edges outlined? 【发布时间】:2018-02-06 19:40:18 【问题描述】:

给定三角形网格的顶点和元素的 VBO 和 EBO,我想用一种颜色渲染表面并用另一种颜色渲染边缘,这样我就可以构建一些像这样的图像:

一种方法是调用 glDrawElements 一次用于线框,一次用于填充几何体。我想知道是否有更有效的方法?也许,只需一次绘制调用?

【问题讨论】:

所以你只是换了glPolygonMode然后画了两次? 我还需要通过在程序之间切换或将新颜色传递给 FS 来更新颜色。我想知道是否有更好的方法来做到这一点。许多软件/工具包,如 VTK、Blender、Rhino 等选项,所以我很想知道 OpenGL 是否有更方便的方法来解决这个问题。 @mfaieghi:复杂的渲染引擎可以做到这一点,这并不意味着 OpenGL 必须有一种简单或“方便”的方法来做到这一点。确实,复杂渲染引擎的全部意义在于将低层复杂的事物在高层简化。 好吧,这可以在一个绘图调用中完成,只需绘制三角形,并根据到边缘的距离有条件地决定在每个片段的基础上使用边缘颜色或普通阴影进行绘制(你也可以很好地在两者之间混合以获得一些线条平滑)。 @derhass 谢谢你的好点子。你有我看的例子吗? 【参考方案1】:

您使用两种不同的primitives 进行绘制,具有两组不同的渲染参数(即:要写入的颜色),因此几乎可以肯定有两个不同的着色器

即使您使用了 ubershader 方法,单个绘图调用也只能光栅化一种图元。绘图调用绘制三角形或线条,而不是两者。虽然 GS 可以将三角形转换为线,反之亦然,那就是 compile-time determination。

做到这一点的唯一方法是两次渲染对象,使用不同的渲染参数/着色器/其他需要的东西。即使indirect multidraw commands 也无法一口气完成。

【讨论】:

以上是关于如何有效地渲染具有多边形边缘的网格表面?的主要内容,如果未能解决你的问题,请参考以下文章

获取网格的边界边缘 - 按缠绕顺序

渲染大量四边形的有效方法(LibGDX/OpenGL ES)

Node.js构建导航网格NavMesh

Node.js构建导航网格NavMesh

使用多边形网格的 UV 瓦片

有效地计算两个向量之间的差异