如何在半整数像素中心栅格化OpenGL三角形

时间:2014-08-23 00:30:10

标签: opengl pixel rasterizing rasterize

OpenGL像素/片段在概念上是以半整数像素为中心的1x1个正方形。 OpenGL 4.5规范声明:

  

片段位于其左下角,位于整数上   网格坐标。光栅化操作也指片段   中心,从左下角偏移(1 / 2,1 / 2)(和   所以位于半整数坐标上。)

光栅化器通常假设像素中心位于整数网格上。由于我试图实现正确的OpenGL三角形填充,我想知道以下程序是否合理。

让我们看一个带有剪辑坐标(-1,-1),(+ 1,-1),(0,+ 1)的三角形的简单情况,如下图左侧所示(假设正交投影并且z = 0)。假设我们有一个(小的5x5帧缓冲区),我们将三角形映射到via glViewport(0,0,5,5),如右图所示,在设备坐标中产生三角形,顶点为(0,0),(5,0),(2.5, 5)。

pixels centered at half integers

如您所见,光栅化器应生成三角形内部的13个片段(图像中的阴影像素)。请注意,片段中心位于半整数坐标上。要实现OpenGL规范,这就是结果所需要的。

扫描线多边形填充将确定扫描线与三角形相交的x跨度,但扫描线为半整数y值,如下图所示:

triangle fill OpenGL

硬件/固件光栅化器将假设像素中心位于整数网格上,因为这是执行填充的最有效方式。在下图中,我将三角形的设备坐标移动了(-0.5,-0.5),将中心放在整数网格上:

enter image description here

请注意,像素中心现在确实在整数网格上。在传递给片段着色器之前,这个光栅化器只会向每个片段中心添加(0.5,0.5)。至少那是我的计划。

处理纹理坐标似乎很简单。想象一下,我分配了纹理坐标(0,0),(1,0),(0.5,1),如下所示。左边的图像使用半整数像素中心(OpenGL方式),右边的图像使用整数像素中心(硬件方式)。纹理坐标(任何附加的片段属性)最终都有相同的值 - 也就是说,没有什么特别需要做的。

enter image description here

我的方法看起来是否正确?

  • 将(-0.5,-0.5)添加到每个片段坐标
  • 使用硬件高效填充,
  • 在生成片段中心时添加(0.5,0.5),并且
  • 不要为其他片段属性而烦恼(他们只是锻炼出来)。

0 个答案:

没有答案