gpt4 book ai didi

unity3d - 如何在 Unity 中动态写入整个模板缓冲区

转载 作者:行者123 更新时间:2023-12-05 01:49:23 25 4
gpt4 key购买 nike

我想达到什么目的?

我想在 Unity3D 中实现一种效果,我将几个相机叠加在一起。每个摄像头都会绘制到屏幕的特定区域。如果可能的话,我希望这些区域能够动态变化。我正在使用 unity(最新版本)和 URP。

技术上我是怎么看的:

出于实现和性能的原因,写入模板缓冲区似乎是可行的方法。这样,我只能为每个相机渲染我想要的屏幕部分。模板制作完成后也很容易,因为 Unity 中的 ForwardRendering 设置提供了开箱即用的此类功能。

我想不通的是:

问题是,我不知道如何有效地写入整个模板缓冲区(每一帧)。 最好的方法是使用计算着色器(或者可能是一个简单的脚本),在一些计算之后直接写入值。有办法吗?如果是,如何?

另一种选择可能是在每个摄像头前使用一个透明四边形,并像那样写入模板缓冲区。但是 1) 片段缓冲区中似乎存在 SV_StencilRef 关键字,但 Unity 尚不支持? 2) 尽管如此,我仍然会失去性能。

感谢您提供有关如何解决此问题的任何帮助/想法。

编辑(澄清):我希望能够渲染自由形状,而不仅仅是矩形,这阻止了标准 ViewportRect 的使用。经过一番搜索后,我发现 Voronoi 分屏与我想要实现的目标非常相似(从技术角度来看)(参见 here)

最佳答案

如果我理解正确,您只需要使用不同的相机视口(viewport)矩形 (https://docs.unity3d.com/ScriptReference/Camera-rect.html) 来确定哪个相机应该渲染屏幕的哪个部分。

评论回复:没有,没有拉长。这是一个有四个摄像头的示例:

创建一个有四个摄像头的场景,将此脚本添加到其中,并将摄像头添加到脚本中的数组中。我添加 _movingObject 只是为了看到移动的东西,但这不是必需的。

using UnityEngine;

public class CameraHandler : MonoBehaviour
{
[SerializeField] private Transform _movingObject;
[SerializeField] private float _posMod = 10.0f;

[SerializeField] private float _cameraPosMod = 0.1f;
[SerializeField] private Camera[] _cameras;

private void Update()
{
float t = Time.time;
float x = Mathf.Sin(t);
float y = Mathf.Cos(t);

if (_movingObject) _movingObject.position = new(x * _posMod, 1.0f, y * _posMod);

Vector2 center = new(0.5f + x * _cameraPosMod, 0.5f + y * _cameraPosMod);

// bottom left camera
_cameras[0].rect = new(0.0f, 0.0f, center.x, center.y);

// bottom right camera
_cameras[1].rect = new(center.x, 0.0f, 1.0f - center.x, center.y);

// upper left camera
_cameras[2].rect = new(0.0f, center.y, center.x, 1.0f - center.y);

// upper right camera
_cameras[3].rect = new(center.x, center.y, 1.0f - center.x, 1.0f - center.y);
}
}

关于unity3d - 如何在 Unity 中动态写入整个模板缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74115453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com