gl_PointSize如何工作

use*_*950 5 opengl glpointsize

来自DX的背景,我试图确切地了解gl_PointSize和gl_PointCoord的工作方式。我在网上和手册页中进行了搜索,但是并没有一个很好的解释。假设我有一个300x300的输出缓冲区,并定义了一个90,000点的顶点着色器,对应于300x300缓冲区中的每个位置(每个维度的增量为1)。现在在顶点着色器中,如果我将gl_PointSize定义为2,它将调用片段着色器90,000次还是360,000次?如果是360,000次,我可以理解gl_PointCoord代表什么。但是,如果只有90,000次,是否意味着每个片段输出都代表4个像素?在这种情况下,gl_PointCoord代表什么?它不是总是0.5,0.5并没有真正的用处吗?

谢谢

der*_*ass 5

OpenGL 4.5 核心配置文件规范的第 14.4.1 节“基本点光栅化”指出:

点光栅化为每个帧缓冲区像素生成一个片段,其中心位于以点的 (xw; yw) 为中心的正方形内,边长等于当前点的大小。

因此,在点大小 > 1 的情况下,可能会生成多个片段。每个片段至少调用一次片段着色器。如果我们将多重采样排除在图片之外,它会在每个片段中调用一次,因此 360,000 次是正确答案。

请注意,这也忽略了早期深度测试,它可能会或可能不会在您描述的场景中发挥作用,因为它可能会在调用 FS 之前丢弃片段。

来自规范的同一部分:

在光栅化点精灵中产生的所有片段都分配有相同的关联数据,这些数据是与该点对应的顶点的数据。但是,内置的片段着色器gl_PointCoord 包含点精灵纹理坐标。该s点精灵纹理坐标从零到跨越水平左向右的点有所不同。如果POINT_SPRITE_COORD_ORIGINLOWER_LEFT,则 t 坐标从零到一垂直从下到上变化。否则,如果点精灵纹理坐标原点是UPPER_LEFT,则t坐标从 0 到 1 垂直从上到下变化。[...]

所以点坐标确实代表了你期望它代表的东西。请注意,此定义意味着即使点大小为 1 且未使用多重采样,点坐标也不一定总是以 0.5 结束。在这种情况下,会为像素中心调用片段着色器,但该点可能并不完全位于像素中心,因此您将看到正在采样的 1x1 像素大点的确切位置。