Godot 4.0中如何结合全局环境后处理与自定义后处理着色器
Godot 4.0 Beta 1 叠加自定义后处理与内置后处理的解决方法
正确实现裁剪空间平面的顶点着色器
官方文档的旧适配代码在Beta 1中存在兼容性问题,直接通过顶点着色器生成覆盖全屏的裁剪空间平面即可,无需依赖模型变换:
shader_type mesh; void vertex() { // 将PlaneMesh的本地坐标(0-1范围)直接映射到裁剪空间的-1到1区间 POSITION = vec4(VERTEX * vec3(2.0, 2.0, 0.0) - vec3(1.0, 1.0, 0.0), 1.0); }
该代码直接跳过模型、视图、投影矩阵的计算,让平面固定在裁剪空间内,不会被相机视锥体裁剪。
MeshInstance3D的关键设置
- 使用默认尺寸的PlaneMesh,无需手动旋转或设置Z偏移
- 将MeshInstance3D的
extra_cull_margin设为100.0以上,彻底避免视锥体裁剪问题 - 把MeshInstance3D放在场景根节点,不要给它添加任何父节点变换
保留内置后处理的配置
自定义后处理材质必须采样当前相机的渲染结果,才能叠加在全局后处理之上:
- 在片段着色器中添加屏幕纹理采样:
uniform sampler2D screen_texture; void fragment() { // 先采样全局后处理后的屏幕画面 vec4 base_color = texture(screen_texture, SCREEN_UV); // 这里添加你的自定义后处理逻辑,比如色调偏移、边缘检测等 COLOR = base_color * vec4(1.2, 0.9, 0.9, 1.0); // 示例:暖色调叠加 }
- 确保Camera3D的
post_process_mode设置为POST_PROCESS_MODE_INHERIT或POST_PROCESS_MODE_ENABLED,让全局环境的后处理先执行,再将结果传递给自定义后处理平面。
常见问题排查
- 若平面仍消失,检查顶点着色器是否正确覆盖了
POSITION变量,不要混用MODEL_MATRIX或VIEW_PROJECTION_MATRIX - 确认自定义材质的
blend_mode设为BLEND_MODE_MIX,避免完全覆盖内置后处理的结果
内容的提问来源于stack exchange,提问作者Henrik Söderlund
相关产品推荐
相关产品推荐

