Shader学习 基于vert/frag顶点片段级的纹理采样 光照贴图实现

通过对纹理采样的Shader学习,明白了几点:

1.  _MainTex_ST  :这个是纹理名 + _ST的float4变量,其实就是Unity为我们提供好的直接获取到的UV的缩放与偏移值,刚好四个值,凑成一个float4:


2.顶点UV值的获取:在unitycg.cginc中的appdata_full中的texcoord.xy, 如果需要支持光照贴图,光照贴图的uv存在texcoord1.xy中:


3.TRANSFORM_TEX宏就是对uv值的缩放与偏移计算,因为光照贴图默认名字为unity_LightmapST,不是_ST,所以不能直接用这个宏代替:


实时光源效果图:


关掉光源效果图,背景变黑了,但是之前场景中烘焙好的这几个模型,光照贴图效果生效了:


下面是没有对光照贴图进行采样的效果图:


当然之前需要对场景中需要用到光照贴图的东西进行光照烘焙生成光照贴图,大概过程如下

1.需要烘焙的模型下拉菜单中选择Lightmap static

2.需要用到光源模型选为Baked


3.光照窗口中AmbientMode选为Baked模式,点击右下角的Generate Lighting就开始对场景进行烘焙了.


之前看到过一篇比较详细的介绍,我转载了一下:http://blog.csdn.net/Vitens/article/details/79405143


Shader代码如下:

Shader "Custom/UVTest" {
	Properties{
		_MainTex("MainTex",2d) = ""{}
	}


	SubShader{
		pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "unitycg.cginc"

			sampler2D _MainTex;
			float4 _MainTex_ST;

			//sampler2D unity_lightmap;

			struct v2f
			{
				float4 pos : POSITION;
				float2 uv : TEXCOORD0;
				float2 uv2 : TEXCOORD1;//光照贴图UV
			};


			v2f vert(appdata_full v)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);

				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				o.uv2 = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;//光照贴图的UV

				return o;
			}

			fixed4 frag(v2f IN) :COLOR
			{
				fixed4 color = tex2D(_MainTex, IN.uv);
				color.rgb *= DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, IN.uv2));//光照贴图的颜色值解码
				return color;
			}

			ENDCG
		}
	}
}


发布了23 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Vitens/article/details/79382170