延迟渲染

/*
延迟渲染主要包含了两个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
		}
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值