当前位置: 首页 > article >正文

【Godot】Viewpoint

(参考自deepseek回答)
在 Godot 引擎中,Viewport 是一个非常重要的类,用于管理渲染内容和场景的显示。它充当一个独立的渲染容器,可以包含 2D 或 3D 场景,并将其渲染到屏幕或纹理上。Viewport 是 Godot 中实现分屏、画中画、渲染到纹理等高级功能的核心组件。


1. Viewport 的定义

  • Viewport 继承自 Node,是一个独立的渲染容器。
  • 它可以包含一个场景(2D 或 3D),并将其渲染到屏幕或纹理上。
  • Viewport 可以嵌套在其他 Viewport 中,形成复杂的渲染管线。

2. Viewport 的核心功能

  1. 渲染场景

    • Viewport 可以包含一个场景(通过 scene 属性设置),并将其渲染到屏幕或纹理上。
    • 它支持 2D 和 3D 渲染。
  2. 渲染目标

    • Viewport 可以将渲染结果输出到:
      • 屏幕(作为主视口)。
      • 纹理(用于后期处理、画中画等效果)。
  3. 分辨率控制

    • Viewport 可以设置独立的分辨率(size 属性),与主窗口分辨率无关。
    • 通过 render_target_v_flip 属性可以控制纹理的垂直翻转。
  4. 后期处理

    • Viewport 支持自定义着色器(Shader),用于实现后期处理效果(如模糊、色彩校正等)。
  5. 多视口支持

    • Godot 支持多个 Viewport,用于实现分屏、画中画等效果。

3. Viewport 的常见用途

  1. 分屏游戏

    • 使用多个 Viewport 实现分屏效果(如双人游戏)。
  2. 画中画

    • 将一个小场景渲染到纹理,并显示在主场景中。
  3. 渲染到纹理

    • 将场景渲染到纹理,用于实现镜子、监控屏幕等效果。
  4. 后期处理

    • 使用 Viewport 和着色器实现屏幕特效(如模糊、像素化等)。
  5. UI 分离

    • 将 UI 渲染到单独的 Viewport,避免与游戏场景混合。

4. Viewport 的常用属性和方法

属性/方法说明
sizeViewport 的分辨率(宽度和高度)。
scene设置要渲染的场景。
render_target_v_flip控制渲染到纹理时的垂直翻转。
render_target_update_mode控制渲染目标的更新模式(如总是更新、手动更新等)。
msaa设置多重采样抗锯齿(MSAA)级别。
use_hdr是否启用高动态范围(HDR)渲染。
get_texture()获取渲染目标的纹理(用于渲染到纹理)。
set_size_override()设置 Viewport 的覆盖大小。

5. Viewport 的使用示例

示例 1:创建一个简单的 Viewport
extends Node2D

func _ready():
    var viewport = Viewport.new()
    viewport.size = Vector2(400, 300)
    add_child(viewport)
    
    var scene = load("res://MyScene.tscn").instance()
    viewport.add_child(scene)
示例 2:渲染到纹理并显示
extends Node2D

func _ready():
    var viewport = Viewport.new()
    viewport.size = Vector2(400, 300)
    viewport.render_target_v_flip = true
    add_child(viewport)
    
    var scene = load("res://MyScene.tscn").instance()
    viewport.add_child(scene)
    
    var texture_rect = TextureRect.new()
    texture_rect.texture = viewport.get_texture()
    texture_rect.rect_min_size = Vector2(400, 300)
    add_child(texture_rect)
示例 3:分屏游戏
extends Node

func _ready():
    var viewport1 = Viewport.new()
    viewport1.size = Vector2(400, 300)
    viewport1.render_target_v_flip = true
    add_child(viewport1)
    
    var scene1 = load("res://Player1Scene.tscn").instance()
    viewport1.add_child(scene1)
    
    var viewport2 = Viewport.new()
    viewport2.size = Vector2(400, 300)
    viewport2.render_target_v_flip = true
    add_child(viewport2)
    
    var scene2 = load("res://Player2Scene.tscn").instance()
    viewport2.add_child(scene2)
    
    var texture_rect1 = TextureRect.new()
    texture_rect1.texture = viewport1.get_texture()
    texture_rect1.rect_position = Vector2(0, 0)
    texture_rect1.rect_min_size = Vector2(400, 300)
    add_child(texture_rect1)
    
    var texture_rect2 = TextureRect.new()
    texture_rect2.texture = viewport2.get_texture()
    texture_rect2.rect_position = Vector2(400, 0)
    texture_rect2.rect_min_size = Vector2(400, 300)
    add_child(texture_rect2)

6. Viewport 的注意事项

  1. 性能开销

    • 每个 Viewport 都会增加渲染开销,尤其是在高分辨率或复杂场景下。
    • 尽量减少不必要的 Viewport 使用。
  2. 分辨率管理

    • Viewport 的分辨率与主窗口分辨率无关,需要手动设置和管理。
  3. 渲染顺序

    • Viewport 的渲染顺序由场景树中的顺序决定,可以通过调整节点顺序控制渲染优先级。

总结

Viewport 是 Godot 中用于管理渲染内容和场景显示的核心组件。它支持 2D 和 3D 渲染,可以用于实现分屏、画中画、渲染到纹理等高级功能。通过灵活使用 Viewport,开发者可以实现复杂的渲染效果和优化游戏性能。


http://www.kler.cn/a/590395.html

相关文章:

  • mapbox基础,使用线类型geojson加载symbol符号图层,用于标注文字
  • 解锁智慧养老新可能,全面提升养老生活质量
  • Go语言中的错误处理与异常恢复:性能对比与实践思考
  • 【leetcode】51.N皇后
  • 如何检查CMS建站系统的插件是否安全?
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(60)五火七禽扇灭火 - 接雨水(双指针与动态规划)
  • Kubernetes Network Policy使用场景
  • 微软远程桌面即将下架?Splashtop:更稳、更快、更安全的 RDP 替代方案
  • Django 5实用指南(十四)项目部署与性能优化【完】
  • 调用华为云API实现口罩识别
  • 从以太网 II 到 VLAN 和 Jumbo Frame:数据帧格式解读
  • 前端面试:如何减少项目里面 if-else?
  • 基于Python实现的结合U - Net与Transformer的神经网络用于视网膜血管分割的示例代码
  • 10 道面向 Java 开发者的 Linux 面试题及答案
  • SpringMVC响应页面及不同类型的数据,
  • Redis--补充类型
  • The Rust Programming Language 学习 (六)
  • 多元时间序列预测的范式革命:从数据异质性到基准重构
  • Elasticsearch 向量检索详解
  • 用maven生成springboot多模块项目