Подробное руководство по преобразованию RenderTextures в Texture2D в Unity: методы и примеры кода

В Unity RenderTextures обычно используются для захвата и обработки промежуточных результатов рендеринга. Однако в некоторых ситуациях вам может потребоваться преобразовать RenderTexture в Texture2D, например сохранить результат на диск или использовать его в качестве текстуры в элементе пользовательского интерфейса. В этой статье блога мы рассмотрим несколько методов достижения такого преобразования, а также приведем примеры кода.

Метод 1: использование Graphics.CopyTexture
Метод Graphics.CopyTexture позволяет копировать содержимое RenderTexture в Texture2D. Вот пример того, как его использовать:

RenderTexture renderTexture = /* Get your RenderTexture */;
Texture2D texture = new Texture2D(renderTexture.width, renderTexture.height);
RenderTexture.active = renderTexture;
texture.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
texture.Apply();

Метод 2: использование Texture2D.EncodeToPNG или EncodeToJPG
Вы также можете преобразовать RenderTexture в Texture2D, закодировав его в формат PNG или JPG. Вот пример:

RenderTexture renderTexture = /* Get your RenderTexture */;
Texture2D texture = new Texture2D(renderTexture.width, renderTexture.height);
RenderTexture.active = renderTexture;
texture.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
texture.Apply();
byte[] bytes = texture.EncodeToPNG(); // or EncodeToJPG for JPG format

Метод 3: использование пользовательского шейдера
Другой подход — создать собственный шейдер, который сэмплирует RenderTexture и выводит результат в Texture2D. Вот пример простого шейдера, который достигает этой цели:

Shader "Custom/RenderTextureToTexture2D"
{
    Properties
    {
        _MainTex ("Render Texture", 2D) = "white" {}
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };
            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };
            sampler2D _MainTex;
            float4 _MainTex_TexelSize;
            v2f vert(appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }
            fixed4 frag(v2f i) : SV_Target
            {
                fixed4 color = tex2D(_MainTex, i.uv);
                return color;
            }
            ENDCG
        }
    }
}

После того как вы создали шейдер, вы можете использовать его для рендеринга RenderTexture в Texture2D с помощью метода Graphics.Blit.