13

我在哪里可以获得渲染填充三角形的算法?Edit3:我不能使用 OpenGL 来渲染它。我需要为此的每像素算法。

我的目标是从三角形渲染一个正多边形,所以如果我使用这个三角形填充算法,每个三角形的边缘不会重叠(或在它们之间产生间隙),因为如果我使用它会导致渲染错误例如XOR 渲染像素。

因此,渲染质量应该与 OpenGL 渲染相匹配,所以我应该能够定义 - 例如 - 一个具有 N 个顶点的圆,并且它可以正确地渲染为任意大小的圆;所以它不像一些三角形填充算法那样只使用整数坐标来渲染它。

我需要自己控制三角形填充的能力:我可以添加自己的逻辑来渲染每个单独的像素。所以我需要渲染背后的裸代码来完全控制它。它应该足够有效地绘制数以万计的三角形而无需等待超过一秒钟。(我不确定它最多能有多快,但我希望它不会超过 10 秒)。

首选语言是 C++,但我可以根据需要转换其他语言。

如果没有免费的算法,我在哪里可以学习自己构建一个,这实际上有多难?(我=数学菜鸟)。

我添加了 OpenGL 标记,因为这与它有某种关联。

Edit2:我在这里尝试了算法:http: //joshbeam.com/articles/triangle_rasterization/但它似乎有点破损,这是一个带有 64 个三角形的圆圈: 在此处输入图像描述

但是如果你放大,你可以看到错误: 在此处输入图像描述

解释:有 2 个像素与其他三角形颜色重叠,这不应该发生!(或透明度或异或等效果会产生不好的渲染)。

似乎错误在较小的圆圈上更明显。如果我想对像素产生 XOR 效果,这是不可接受的。

我能做些什么来解决这些问题,所以它会完美地填充它而没有重叠的像素或间隙?

Edit4:我注意到渲染非常小的圆圈不是很好。我意识到这是因为坐标确实被转换为整数。如何将坐标视为浮点数并使其像在 OpenGL 中一样精确和完美地渲染圆?这是小圆圈看起来有多糟糕的示例:

在此处输入图像描述

注意 OpenGL 渲染是多么完美!这就是我想要实现的目标,而不使用 OpenGL。注意:我不只是想渲染完美的圆形,而是任何多边形形状。

4

4 回答 4

1

OpenGL 使用 GPU 来执行这项工作。这在硬件中被加速,称为光栅化。据我所知,硬件实现是基于扫描线算法的。

于 2012-07-27T13:36:54.447 回答
1

这过去是通过创建轮廓然后填充水平线来完成的。有关更多详细信息,请参阅此链接 - http://joshbeam.com/articles/triangle_rasterization/

编辑:我不认为这会产生你所追求的孤立像素,每一行都应该有一个像素。

于 2012-07-27T13:59:50.863 回答
1

总是有半空间法

于 2012-07-27T19:02:11.903 回答
0

您的问题看起来很像共享同一边的三角形所遇到的问题。共享边的三角形所做的是允许一个三角形占据空间,而另一个必须将其留空。

在使用图形卡工作时,通常通过应用从左到右的绘制顺序来获得这种行为,同时还启用 z 缓冲区测试或测试是否曾经绘制过像素。因此,如果已经设置了具有相同 z 值的像素,则不允许更改像素。

在您使用圆圈的示例中,两个相邻圆段的线都不准确。您必须检查边缘的计算方式是否不同以及原因。

每当您绘制两个不同的形状并看到类似的东西时,您可以修复您的模型(因此它们共享所有边缘顶点),进行 z 缓冲区测试或颜色测试。

您还可以通过使用具有更高分辨率的子缓冲区绘制边缘并对其进行下采样来最小化影响。由于这不会影响整个区域,因此与对整个场景进行下采样相比,它在空间和时间方面更具成本效益。

于 2017-02-11T05:55:19.790 回答