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();
}
}
}