【发布时间】:2012-07-26 04:29:32
【问题描述】:
我在哪里可以获得渲染填充三角形的算法? Edit3:我不能使用 OpenGL 来渲染它。我需要每像素的算法。
我的目标是从三角形渲染一个正多边形,所以如果我使用这个三角形填充算法,每个三角形的边缘不会重叠(或在它们之间产生间隙),因为如果我这样做会导致渲染错误使用例如 XOR 来渲染像素。
因此,渲染质量应该与 OpenGL 渲染相匹配,所以我应该能够定义 - 例如 - 一个具有 N 个顶点的圆,并且它可以正确地渲染为任意大小的圆;所以它不像某些三角形填充算法那样只使用整数坐标来渲染它。
我需要自己控制填充三角形的能力:我可以添加自己的逻辑来渲染每个单独的像素。所以我需要渲染背后的裸代码来完全控制它。它应该足够有效地绘制数以万计的三角形而无需等待超过一秒钟。 (我不确定它最多能有多快,但我希望它不会超过 10 秒)。
首选语言是 C++,但我可以根据需要转换其他语言。
如果没有免费的算法,我可以在哪里学习自己构建一个,这实际上有多难? (我=数学菜鸟)。
我添加了 OpenGL 标记,因为这与它有某种关联。
Edit2: 我在这里尝试了算法:http://joshbeam.com/articles/triangle_rasterization/ 但它似乎有点破损,这是一个带有 64 个三角形的圆圈:
但是如果你放大,你可以看到错误:
解释:有 2 个像素与其他三角形颜色重叠,这不应该发生! (或透明度或异或等效果会产生不良渲染)。
似乎错误在较小的圆圈上更明显。如果我想对像素进行 XOR 效果,这是不可接受的。
我可以做些什么来解决这些问题,这样它就可以完美地填充它而没有重叠的像素或间隙?
Edit4:我注意到渲染非常小的圆圈不是很好。我意识到这是因为坐标确实被转换为整数。如何将坐标视为浮点数并使其像在 OpenGL 中一样精确和完美地渲染圆?以下是小圆圈看起来有多糟糕的示例:
请注意 OpenGL 渲染是多么完美!这就是我想要实现的目标,而不使用 OpenGL。 注意:我不只是想渲染完美的圆形,而是任何多边形形状。
【问题讨论】:
-
您可以通过以扫描线算法为起点来做到这一点。有代码教程在:cs.utah.edu/~xchen/columbia/session2/lec13/html/index.html
-
如果你想从分数精度中获得最大的好处,你应该在扫描线光栅化过程中以某种方式使用它。例如。通过仅渲染像素中心被多边形覆盖的像素,或在边缘上进行某种形式的抗锯齿。
-
您认为“算法”应该如何处理数学上属于多个三角形的中心像素,以满足您的要求(没有未填充的像素,没有多次绘制的像素)?
-
巧妙地使用整数可以创造奇迹。
-
@AlexeyFrunze,如果您有解决方案,请随时回答这个问题。
标签: c++ language-agnostic geometry rendering