GLSL gl_FragCoord.z计算和设置gl_FragDepth(GLSL gl_FragC

2019-06-23 20:40发布

所以,我有一个冒名顶替者(真正的几何形状为立方体,可能进行了修剪,而冒名顶替几何形状是门格尔海绵),我需要计算其深度。

我可以计算出在世界空间来抵消相当容易地量。 不幸的是,我已经花了几个小时没有用它来干扰的深度。

唯一正确的结果,我可以得到的是,当我去:

gl_FragDepth = gl_FragCoord.z

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

  • 就拿从gl_FragCoord.z到眼睛空间逆变换
  • 添加深度摄
  • 改造这个扰动深度回相同的空间原来gl_FragCoord.z。

我很抱歉,如果这似乎是一个重复的问题; 还有一些在这里的其他帖子,解决类似的事情的。 然而,正确地实现所有的人,没有工作了。 而不是试图挑人得到的帮助,在这一点上,我所要求的,做它完整的代码。 它应该只是几行。

Answer 1:

对于未来的参考,关键代码如下:

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;


Answer 2:

对于另一种未来的参考,这是由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计算)。

这个公式可从窗口坐标的节本手册 。 请注意,在我的代码,附近是0.0 ,远是1.0 ,这是默认值gl_DepthRange 。 需要注意的是gl_DepthRange一样的东西在公式中的近/远的距离为透视投影矩阵 ! 唯一的技巧是使用0.01.0 (或gl_DepthRange如果你确实需要改变),我一直在挣扎与其他深度范围内一个小时-但在我(的角度)的投影矩阵,它已经“出炉” 。

需要注意的是这种方式,方程式真的仅仅包含一个恒定的单一乘( (far - near) / 2 )和一个另外的另一个常数( (far + near) / 2 )。 与此相比,乘,加并除以(可能通过一个优化编译器转换为乘法),其在imallett的代码必需的。



文章来源: GLSL gl_FragCoord.z Calculation and Setting gl_FragDepth