我想在片段着色器中绘制深度缓冲区,我这样做:
顶点着色器:
varying vec4 position_;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
position_ = gl_ModelViewProjectionMatrix * gl_Vertex;
Run Code Online (Sandbox Code Playgroud)
片段着色器:
float depth = ((position_.z / position_.w) + 1.0) * 0.5;
gl_FragColor = vec4(depth, depth, depth, 1.0);
Run Code Online (Sandbox Code Playgroud)
但是我打印的都是白色的,我做错了什么?
Nic*_*las 23
你想在什么空间画出深度?如果要绘制窗口空间深度,可以执行以下操作:
gl_FragColor = vec4(gl_FragCoord.z);
Run Code Online (Sandbox Code Playgroud)
但是,这不会特别有用,因为大多数数字都非常接近1.0.只能看到非常近的物体.这是使用标准透视投影的深度缓冲区的深度值分布的性质.
或者,换句话说,这就是你变白的原因.
如果您想在线性空间中使用这些值,则需要执行以下操作:
float ndcDepth = ndcPos.z =
(2.0 * gl_FragCoord.z - gl_DepthRange.near - gl_DepthRange.far) /
(gl_DepthRange.far - gl_DepthRange.near);
float clipDepth = ndcDepth / gl_FragCoord.w;
gl_FragColor = vec4((clipDepth * 0.5) + 0.5);
Run Code Online (Sandbox Code Playgroud)
bob*_*obo 12
实际上,片段的"深度"值可以从剪辑空间中的z值读取(即,在所有矩阵变换之后).这是正确的.
但是,你的问题在于划分w.司由w被称为透视分割.是的,透视投影必须正常工作.
但是.w在这种情况下,除以所有值(如你所见)," 分组",非常接近1.0.这有一个很好的理由:在透视投影中,w= (some multiplier) *z.也就是说,您将z值(无论计算出来的是什么)除以原始z的(某个因子).难怪你总是得到接近1.0的值.你几乎把z分开了.
作为一个非常简单的解决方案,尝试z仅使用farPlane进行划分,并将其作为深度发送到片段着色器.
顶点着色器
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
Run Code Online (Sandbox Code Playgroud)
片段着色器:
varying float DEPTH ;
// far things appear white, near things black
gl_Color.rgb=vec3(DEPTH,DEPTH,DEPTH) ;
Run Code Online (Sandbox Code Playgroud)
结果是一个不坏的,非常线性的淡入淡出.

| 归档时间: |
|
| 查看次数: |
21006 次 |
| 最近记录: |