带有GLSL的OpenGL 3.3中无限网格的深度问题

gfttwv5a  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(285)

我遵循这个article,使用带有OpenGL core 3.3配置文件的sokol_gfx。栅格渲染是透明的,在场景中的其他对象之后渲染,并启用混合。

当摄影机靠近对象时,栅格将在其后面渲染,但是,当摄影机移开时,栅格将在对象前面渲染。此外,当摄影机靠近对象时,栅格不会在其后面渲染,它会稍微穿透对象,然后变得透明。

下面的图像显示了栅格在不应该渲染的对象上渲染,但也在应该渲染的对象后面渲染。两个立方体都在栅格上方,应该在它们的后面进行渲染。

Depth

这里的图像显示了栅格渲染超过了它应该在的位置。立方体的底部与网格在同一平面上,网格应该在立方体的边缘停止,而不是以一种小的方式移动然后停止。

Too much grid

来自栅格碎片着色器的深度计算:

float compute_depth (vec3 position) {
    vec4 clip_space_position = frag_projection * frag_view * vec4 (position.xyz, 1.0);
    return (clip_space_position.z / clip_space_position.w);
}

完整的项目位于here

5cnsuln7

5cnsuln71#

我也有同样的问题。问题是这篇文章是为Vulkan写的,Vulkan处理深度的方式与OpenGL不同。在阅读GLSL gl_FragCoord.z Calculation and Setting gl_FragDepth之后,我设法通过如下修改片段着色器解决了这个问题:

float compute_depth (vec3 position) {
    vec4 clip_space_position = frag_projection * frag_view * vec4 (position.xyz, 1.0);
    return 0.5 + 0.5 * (clip_space_position.z / clip_space_position.w);
}

相关问题