代码之家  ›  专栏  ›  技术社区  ›  Kadir Erdem Demir

通过操纵gl\u FragDepth使选定的线对象优先于其他对象

  •  2
  • Kadir Erdem Demir  · 技术社区  · 6 年前

    在我们当前的项目中,我们有可能在同一个地方画一些线。而不是像这样的闪烁效果。

    我正在尝试根据几何体类型操纵glèu FragDepth值来解决这个问题。在我的片段着色器中,我有如下内容:

    if ( offset > 0.0 )
       gl_FragDepth =  gl_FragCoord.z - offset*0.001;
    

    乍一看,结果要好一点:

    enter image description here

    即使物体有确切的一些位置看起来更好,我有问题,在正常情况下,物体是跳上对方。

    我的问题是:

    2-如果是这样,我应该使用以下命令而不是指定gl\u FragCoord.z described here . ?

    我试着调用这个函数:

     float findRealDepth(in highp mat4 modelViewProjectinMatrix,
                         in highp vec4 objectPosition)
            {
                float far=gl_DepthRange.far; float near=gl_DepthRange.near;
                vec4 clip_space_pos = modelViewProjectinMatrix * vec4(objectPosition.xyz, 1.0);
                float ndc_depth = clip_space_pos.z / clip_space_pos.w;
                return (((far-near) * ndc_depth) + near + far) / 2.0;
            };
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Rabbid76    6 年前

    写入的值 gl_FragDepth fragment shader
    通常,深度值必须在 (除非 glDepthRange ).

    格拉德夫 如果未在片段着色器中设置,则写入深度缓冲区的值是规格化的设备空间 z 从范围映射的坐标 [-1, 1] [0, 1]

    这意味着深度值可以表示为:

    depth = 0.5 + 0.5 * gl_Position.z / gl_Position.w;
    

    在fragment着色器中,可以从fragment内置输入变量的z分量读取该值 gl_FragCoord

    这意味着

    gl_FragDepth = gl_FragCoord.z;
    

    会将相同的值存储到深度缓冲区,就像会自动存储到深度缓冲区一样,而不会写入深度缓冲区 格拉德夫 .

    如果必须应用深度偏移,将线几何图形拉到前面,则必须通过减去偏移来减小深度值:

    gl_FragDepth =  gl_FragCoord.z - offset;  
    

    这个 offset 必须大于或等于可存储在深度缓冲区中的最小值。

    如果使用定点深度缓冲区格式(例如。 GL_DEPTH_COMPONENT16 GL_DEPTH_COMPONENT24
    最小值是设置最低有效位且所有其他位为零的值。

    GL\U深度\U组件24 )最小值可以表示为:

    1 / (2^24 - 1)
    

    在GLSL中:

    1.0 / (exp2(24.0) - 1.0) 
    

    因为 gl_Position , 格拉格古德 ,如上所述,深度偏移也可以应用于 在顶点着色器中,在 GLU位置

    gl_Position.z = gl_Position.z - offset * 2.0 * gl_Position.w;
    

    注意,通过常量值操纵视图空间z坐标不能达到相同的效果(在透视投影中)。视图空间z坐标不是线性变换为规格化设备z坐标(因为透视分割)。
    看到了吗 How to render depth linearly in modern OpenGL with gl_FragCoord.z in fragment shader?