Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl gl_PointSize是如何工作的_Opengl_Glpointsize - Fatal编程技术网

Opengl gl_PointSize是如何工作的

Opengl gl_PointSize是如何工作的,opengl,glpointsize,Opengl,Glpointsize,来自DX背景,我试图准确理解gl_PointSize和gl_PointCoord的工作原理。我在网上和手册页上都搜索过了,但还没有得到很好的解释。假设我有一个300x300输出缓冲区,我定义了一个具有90000个点的顶点着色器,对应于300x300缓冲区中的每个位置(每个维度的增量为1)。现在在顶点着色器中,如果我将gl_PointSize定义为2,它会调用片段着色器90000次还是360000次??如果是360000次,我就能理解gl_PointCoord代表了什么。但如果只有90000次,那

来自DX背景,我试图准确理解gl_PointSize和gl_PointCoord的工作原理。我在网上和手册页上都搜索过了,但还没有得到很好的解释。假设我有一个300x300输出缓冲区,我定义了一个具有90000个点的顶点着色器,对应于300x300缓冲区中的每个位置(每个维度的增量为1)。现在在顶点着色器中,如果我将gl_PointSize定义为2,它会调用片段着色器90000次还是360000次??如果是360000次,我就能理解gl_PointCoord代表了什么。但如果只有90000次,那是否意味着每个片段输出代表4个像素?在这种情况下,gl_PointCoord代表什么?它不是一直都是0.5,0.5并且不是很有用吗

感谢各州第14.4.1节“基本点光栅化”:

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

因此,在点大小大于1的情况下,可能会生成多个片段。每个片段至少调用一次片段着色器。如果我们不进行多重采样,那么每个片段调用一次多重采样,因此360000次是正确的答案

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

来自规范的同一部分:

光栅化点精灵时产生的所有碎片都指定为 相同的关联数据,即对应于 重点。但是,片段着色器内置
gl_PointCoord
包含点精灵纹理坐标。
s
点精灵 纹理坐标在点上从零变为一 从左到右水平移动。如果
POINT\u SPRITE\u COORD\u ORIGIN
左下
,t坐标在垂直方向上从零变为一 自下而上。否则,如果点精灵纹理坐标原点 如果
位于左上方
,则
t
坐标在垂直方向上从零变为一 自上而下。[……]

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