24

所以,我有一个冒名顶替者(真正的几何体是一个立方体,可能被剪裁了,冒名顶替者几何体是门格尔海绵),我需要计算它的深度。

我可以很容易地计算出在世界空间中的偏移量。不幸的是,我花了好几个小时都没有用它来扰乱深度。

我能得到的唯一正确结果是我去的时候:

gl_FragDepth = gl_FragCoord.z

基本上,我需要知道 gl_FragCoord.z 是如何计算的,以便我可以:

  • 从 gl_FragCoord.z 到眼睛空间的逆变换
  • 添加深度扰动
  • 将此扰动的深度转换回与原始 gl_FragCoord.z 相同的空间。

如果这似乎是一个重复的问题,我深表歉意;这里还有许多其他帖子解决了类似的问题。但是,在实现所有这些之后,没有一个可以正常工作。在这一点上,我不是试图选择一个来获得帮助,而是要求提供完整的代码来完成它。它应该只是几行。

4

2 回答 2

36

为了将来参考,关键代码是:

float far=gl_DepthRange.far; float near=gl_DepthRange.near;

vec4 eye_space_pos = gl_ModelViewMatrix * /*something*/
vec4 clip_space_pos = gl_ProjectionMatrix * eye_space_pos;

float ndc_depth = clip_space_pos.z / clip_space_pos.w;

float depth = (((far-near) * ndc_depth) + near + far) / 2.0;
gl_FragDepth = depth;
于 2012-10-15T21:11:40.617 回答
7

作为未来的另一个参考,这与 imallett 给出的公式相同,它在 OpenGL 4.0 应用程序中为我工作:

vec4 v_clip_coord = modelview_projection * vec4(v_position, 1.0);
float f_ndc_depth = v_clip_coord.z / v_clip_coord.w;
gl_FragDepth = (1.0 - 0.0) * 0.5 * f_ndc_depth + (1.0 + 0.0) * 0.5;

这里,modelview_projection是 4x4 模型视图投影矩阵,v_position是被渲染像素的对象空间位置(在我的例子中,由 raymarcher 计算)。

该等式来自本手册的窗口坐标部分。请注意,在我的代码中,near is和 far is是 的默认值。请注意,这与透视投影矩阵公式中的近/远距离不同!唯一的技巧是使用and (或者如果你真的需要改变它),我已经在另一个深度范围内挣扎了一个小时 - 但这已经在我的(透视)投影矩阵中“烘焙”了。0.01.0gl_DepthRangegl_DepthRange0.01.0gl_DepthRange

请注意,这样,方程实际上只包含一个常数乘以 ( (far - near) / 2) 和另一个常数 ( ) 的一个加法(far + near) / 2。将其与 imallett 代码中所需的乘法、加法和除法(可能通过优化编译器转换为乘法)进行比较。

于 2015-04-01T17:40:18.880 回答