You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot 4.5.1单相机为不同剔除层设置不同近剔除距离咨询

解决方案与效率对比

单相机动态调整方案(代码实现)

可以通过代码实现单相机对不同Culling Layer使用不同近剔除距离,核心思路是让相机分两次渲染不同层:

  • 第一步:设置相机的cull_mask仅包含Layer 1,保持near为默认值,执行一次渲染。
  • 第二步:修改相机的near为目标小值,将cull_mask切换为仅包含Layer 2,再次执行渲染(需避免清除颜色缓冲区,保证两次渲染结果叠加)。

具体代码示例(挂载到Camera3D节点):

extends Camera3D

@export var layer1_near: float = 0.1 # Layer1默认近剔除距离
@export var layer2_near: float = 0.01 # Layer2的小近剔除距离

func _ready():
    # 关闭相机自动独占渲染,改为手动控制
    set_auto_exclusive(false)
    # 主视口不自动清除,避免覆盖第一次渲染结果
    get_viewport().set_clear_mode(Viewport.CLEAR_MODE_NEVER)

func _process(delta):
    # 渲染Layer1(索引从0开始,Layer1对应位0)
    cull_mask = 1 << 0
    near = layer1_near
    force_update_scene()
    
    # 渲染Layer2(对应位1)
    cull_mask = 1 << 1
    near = layer2_near
    force_update_scene()

注意事项:

  • 若场景存在透明物体,需调整相机render_priority或物体visibility_layer保证渲染顺序正确。
  • 也可通过Viewport.set_clear_flags精细控制第二次渲染时的缓冲区清除规则,替代全局关闭视口清除。

效率对比:单相机 vs 双相机SubViewport方案

单相机动态调整方案效率更优,原因如下:

  1. 内存开销更低:无需额外创建SubViewport及对应的纹理资源,避免了视口纹理的内存占用和数据拷贝开销。
  2. 渲染管线损耗更少:双相机方案需维护两个相机的渲染状态,且SubViewport渲染涉及额外的帧缓冲切换、纹理采样操作;单相机仅需两次参数切换,状态切换成本远低于双相机。
  3. 避免透明背景额外消耗:双相机方案中SubViewport的透明背景需开启alpha混合,增加像素处理开销;单相机直接在主视口叠加渲染,无需额外混合操作。

唯一的额外开销是一帧内的两次渲染调用,但这种成本远小于双相机方案的资源损耗。

内容的提问来源于stack exchange,提问作者user2635469

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 17:12:06