2012-07-28 128 views
1

我需要一种算法来渲染像素完美三角形而不使用OpenGL。OpenGL如何渲染其三角形?

从哪里可以得到像OpenGL这样的算法?优选单线程。

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

  • OpenGL如何做到这一点?它是如此密集的工作,我应该忘记它,并使用(越野车)扫描线方法呢?

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

我宁愿C++解决方案,但语言不是问题。

+6

OpenGL是一个规范,它不包含算法。我假设你在谈论OpenGL实现? – delnan 2012-07-28 18:02:15

+1

不会留下空白不是任何单一算法特有的东西,它只是一个错误。 – zacaj 2012-07-28 18:06:49

+0

为什么OpenGL被禁止?如果缺乏对硬件的访问,则会有软件仿真。 – phs 2012-07-28 18:19:42

回答

3

OpenGL使用基于扫描线的方法,如Alan和您的文章链接提及。但是,管理差距并不是数学准确性的问题。对于三角形边缘上的像素,您需要额外的约定。 OpenGL使用的约定与Direct3D使用的约定相同。这就是所谓的“左上角”,我所看到的最好的解释是关于这个MSDN rasterization rules article

1

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

2

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

如果您将像素看作具有某个有限区域的屏幕的正方形,则可以得到重叠,因为相邻的三角形通常都会与像素重叠。但是,如果您将像素视为广场中心的无限小点,则可以保证没有空白或重叠。

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