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
相关产品推荐
相关产品推荐

