我想让lego style splitscreen camera具有无缝过渡。
任何人都有创建这样的东西的经验吗?我考虑过创建一个普通摄像机,然后为第二个播放器创建另一个摄像机,默认情况下该摄像机不可见。然后,当我想显示它时,我会画一个三角形来分割屏幕并将其纹理设置为2号相机视图。
我找到了this Unity implementation,但是我无法在Godot中实现它。我设法用它自己的相机创建了第二个视口,但是由于某种原因,第二个相机的视图没有显示任何内容。我认为问题在于第二视口的世界与主视口不同。
可以找到源代码here。
答案 0 :(得分:3)
我刚刚建立了一个玩具项目来进行测试,结果比预期的要简单。
这里是该过程的概述,然后将跟随代码示例。
我不确定如何做边框。
要进行拆分连接,您可能必须将控件的形状按边框的粗细移动,然后在摄像机相互靠近时缩小边框。使用玩家之间的距离来计算边框宽度。
两个玩家之间的边框也呈一定角度,因此在对形状进行动画处理时,您将希望使用该角度。这将使视口的连接更加平滑。
控制代码:
extends Control
func _draw():
# in this case animate tl and bml to get the
# rotating split like effect in the lego game
var tl = Vector2()
var tr = rect_size
tr.y = 0
var br = rect_size
var bml = rect_size
bml.x /= 2.0
draw_polygon([tl, tr, br, bml, tl], [Color(), Color(), Color(), Color(), Color()], [])
func _process(d):
material.set_shader_param('viewport', $Viewport.get_texture())
着色器代码:
shader_type canvas_item;
uniform sampler2D viewport;
void fragment(){
COLOR=texture(viewport, SCREEN_UV);
}
我希望这可以帮助您入门!
答案 1 :(得分:0)
这是一个复杂的效果,有很多部分,因此请注意。
我发现最简单的方法是用视口和相机创建一个单独的场景,这将是您的主要场景,然后在其下添加游戏场景,如下所示:
Spatial
Viewport1
Camera1
Viewport2
Camera2
GameScene
然后,您应该能够使用着色器材质制作一个ColorRect
并从每个视口发送纹理:
shader_type canvas_item;
render_mode unshaded, cull_disabled;
uniform sampler2D viewport1;
uniform sampler2D viewport2;
void fragment() {
vec3 view1 = texture(viewport1, UV).rgb;
vec3 view2 = texture(viewport2, UV).rgb;
vec3 col = vec3(0);
// mix them in a satisfying way depending on distance and angle between cameras
// float mixVal = <your formula here>
// col = mix(view1, view2, mixVal)
COLOR = vec4(col, 0.0); // this may not work in Godot shaders
}
这是一个很好的入门指南: https://docs.godotengine.org/en/3.1/tutorials/viewports/using_viewport_as_texture.html