diff options
Diffstat (limited to 'Assets/Bundle/Shaders/Common/common_gbuffer.shader')
-rw-r--r-- | Assets/Bundle/Shaders/Common/common_gbuffer.shader | 175 |
1 files changed, 110 insertions, 65 deletions
diff --git a/Assets/Bundle/Shaders/Common/common_gbuffer.shader b/Assets/Bundle/Shaders/Common/common_gbuffer.shader index 485a52c1..c682d8fa 100644 --- a/Assets/Bundle/Shaders/Common/common_gbuffer.shader +++ b/Assets/Bundle/Shaders/Common/common_gbuffer.shader @@ -1,68 +1,113 @@ Shader "Erika/Common/GBuffer"
{
- Properties
- {
- _MainTex ("Texture", 2D) = "white" {}
- }
- SubShader
- {
- Tags { "RenderType"="Opaque" }
- LOD 100
-
- Pass
- {
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
-
- #include "UnityCG.cginc"
-
- struct appdata
- {
- float3 vertex : POSITION;
- float3 normal : NORMAL;
- float3 tangent : TANGENT;
- float2 uv : TEXCOORD0;
- };
-
- struct v2f
- {
- float2 uv : TEXCOORD0;
- float3 normal : TEXCOORD1;
- float3 worldPos : TEXCOORD2;
- float4 vertex : SV_POSITION;
- };
-
- struct Output
- {
- float4 diffuse : SV_Target0;
- float4 normal : SV_Target1;
- float4 position : SV_Target2;
- float4 texCoord : SV_Target3;
- };
-
- sampler2D _MainTex;
- float4 _MainTex_ST;
-
- v2f vert (appdata v)
- {
- v2f o;
- o.vertex = UnityObjectToClipPos(v.vertex);
- o.uv = TRANSFORM_TEX(v.uv, _MainTex);
- o.worldPos = mul(unity_ObjectToWorld, float4(v.vertex, 1)).xyz;
- return o;
- }
-
- Output frag (v2f i)
- {
- Output o;
- fixed4 col = tex2D(_MainTex, i.uv);
- o.diffuse = fixed4(1,0,0,1);
- o.normal = fixed4(1,1,0,1);
- o.position = fixed4(i.worldPos, 1);
- return o;
- }
- ENDCG
- }
- }
+ //unity参数入口 + Properties + { + _MainTex("贴图",2D) = "white"{} + _Diffuse("漫反射",Color) = (1,1,1,1) + _Specular("高光色",Color) = (1,1,1,1) + _Gloss("平滑度",Range(1,100)) = 50 + } + + 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 + // unity 函数库 + #include"UnityCG.cginc" + //定义UNITY_HDR_ON关键字 + //在c# 中 Shader.EnableKeyword("UNITY_HDR_ON"); Shader.DisableKeyword("UNITY_HDR_ON"); + // 设定hdr是否开启 + #pragma multi_compile __ UNITY_HDR_ON + // 贴图 + sampler2D _MainTex; + // 题图uv处理 + float4 _MainTex_ST; + // 漫反射光 + float4 _Diffuse; + // 高光 + float4 _Specular; + // 平滑度 + float _Gloss; + // 顶点渲染器所传入的参数结构,分别是顶点位置、法线信息、uv坐标 + struct a2v + { + float4 pos:POSITION; + float3 normal:NORMAL; + float2 uv:TEXCOORD0; + }; + // 片元渲染器所需的传入参数结构,分别是像素位置、uv坐标、像素世界位置、像素世界法线 + struct v2f + { + float4 pos:SV_POSITION; + float2 uv : TEXCOORD0; + float3 worldPos:TEXCOORD1; + float3 worldNormal:TEXCOORD2; + }; + // 延迟渲染所需的输出结构。正向渲染只需要输出1个Target,而延迟渲染的片元需要输出4个Target + struct DeferredOutput + { + //// RGB存储漫反射颜色,A通道存储遮罩 + //float4 gBuffer0:SV_TARGET0; + //// RGB存储高光(镜面)反射颜色,A通道存储高光反射的指数部分,也就是平滑度 + //float4 gBuffer1:SV_TARGET1; + //// RGB通道存储世界空间法线,A通道没用 + //float4 gBuffer2:SV_TARGET2; + //// Emission + lighting + lightmaps + reflection probes (高动态光照渲染/低动态光照渲染)用于存储自发光+lightmap+反射探针深度缓冲和模板缓冲 + //float4 gBuffer3:SV_TARGET3; + float4 normal : SV_TARGET0; + float4 position : SV_TARGET1; + }; + // 顶点渲染器 + v2f vert(a2v v) + { + v2f o; + // 获取裁剪空间下的顶点坐标 + o.pos = UnityObjectToClipPos(v.pos); + // 应用uv设置,获取正确的uv + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + // 获取顶点的世界坐标 + o.worldPos = mul(unity_ObjectToWorld, v.pos).xyz; + // 获取世界坐标下的法线 + o.worldNormal = UnityObjectToWorldNormal(v.normal); + return o; + } + // 片元着色器 + DeferredOutput frag(v2f i) + { + DeferredOutput o; + //// 像素颜色 = 贴图颜色 * 漫反射颜色 + //fixed3 color = tex2D(_MainTex, i.uv).rgb * _Diffuse.rgb; + //// 默认使用高光反射输出!! + //o.gBuffer0.rgb = color; // RGB存储漫反射颜色,A通道存储遮罩 + //o.gBuffer0.a = 1; // 漫反射的透明度 + //o.gBuffer1.rgb = _Specular.rgb; // RGB存储高光(镜面)反射颜色, + //o.gBuffer1.a = _Gloss / 100; // 高光(镜面)反射颜色 的 + //o.gBuffer2 = float4(i.worldNormal * 0.5 + 0.5, 1); // RGB通道存储世界空间法线,A通道没用 + //// 如果没开启HDR,要给颜色编码转换一下数据exp2,后面在lightpass2里则是进行解码log2 + //#if !defined(UNITY_HDR_ON) + // color.rgb = exp2(-color.rgb); + //#endif + //// Emission + lighting + lightmaps + reflection probes (高动态光照渲染/低动态光照渲染)用于存储自发光+lightmap+反射探针深度缓冲和模板缓冲 + //o.gBuffer3 = fixed4(color, 1); + o.normal = float4(i.worldNormal * 0.5 + 0.5, 1); + o.position = float4(i.worldPos, 1); + return o; + } + ENDCG + } + } }
|