使用'gl.PointCoord'时是否可以改变每个片段的深度?

时间:2018-02-20 18:22:18

标签: glsl webgl

我想知道如何调整每个片段的深度值(使用gl_FragDepth)。我使用gl_PointSize=5.0渲染点基元。

我知道在片段着色器中,我可以通过gl.PointCoord.xy访问每个片段,但是我无法为每个片段重置不同的深度值?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

在WebGL 1.0中,必须允许扩展EXT_frag_depth才能访问gl_FragDepth

您可以在片段着色器中写入内置制服out float gl_FragDepth;gl_FragDepth的值设置为深度缓冲区。由于深度在片段着色器中设置,因此会影响单个片段。

深度的有效范围由glDepthRange设置。默认情况下,深度范围为0到1. 0接近,1为远。

如果未设置gl_FragDepth,则gl_FragCoordz组件将设置为深度缓冲区。

通过在顶点着色器中设置gl_Positionz分量来指定原始点(在您的情况下为点)的顶点位置的深度。如果-gl_Position.w < gl_Position.zgl_Position.z < gl_Position.w则深度(z组件)位于剪辑空间中。

通过除以gl_Positionw分量,将剪辑空间坐标转换为规范化设备空间坐标(透视分割,beacause gl_PositionHomogeneous coordinat)。因此,归一化设备空间的近平面和远平面之间的z分量在[-1,1]范围内。

最后,规范化设备空间的z分量(范围[-1,1])被映射到深度范围,默认情况下为[0,1]。


注意,in mediump vec2 gl_PointCoord是片段着色器的二维输入变量。你不能写信给它。

请参阅OpenGL ES Shading Language 1.00 Specification, 7.2 Fragment Shader Special Variables, page 60

  

片段着色器可以访问只读内置变量gl_PointCoord。 gl_PointCoord中的值是二维坐标,指示当前片段位于点基元内的位置。它们的范围从0.0到1.0。