/*
延迟渲染主要包含了两个Pass。在第一个Pass中,我们不进行任何光照计算,而是仅仅计算哪些片元是可见的,
这主要是通过深度缓冲技术来实现,当发现一个片元是可见的,我们就把它的相关信息存储到G缓冲区中。
然后,在第二个Pass中,我们利用G缓冲区的各个片元信息,例如表面法线、视角方向、漫发射系数等,进行真正的光照计算。
延迟渲染缺点:
1,不支持真正的抗锯齿功能。
2,不能处理半透明物体。
3,对显卡有一定要求。如果要使用延迟渲染的话,显卡必须支持MRT、Shader Mode 3.0及以上、深度渲染纹理以及双面的模板缓冲。
优点:
1,所有光都是逐像素光源。计算复杂度前向渲染 O(m*n),延迟渲染O(m+n)。
2,制作后处理等,可直接获取深度值。
*/
Shader "Unlit/Deferred_01"
{
Properties
{
_MainTex("Texture",2D) = "white" {}
_Diffuse("Diffuse",Color) = (1,1,1,1)
_Specular("Specular", Color) = (1,1,1,1)
_Gloss("Gloss", Range(8.0, 50)) = 20
}
SubShader
{
Tags { "RenderType" = "Opaque" }
LOD 100
Pass
{
//延迟渲染
Tags{"LightMode" = "Deferred"}
CGPROGRAM
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag
//代表排除不支持MRT的硬件
#pragma exclude_renderers norm
#pragma multi_compile __ UNITY_HDR_ON
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Diffuse;
fixed4 _Specular;
float _Gloss;
struct appdata
{
float4 vertex :POSITION;
float2 uv : TEXCOORD0;
float3 normal:NORMAL;
};
struct v2f
{
float2 uv: TEXCOORD0;
float4 vertex : SV_POSITION;
float3 worldNormal : TEXCOORD1;
float3 worldPos : TEXCOORD2;
};
//四个渲染纹理
struct DeferredOutput
{
//格式是ARGB32(每个通道8位),RGB通道用于存储漫反射颜色,A通道储存遮挡。
float4 gBuffer0 : SV_TARGET0;
//格式是ARGB32(每个通道8位),RGB通道用于存储高光反射颜色,A通道同于用于存储高光反射的指数部分。
float4 gBuffer1 : SV_TARGET1;
//格式是ARGB2101010,RGB通道用于存储世界空间法线,A通道没有被使用。
float4 gBuffer2 : SV_TARGET2;
//格式是ARGB2101010/ARGBHalf(每个通道16位),
//(低动态光照渲染/高动态光照渲染)用于存储自发光+lightmap+反射探针深度缓冲和模板缓冲。
//当在第二个Pass中计算光照时,默认情况下仅可以使用Unity内置的Standard 光照模型。
float4 gBuffer3 : SV_TARGET3;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv,_MainTex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
return o;
}
DeferredOutput frag(v2f i)
{
DeferredOutput o;
fixed3 color = tex2D(_MainTex, i.uv).rgb * _Diffuse.rgb;
//漫反射计算
o.gBuffer0.rgb = color;
o.gBuffer0.a = 1;
//高光计算
o.gBuffer1.rgb = _Specular.rgb;
o.gBuffer1.a = _Gloss/50.0;
//世界空间法线计算
o.gBuffer2 = float4(i.worldNormal * 0.5 + 0.5,1);
#if !defined(UNITY_HDR_ON)
color.rgb = exp2(-color.rgb);
#endif
//模板缓冲-颜色值
o.gBuffer3 = fixed4(color,1);
return o;
}
ENDCG
}
}
}
延迟渲染
最新推荐文章于 2024-04-25 21:43:51 发布