我正在godot 4中制作一个门户系统。有2个世界,正常世界中的一切都在第1层或剔除第1层(灯光)上,对于改变的世界反之亦然。四处移动的玩家模型有两个摄像机,一个摄像机的图层是正常图层(主图层),另一个摄像机的图层是更改的图层。我有一个脚本可以获取改变后的相机所看到的内容,并将该图像提供给着色器来绘制它。
gd脚本:
extends MeshInstance3D
var portalTexture : Texture
var portalMaterial : ShaderMaterial
@onready var altered_camera= $"../../MainCharacter/altered_camera"
func _process(delta):
scale = Vector3(altered_camera.get_viewport().get_texture(
).get_size().x / 1000,altered_camera.get_viewport().get_texture().get_size(
).y / 1000,.1)
get_active_material(0).set_shader_parameter("portal_texture",
altered_camera.get_viewport().get_texture())
着色器代码:
shader_type spatial;
uniform sampler2D portal_texture;
void fragment() {
ALBEDO = texture(portal_texture, UV ).xyz;
}
当我查看网格时,我看到的是普通相机看到的内容,而不是更改后的内容。我知道这一点是因为镜头前有一个球,它只存在于改变的世界中。发生什么事了?
我想可能是因为选择了普通世界的相机作为当前的相机。
A
Viewport
有一个当前 Camera3D
,这就是渲染的内容。
要让第二个相机进行渲染,您需要第二个
Viewport
。让第二个 Camera3D
成为第二个 Viewport
的子级,并使其成为当前 在其中 ,然后您可以通过从第二个 Camera3D
中提取纹理来获得第二个 Viewport
看到的内容其中有您小时候想要的
Camera3D
。