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)。
如您所见,光栅化器应生成三角形内部的13个片段(图像中的阴影像素)。请注意,片段中心位于半整数坐标上。要实现OpenGL规范,这就是结果所需要的。
扫描线多边形填充将确定扫描线与三角形相交的x跨度,但扫描线为半整数y值,如下图所示:
硬件/固件光栅化器将假设像素中心位于整数网格上,因为这是执行填充的最有效方式。在下图中,我将三角形的设备坐标移动了(-0.5,-0.5),将中心放在整数网格上:
请注意,像素中心现在确实在整数网格上。在传递给片段着色器之前,这个光栅化器只会向每个片段中心添加(0.5,0.5)。至少那是我的计划。
处理纹理坐标似乎很简单。想象一下,我分配了纹理坐标(0,0),(1,0),(0.5,1),如下所示。左边的图像使用半整数像素中心(OpenGL方式),右边的图像使用整数像素中心(硬件方式)。纹理坐标(任何附加的片段属性)最终都有相同的值 - 也就是说,没有什么特别需要做的。
我的方法看起来是否正确?