draw the depth value in opengl using shaders

前端 未结 2 393
南笙
南笙 2020-12-13 07:39

I want to draw the depth buffer in the fragment shader, I do this:

Vertex shader:

varying vec4 position_;

gl_Position = gl_ModelVie         


        
2条回答
  •  -上瘾入骨i
    2020-12-13 08:15

    Indeed, the "depth" value of a fragment can be read from it's z value in clip space (that is, after all matrix transformations). That much is correct.

    However, your problem is in the division by w. Division by w is called perspective divide. Yes, it is necessary for perspective projection to work correctly.

    However. Division by w in this case "bunches up" all your values (as you have seen), to being very close to 1.0. There is a good reason for this: in a perspective projection, w= (some multiplier) *z. That is, you are dividing the z value (whatever it was computed out to be) by the (some factor of) original z. No wonder you always get values near 1.0. You're almost dividing z by itself.

    As a very simple fix for this, try dividing z just by the farPlane, and send that to the fragment shader as depth.

    Vertex shader

    varying float DEPTH ;
    
    uniform float FARPLANE ;  // send this in as a uniform to the shader
    
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    DEPTH = gl_Position.z / FARPLANE ; // do not divide by w
    

    Fragment shader:

    varying float DEPTH ;
    // far things appear white, near things black
    gl_Color.rgb=vec3(DEPTH,DEPTH,DEPTH) ;
    

    The result is a not-bad, very linear-looking fade.

    enter image description here

提交回复
热议问题