【问题标题】:How does one Render a texture directly to the Camera in UnityUnity中如何将纹理直接渲染到相机
【发布时间】:2021-10-04 01:43:45
【问题描述】:

在 Unity 中,我有 2 个纹理形式的图像,我将它们合并在一起(一个覆盖另一个)。我在计算Shader 中执行此操作,并将结果放在RenderTexture 上。我希望这个RenderTexture 成为输出相机看到的一切。

我发现文章说要使用相机的 ReplacementShader 属性,但我无法让它正常工作。

目前我只是将RenderTexture 放在覆盖整个 UI 画布的UIRawImage 上,以便填充整个相机。然而,这有很多滞后,显然是一个次优的解决方案。

那么如何将Rendertexture 或计算Shader 结果直接输出到相机上。谢谢。

【问题讨论】:

  • 您是否尝试将此纹理添加到 UI 图像?应该可以正常工作
  • 在RenderTexture创建过程中也有可能性能下降。如果仅注释掉将 RenderTexture 分配给 RawImage 的代码部分,它是否真的解决了性能下降问题?因为如果不是,则问题与 RawImage 无关。
  • @yasirkula,原来延迟实际上来自于在 CPU 和 GPU 之间获取渲染纹理数据以在纹理 2D 中使用它(因为渲染纹理相对较大)。

标签: unity3d shader textures


【解决方案1】:

你可能会使用OnRenderImage

在相机完成渲染后Unity调用的事件函数,允许您修改相机的最终图像。

并使用Graphics.Blit

使用着色器将源纹理复制到目标渲染纹理中。

并做类似的事情,例如

// This script goes onto your according Camera
public class RenderReplacement : MonoBehaviour
{
    public RenderTexture replacement;

    void OnRenderImage(RenderTexture src, RenderTexture dest)
    {
        // To overwrite the entire screen
        Graphics.Blit(replacement, null);

        // Or to overwrite only what this specific Camera renders
        //Graphics.Blit(replacement, dest);
    }
}

在哪里

目的地
目的地RenderTexture。将此设置为null直接到屏幕。有关详细信息,请参阅说明。


请注意,API 中提到,OnRenderImage 在此相机已经完成渲染之后被调用。因此,为了提高效率——因为我们基本上放弃了该渲染——只需通过禁用所有图层来确保相机基本上没有渲染任何内容,例如让它只渲染单一颜色的背景

【讨论】:

    猜你喜欢
    • 2019-05-23
    • 2023-03-19
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多