使用rt做一个最简单的blit的操作

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;

public class RTDemo : MonoBehaviour
{
    private CommandBuffer m_cmd;
    public Camera m_camera;
    private int m_rtID;
    private RenderTargetIdentifier m_rti;
    private Material m_copyMaterial;
    private Mesh m_mesh;
    private RenderTargetIdentifier m_cameraTarget;
    static readonly int MainTex = Shader.PropertyToID("_MainTex");

    public void OnClickButton()
    {
        CreateCommandBuffer();
        AddCommandToCamera();
        CreateMesh();
        CreateRT();
    }

    private void CreateCommandBuffer()
    {
        m_cmd = new CommandBuffer();
        m_cmd.name = "post effect";
    }

    private void AddCommandToCamera()
    {
        m_camera.AddCommandBuffer(CameraEvent.AfterForwardOpaque, m_cmd);
    }

    private void CreateRT()
    {
        m_rtID = Shader.PropertyToID("postEffect");
        RenderTextureDescriptor renderTextureDescriptor = new RenderTextureDescriptor();
        renderTextureDescriptor.width = Screen.width;
        renderTextureDescriptor.height = Screen.height;
        m_cmd.GetTemporaryRT(m_rtID, renderTextureDescriptor);

        m_cameraTarget = new RenderTargetIdentifier(BuiltinRenderTextureType.CameraTarget);
    }

    private void CreateMesh()
    {
        m_mesh = new Mesh { name = "Fullscreen Triangle" };
        m_mesh.SetVertices(new List<Vector3>{
                    new Vector3(-1f, -1f, 0f),
                    new Vector3(-1f,  3f, 0f),
                    new Vector3( 3f, -1f, 0f)
                });
        m_mesh.SetIndices(new[] { 0, 1, 2 }, MeshTopology.Triangles, 0, false);
        m_mesh.UploadMeshData(false);
    }

    private void Draw()
    {
        m_cmd.SetGlobalTexture(MainTex, m_cameraTarget);
        m_cmd.SetRenderTarget(m_rtID, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store);
        m_cmd.ClearRenderTarget(true, true, Color.clear);
        m_cmd.Blit(m_cameraTarget, m_rtID);
    }

    private void Update()
    {
        if(m_rtID != 0)
        {
            Draw();
        }
    }
}

此时会有一个错误:
在这里插入图片描述
此时必须设置这行代码:

renderTextureDescriptor.msaaSamples = 1;

在这里插入图片描述
设置这行代码:

renderTextureDescriptor.colorFormat = RenderTextureFormat.ARGB32;

在这里插入图片描述
设置这行代码:

renderTextureDescriptor.dimension = TextureDimension.Tex2D;

此时正确运行了。

此时打开FameDebugger:
在这里插入图片描述

这个post effect一直在输出东西:
在这里插入图片描述

private void Draw()
{
    m_cmd.Clear();
    m_cmd.GetTemporaryRT(m_rtID, renderTextureDescriptor);
    m_cmd.SetRenderTarget(m_rtID, RenderBufferLoadAction.Load, RenderBufferStoreAction.Store);
    m_cmd.ClearRenderTarget(true, true, Color.yellow);
    RenderTargetIdentifier dest = m_rtID;
    dest = BuiltinRenderTextureType.CurrentActive;
    m_cmd.Blit(BuiltinRenderTextureType.CameraTarget, dest, m_copyMaterial2, 0);
    m_cmd.SetGlobalTexture(MainTex, m_rtID);
    m_cmd.DrawMesh(m_mesh, Matrix4x4.identity, m_copyMaterial, 0, 0, null);
    //m_cmd.ReleaseTemporaryRT(m_rtID);
}

修改之后的代码:

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;

public class RTDemo : MonoBehaviour
{
    private CommandBuffer m_cmd;
    public Camera m_camera;
    private int m_rtID;
    private Material m_copyMaterial;
    private Material m_copyMaterial2;
    private Material m_copyMaterial3;
    private Mesh m_mesh;
    public RenderTargetIdentifier m_cameraTarget;
    static int MainTex = Shader.PropertyToID("_MainTex2");
    static int m_xxx = Shader.PropertyToID("m_xxx");
    private RenderTextureDescriptor renderTextureDescriptor;

    private void OnEnable()
    {
        m_camera.forceIntoRenderTexture = true;
    }

    public void OnClickButton()
    {
        CreateMaterial();
        CreateCommandBuffer();
        AddCommandToCamera();
        CreateMesh();
        CreateRT();
    }

    private void CreateMaterial()
    {
        m_copyMaterial = new Material(Shader.Find("Unlit/CopyShader"));
        m_copyMaterial2 = new Material(Shader.Find("Hidden/MyBlitCopy"));
        m_copyMaterial3 = new Material(Shader.Find("Hidden/BlitCopyToCamera"));
    }

    private void CreateCommandBuffer()
    {
        m_cmd = new CommandBuffer();
        m_cmd.name = "post effect";
    }

    private void AddCommandToCamera()
    {
        m_camera.AddCommandBuffer(CameraEvent.BeforeImageEffects, m_cmd);
    }

    private void CreateRT()
    {
        m_rtID = Shader.PropertyToID("xxx222");
        renderTextureDescriptor = new RenderTextureDescriptor();
        renderTextureDescriptor.width = Screen.width;
        renderTextureDescriptor.height = Screen.height;
        renderTextureDescriptor.msaaSamples = 1;
        renderTextureDescriptor.colorFormat = RenderTextureFormat.ARGBHalf;
        renderTextureDescriptor.dimension = TextureDimension.Tex2D;
        renderTextureDescriptor.sRGB = false;
        m_cameraTarget = new RenderTargetIdentifier(BuiltinRenderTextureType.CameraTarget);
    }

    private void CreateMesh()
    {
        m_mesh = new Mesh { name = "Fullscreen Triangle" };
        m_mesh.SetVertices(new List<Vector3>{
                    new Vector3(-1f, -1f, 0f),
                    new Vector3(-1f,  3f, 0f),
                    new Vector3( 3f, -1f, 0f)
                });
        m_mesh.SetIndices(new[] { 0, 1, 2 }, MeshTopology.Triangles, 0, false);
        m_mesh.UploadMeshData(false);
    }

    private void Draw()
    {
        m_cmd.Clear();
        m_cmd.GetTemporaryRT(m_rtID, renderTextureDescriptor, FilterMode.Bilinear);
        m_cmd.SetRenderTarget(m_rtID, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store);
        //m_cmd.ClearRenderTarget(true, true, Color.yellow);
        m_cmd.Blit(BuiltinRenderTextureType.CameraTarget, m_rtID, m_copyMaterial2, 0);
        m_cmd.SetGlobalTexture(MainTex, m_rtID);

        //这里要重新开一个rt,否则使用的还是m_rtID,一个rt不能同时用于读写
        int dest = Shader.PropertyToID("dest");
        m_cmd.GetTemporaryRT(dest, renderTextureDescriptor, FilterMode.Bilinear);
        m_cmd.SetRenderTarget(dest);
        m_cmd.DrawMesh(m_mesh, Matrix4x4.identity, m_copyMaterial, 0, 0, null);

        //这里是拷贝到cameraTarget
        m_cmd.Blit(dest, BuiltinRenderTextureType.CameraTarget, m_copyMaterial3, 0);
        //m_cmd.ReleaseTemporaryRT(m_rtID);
    }

    private void Update()
    {
        if(m_rtID != 0)
        {
            Draw();
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值