2015-09-23 57 views
0

我想在Linux系统上使用C,OpenGL渲染凹多边形。任何人都可以提供示例代码,这将如何在最新版本的OpenGL中完成(比如根据glxinfo NVIDIA驱动程序352.41支持的OpenGL 4.5,但是无论您喜欢的3+版本支持在Linux硬件上实现的扩展(至少由NVIDIA) 。OpenGL 3+渲染凹面多边形(不含GLU)

这个question上的stackoverflow指向使用GLU tesselation,这已被弃用。使用模板缓冲的方法,我不完全了解,但如果这是现在这样做的“行业接受的标准”,我会加大理解。

这个post是指一个.NET库,我不想在Linux和C上使用,tesselation着色器,我会喜欢一个如何使用的例子,但是我可以找到的所有例子都是从凸面补丁开始的,图书馆为了后代迁移到另一个我想离开的存储库。

谢谢。

+1

您是渲染孤立的凹多边形,还是一堆例如网格的一部分? –

+0

OpenGL是一个渲染三角形的系统。这是唯一的原始人。如果你想渲染凹面或凸面多边形,你必须自己提供分解。你可以用几何着色器来做,但你必须接受输入顶点(有限制),分解成三角形并输出基元。如果我没有记错的话,Graphics Gems I(网上可用)中有一些算法用于镶嵌任意多边形。 – Robinson

+2

尽管GLU已被弃用,但镶嵌代码并不算太坏,实际上并没有与OpenGL绑定。 [libtess2](https://github.com/memononen/libtess2)实际上是Mesa的GLU实现中细分的曲面细分功能。 –

回答

1

绝大多数OpenGL应用程序绝对不会绘制凹多边形;这不是API或硬件直接支持的方式,因此也没有行业标准方法。模板将在帧缓冲区中实现,任何类型的凸分解都可以在几何级别实现。

模板方法其实并不难理解。隐喻是栅栏跳跃:多边形的边缘是栅栏,多边形本身是封闭的土地。要确定一个点是否在陆地内,请从外面的任何地方开始直线行走。请计算你需要跳多少次才能到达那里。每当你跳栏时,你都会从内部切换到外部,反之亦然。因此,如果你跳过了一个数量的栅栏,那么这个点必须在内部(例如,你从外部到内部一次,或者 - >内部 - >外部 - >内部或 - >内部 - >外部 - >内部 - >外部 - >里面等)。如果你跳过奇数的围栏,那么它必须在外面。

模板方法保持栅栏跳跃的每像素计数。

它相对于作为多边形的顶点的固定点绘制三角形风扇。所以每个围栏只有一个三角形,第三个坐标是一个固定的位置,你知道它在里面。

三角形内部的像素点是为了让您在直线上达到固定点而达到的每个点,都需要跳过该栅栏。

因此,在任何位置的模板总数是您需要跳过以从那里到达多边形的栅栏数量。

所以所有奇怪的模具结果都是在里面的点。所有均匀的结果都是在外面的点。