网上关于这个6+版本URP后处理教程太少了QWQ,我在学习这个时在测试脚本中进行抓屏,要么屏幕全黑,要么一堆报错,网上也没找到解决办法,可能是我的抓拍方式有问题,附上后处理脚本代码
using System;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.RenderGraphModule;
using UnityEngine.Rendering.Universal;
public class SSPRFeature : ScriptableRendererFeature
{
public Texture2D renderTexture1;
public RenderTexture renderTexture2;
public RenderTexture renderTexture3;
public Material material;
public SSPRPass SSPRpass;
public string passName;
public RenderPassEvent renderPassEvent;
public override void Create()
{
SSPRpass = new SSPRPass(material, renderPassEvent, passName, renderTexture1, renderTexture2, renderTexture3);
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
SetupRenderPasses(renderer, renderingData);
renderer.EnqueuePass(SSPRpass);
}
public override void SetupRenderPasses(ScriptableRenderer renderer, in RenderingData renderingData)
{
base.SetupRenderPasses(renderer, renderingData);
SSPRpass.SetUp();
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
SSPRpass.Dispose();
}
}
public class SSPRPass : ScriptableRenderPass
{
private Material material;
private string PassName;
private RenderTexture renderTexture1;
private RTHandle RTHandle1;
private RTHandle RTHandle2;
private RTHandle RTHandle3;
private class PassData
{
internal TextureHandle textureHandle1,textureHandle2,textureHandle3;
internal Material material;
}
public SSPRPass(Material getMaterial ,RenderPassEvent getRenderPassEvent,string getPassName,Texture2D texture2D,RenderTexture renderTexture1,RenderTexture renderTexture2)
{
material = getMaterial;
renderPassEvent = getRenderPassEvent;
profilingSampler = new ProfilingSampler(getPassName);
PassName = getPassName;
RTHandle1 = RTHandles.Alloc(texture2D);
RTHandle3 = RTHandles.Alloc(renderTexture2);
this.renderTexture1 = renderTexture1;
}
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
{
var resourceData = frameData.Get<UniversalResourceData>();
TextureHandle cameraColorHandle = resourceData.activeColorTexture;
using (var builder = renderGraph.AddRasterRenderPass<PassData>(PassName, out var passData))
{
passData.material = material;
passData.textureHandle1 = renderGraph.ImportTexture(RTHandle1);
passData.textureHandle2 = cameraColorHandle;
passData.textureHandle3 = renderGraph.ImportTexture(RTHandle3);
builder.UseTexture(passData.textureHandle1);
builder.UseTexture(passData.textureHandle2);
builder.SetRenderAttachment(passData.textureHandle3, 0, AccessFlags.ReadWrite);
builder.SetRenderFunc<PassData>((PassData data, RasterGraphContext ctx) =>
{
data.material.SetTexture("AA", data.textureHandle1);
data.material.SetTexture("BB", data.textureHandle2);
});
}
}
public void SetUp()
{
Texture2D texture2D1 = new Texture2D(renderTexture1.width, renderTexture1.height);
Graphics.ConvertTexture(renderTexture1, texture2D1);
RTHandle2 = RTHandles.Alloc(texture2D1);
}
public void Dispose()
{
if (RTHandle1 != null) RTHandle1.Release();
if (RTHandle2 != null) RTHandle2.Release();
if (RTHandle3 != null) RTHandle3.Release();
}
}
测试shader中有正确传递AABB两张贴图
Shader "Unlit/SSPR"
{
Properties
{
AA("_BlitTexture",2D) = "white"{}
BB("_BlitTexture",2D) = "white"{}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
float4 _BlitScaleBias;
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D AA;
sampler2D BB;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 aa = tex2D(AA, i.uv);
fixed4 bb = tex2D(BB, i.uv);
return aa * bb;
}
ENDCG
}
}
}