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

Godot4异层相机画面获取异常:显示主相机内容而非目标相机

Godot 4传送门系统相机画面异常问题解决

问题描述

我在Godot 4中开发传送门系统,设置了两个世界:正常世界的对象位于Layer 1或剔除层1(灯光),异世界对应其他层。玩家模型配有两个相机,一个属于正常层(主相机),另一个属于异世界层(altered_camera)。编写脚本获取altered_camera的画面传递给着色器绘制,但网格显示的却是主相机的画面——已通过仅存在于异世界的球验证此问题,怀疑是正常世界的相机被设为当前相机。

核心原因

你直接调用altered_camera.get_viewport().get_texture()获取的是共享主视口的纹理,而默认情况下,一个视口只会渲染被标记为current的相机画面。你的altered_camera未被设置为当前相机,因此视口输出的还是主相机的内容。

解决方案

给altered_camera分配独立的Viewport,让它在专属视口中渲染异世界内容,具体步骤如下:

  • 创建独立Viewport:在玩家节点下,给altered_camera添加父节点Viewport(注意不是ViewportContainer),将相机移至该Viewport内部。
  • 配置相机剔除层:选中altered_camera,在Inspector中设置Culling Mask为异世界对应的层,取消勾选正常世界的Layer 1,确保只渲染异世界对象。
  • 配置Viewport:选中新创建的Viewport,设置Size与主视口一致,或开启Size Stretch适配主视口尺寸。

修改后的代码示例

GDScript(MeshInstance3D脚本)

extends MeshInstance3D

@onready var altered_camera = $"../../MainCharacter/altered_camera"
@onready var portal_viewport = altered_camera.get_parent() # 指向独立Viewport

func _process(delta):
    # 根据独立视口纹理尺寸缩放传送门网格
    var tex_size = portal_viewport.get_texture().get_size()
    scale = Vector3(tex_size.x / 1000, tex_size.y / 1000, 0.1)
    # 将独立视口的纹理传递给着色器
    get_active_material(0).set_shader_parameter("portal_texture", portal_viewport.get_texture())

着色器代码(无需修改)

shader_type spatial;
uniform sampler2D portal_texture;

void fragment() {
    ALBEDO = texture(portal_texture, UV ).xyz;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:36:11