CommandBuffer的相关内容参考如下,其用于扩展Build-in的管线,(LWRP中是否好用呢?)
https://docs.unity3d.com/Manual/GraphicsCommandBuffers.html
总结几点:
public void OnWillRenderObject() 中创建 CommandBuffer
buf.Blit (BuiltinRenderTextureType.CurrentActive, screenCopyID);获取当前Buffer中的颜色信息
其与GrabTexture原理是一样的。只不过后者在一些平台上支持不是很好。
模糊的代码如下:
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Hidden/SeparableGlassBlur" {
Properties {
_MainTex ("Base (RGB)", 2D) = "" {}
}
CGINCLUDE
#include "UnityCG.cginc"
struct v2f {
float4 pos : POSITION;
float2 uv : TEXCOORD0;
float4 uv01 : TEXCOORD1;
float4 uv23 : TEXCOORD2;
float4 uv45 : TEXCOORD3;
};
float4 offsets;
sampler2D _MainTex;
v2f vert (appdata_img v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv.xy = v.texcoord.xy;
o.uv01 = v.texcoord.xyxy + offsets.xyxy * float4(1,1, -1,-1);
o.uv23 = v.texcoord.xyxy + offsets.xyxy * float4(1,1, -1,-1) * 2.0;
o.uv45 = v.texcoord.xyxy + offsets.xyxy * float4(1,1, -1,-1) * 3.0;
return o;
}
half4 frag (v2f i) : COLOR {
half4 color = float4 (0,0,0,0);
color += 0.40 * tex2D (_MainTex, i.uv);
color += 0.15 * tex2D (_MainTex, i.uv01.xy);
color += 0.15 * tex2D (_MainTex, i.uv01.zw);
color += 0.10 * tex2D (_MainTex, i.uv23.xy);
color += 0.10 * tex2D (_MainTex, i.uv23.zw);
color += 0.05 * tex2D (_MainTex, i.uv45.xy);
color += 0.05 * tex2D (_MainTex, i.uv45.zw);
return color;
}
ENDCG
Subshader {
Pass {
ZTest Always Cull Off ZWrite Off
Fog { Mode off }
CGPROGRAM
#pragma fragmentoption ARB_precision_hint_fastest
#pragma vertex vert
#pragma fragment frag
ENDCG
}
}
Fallback off
} // shader
LWRP中引入了新的方式,但以下两个Texture,在ShaderGraph中
对应以下两个结点,如下所示,通过屏幕坐标,做为UV对SceneColor进行采样,并进行简单的抖动
效果如下:
Shader的代码,我们可以看到,以下代码是开启了Opaque功能
// Defines generated by graph
#define REQUIRE_OPAQUE_TEXTURE
简单总结一下Shader Graph的生成的代码
由三个Pass组成StandardUnlit ShadowCaster DepthOnly 后两者根据名字也能知道其使用了。与标准管线基本一致。
获取物体的Clip后坐标为o.position = TransformObjectToHClip(v.vertex.xyz);
Shader "Unlit Master"
{
Properties
{
[NoScaleOffset] Texture2D_102D9201("Texture2D", 2D) = "white" {}
}
SubShader
{
Tags
{
"RenderPipeline"="LightweightPipeline"
"RenderType"="Transparent"
"Queue"="Transparent+0"
}
Pass
{
Name "StandardUnlit"
Tags{"LightMode" = "LightweightForward"}
// Material options generated by graph
Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha
Cull Back
ZTest LEqual
ZWrite Off
HLSLPROGRAM
// Required to compile gles 2.0 with standard srp library
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x
#pragma target 2.0
// -------------------------------------
// Lightweight Pipeline keywords
#pragma shader_feature _SAMPLE_GI
// -------------------------------------
// Unity defined keywords
#pragma multi_compile _ DIRLIGHTMAP_COMBINED
#pragma multi_compile _ LIGHTMAP_ON
#pragma multi_compile_fog
//--------------------------------------
// GPU Instancing
#pragma multi_compile_instancing
#pragma vertex vert
#pragma fragment frag
// Defines generated by graph
#define REQUIRE_OPAQUE_TEXTURE
// Lighting include is needed because of GI
#include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/Lighting.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
#include "Packages/com.unity.render-pipelines.l