所以,我有一个冒名顶替者(真正的几何形状为立方体,可能进行了修剪,而冒名顶替几何形状是门格尔海绵),我需要计算其深度。
我可以计算出在世界空间来抵消相当容易地量。 不幸的是,我已经花了几个小时没有用它来干扰的深度。
唯一正确的结果,我可以得到的是,当我去:
gl_FragDepth = gl_FragCoord.z
基本上,我需要知道gl_FragCoord.z是如何计算的,这样我可以:
- 就拿从gl_FragCoord.z到眼睛空间逆变换
- 添加深度摄
- 改造这个扰动深度回相同的空间原来gl_FragCoord.z。
我很抱歉,如果这似乎是一个重复的问题; 还有一些在这里的其他帖子,解决类似的事情的。 然而,正确地实现所有的人,没有工作了。 而不是试图挑人得到的帮助,在这一点上,我所要求的,做它完整的代码。 它应该只是几行。
对于未来的参考,关键代码如下:
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;
对于另一种未来的参考,这是由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.0
和1.0
(或gl_DepthRange
如果你确实需要改变),我一直在挣扎与其他深度范围内一个小时-但在我(的角度)的投影矩阵,它已经“出炉” 。
需要注意的是这种方式,方程式真的仅仅包含一个恒定的单一乘( (far - near) / 2
)和一个另外的另一个常数( (far + near) / 2
)。 与此相比,乘,加并除以(可能通过一个优化编译器转换为乘法),其在imallett的代码必需的。