仿造整个网站,呼市网站建设公司,网站程序流程图,做整装的网站文章目录 前言一、上一篇文章中所需要的 lightmapUV 只有在烘焙时才会使用1、查看帮助文档后#xff0c;Unity中判断烘培是否开启#xff0c;使用的是LIGHTMAP_ON2、我们在 appdata 和 v2f 中#xff0c;定义第二套UV 前言
Unity中Shader的烘培分支的判断#xff0c;基于上… 文章目录 前言一、上一篇文章中所需要的 lightmapUV 只有在烘焙时才会使用1、查看帮助文档后Unity中判断烘培是否开启使用的是LIGHTMAP_ON2、我们在 appdata 和 v2f 中定义第二套UV 前言
Unity中Shader的烘培分支的判断基于上一篇文章继续实现 GI Shader
Unity中Shader的GI相关数据的准备 一、上一篇文章中所需要的 lightmapUV 只有在烘焙时才会使用 即只有在 BackGI 和 RealtimeGI 下才会使用到 lightmapUV ,所以我们需要用分支来区别 1、查看帮助文档后Unity中判断烘培是否开启使用的是LIGHTMAP_ON DYNAMICLIGHTMAP_ON :RealtimeGI是否开启LIGHTMAP_ON当对象标记为LightMap Static并且场景烘焙后开启 所以我们在Pass中修改 LightMode 为 ForwardBase 定义 multi_compile_fwdbase 变体 Tags{“LightMode”“ForwardBase”} CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_fwdbase 2、我们在 appdata 和 v2f 中定义第二套UV
1.在appdata中第二套UV对应的语义是 TEXCOORD1这是不能乱改的struct appdata { float4 vertex : POSITION; //定义第二套 UV appdata 对应的固定语义为 TEXCOORD1 #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) float4 lightmapUV : TEXCOORD1; #endif }; 2.在 v2f 中也定义第二套UV不过这里没有语义限制struct v2f { float4 vertex : SV_POSITION; float4 worldPos : TEXCOORD0; #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) float4 lightmapUV : TEXCOORD1; #endif }; 3.在顶点着色器中对其采样float4 lightmapUV; // .xy static lightmap UV, .zw dynamic lightmap UV lightmapUV的XY代表的是BackGI lightmapUV的ZW代表的是RealTimeGI //对第二套UV进行纹理采样,这个unity_LightmapST类似于之前我们定义纹理的Tilling 和 Offset #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) o.lightmapUV.xy v.lightmapUV * unity_LightmapST.xy unity_LightmapST.zw; #endif 4.在片元着色器对其赋值#if defined(DYNAMICLIGHTMAP_ON) || defined(LIGHTMAP_ON) giInput.lightmapUV i.lightmapUV; #endif 以下是准备好所有数据后的代码
//在这里里面使用 自定义的 cginc 来实现全局GI
//GI数据的准备
//烘培分支的判断
Shader MyShader/P1_8_4
{SubShader{Tags { RenderTypeOpaque }Pass{Tags{LightModeForwardBase}CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile DYNAMICLIGHTMAP_ON#pragma multi_compile LIGHTMAP_ON#include UnityCG.cginc#include AutoLight.cginc#include Lighting.cginc#include CGIncludes/MyGlobalIllumination.cgincstruct appdata{float4 vertex : POSITION;//定义第二套 UV appdata 对应的固定语义为 TEXCOORD1#if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON)float4 lightmapUV : TEXCOORD1;#endif};struct v2f{float4 vertex : SV_POSITION;float4 worldPos : TEXCOORD0;//定义第二套UV#if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON)float4 lightmapUV : TEXCOORD1;#endif};v2f vert (appdata v){v2f o;o.vertex UnityObjectToClipPos(v.vertex);o.worldPos mul(unity_ObjectToWorld,v.vertex);//对第二套UV进行纹理采样#if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON)o.lightmapUV.xy v.lightmapUV * unity_LightmapST.xy unity_LightmapST.zw;#endifreturn o;}fixed4 frag (v2f i) : SV_Target{//1、准备 SurfaceOutput 的数据SurfaceOutput o;//目前先初始化为0使用Unity自带的方法把结构体中的内容初始化为0UNITY_INITIALIZE_OUTPUT(SurfaceOutput,o)//2、准备 UnityGIInput 的数据UnityGIInput giInput;//初始化UNITY_INITIALIZE_OUTPUT(UnityGIInput,giInput);//修改用到的数据giInput.light.color _LightColor0;giInput.light.dir _WorldSpaceLightPos0;giInput.worldPos i.worldPos;giInput.worldViewDir normalize(_WorldSpaceCameraPos - i.worldPos);giInput.atten 1;giInput.ambient 0;#if defined(DYNAMICLIGHTMAP_ON) || defined(LIGHTMAP_ON)giInput.lightmapUV i.lightmapUV;#endif//3、准备 UnityGI 的数据UnityGI gi;//直接光照数据主平行光gi.light.color _LightColor0;gi.light.dir _WorldSpaceLightPos0;//间接光照数据(目前先给0)gi.indirect.diffuse 0;gi.indirect.specular 0;LightingLambert_GI1(o,giInput,gi);return 1;}ENDCG}}
}