我想知道如何调整每个片段的深度值(使用gl_FragDepth
)。我使用gl_PointSize=5.0
渲染点基元。
我知道在片段着色器中,我可以通过gl.PointCoord.xy访问每个片段,但是我无法为每个片段重置不同的深度值?
任何帮助将不胜感激。
答案 0 :(得分:1)
在WebGL 1.0中,必须允许扩展EXT_frag_depth
才能访问gl_FragDepth
:
您可以在片段着色器中写入内置制服out float gl_FragDepth;
。 gl_FragDepth
的值设置为深度缓冲区。由于深度在片段着色器中设置,因此会影响单个片段。
深度的有效范围由glDepthRange
设置。默认情况下,深度范围为0到1. 0接近,1为远。
如果未设置gl_FragDepth
,则gl_FragCoord
的z
组件将设置为深度缓冲区。
通过在顶点着色器中设置gl_Position
的z
分量来指定原始点(在您的情况下为点)的顶点位置的深度。如果-gl_Position.w < gl_Position.z
和gl_Position.z < gl_Position.w
则深度(z
组件)位于剪辑空间中。
通过除以gl_Position
的w
分量,将剪辑空间坐标转换为规范化设备空间坐标(透视分割,beacause gl_Position
为Homogeneous 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。