1

我需要一种算法来在不使用 OpenGL 的情况下渲染像素完美的三角形。

我在哪里可以获得像OpenGL这样的算法正在使用?最好是单线程。

它必须像 OpenGL 那样做,因为 OpenGL 不会在共享边的两个三角形上留下间隙或重叠像素。扫描线方法会产生这些错误:http: //joshbeam.com/articles/triangle_rasterization/。我也尝试了这个半空间算法:http ://devmaster.net/forums/topic/1145-advanced-rasterization/但我无法让它工作(呈现胡言乱语)。

  • OpenGL是如何做到的?它是否如此密集的工作以至于我应该忘记它并改用(错误的)扫描线方法?

  • 我在哪里可以得到算法?

我更喜欢 C++ 解决方案,但语言不是问题。

4

3 回答 3

3

正如 Alan 和您的文章链接所提到的,OpenGL 使用基于扫描线的方法。然而,管理差距不是数学准确性的问题。您需要对三角形边缘的像素进行额外的约定。OpenGL 使用的约定与 Direct3D 使用的约定相同。它被称为“左上角”,我见过的最好的解释是这篇MSDN 光栅化规则文章

于 2012-07-29T03:23:38.450 回答
2

典型的 OpenGL 实现将使用与您的第一个链接或多或少相同的扫描线/光栅化方法。避免差距和重叠的关键是要非常小心你的数学,以避免舍入误差的不确定性。

如果您将像素视为具有某些有限区域的屏幕正方形,那么您可能会出现重叠,因为相邻的三角形通常都会重叠像素。但是,如果您将像素视为正方形中心的无限小点,则可以保证没有间隙或重叠。

您还需要定点整数数学的算术确定性,而不是浮点数学的舍入误差。每个光栅化扫描线的左端从大于或等于起始扫描值的第一个像素开始。光栅化扫描线的右端在严格小于结束扫描值的第一个像素之前结束。

于 2012-07-28T20:43:08.073 回答
1

看看OpenMesa,它是 OpenGL 规范的开源实现。它目前最高支持 OpenGL 3.0。

于 2012-07-28T18:21:14.360 回答