gl_PointSize是如何工作的?

8

作为一个有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,不太有用吗?

谢谢

1个回答

7

OpenGL 4.5核心规范的14.4.1节“基本点光栅化”说明:

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

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

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

来自同一规范部分:

所有在点精灵光栅化过程中产生的片段都被分配相同的相关数据,这些数据是对应于该点的顶点的数据。然而,片段着色器内置的gl_PointCoord包含点精灵纹理坐标。其中,s点精灵纹理坐标从左到右水平地在点上变化从零到一。如果POINT_SPRITE_COORD_ORIGINLOWER_LEFT,则t坐标从下到上垂直地变化从零到一。否则,如果点精灵纹理坐标原点是UPPER_LEFT,则t坐标从上到下垂直地变化从零到一。因此,点坐标确实代表了您所期望的内容。请注意,这个定义意味着即使点大小为1且没有使用多重采样,点坐标也不一定总是最终为0.5。在这种情况下,片段着色器被调用以进行像素中心的采样,但点可能不完全位于像素中心,因此您将看到您正在采样的1x1像素大点的确切位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接