[置頂] Cg入門22:Fragment shader - 2D紋理采樣(光照貼圖制作和使用)


一、光照貼圖制作: 實時光照效果:
使用光照貼圖步驟: 1.選擇要燈光貼圖的模型,然后設置為Lightmap Static
2.光源Baking設置為Baked
3.選擇Windows/Lighting,打開Lighting界面, 1》選擇Scene 選項卡,設置Ambient Gi為Baked 2》選擇LightMaps 選項卡,然后按Build,生成光照貼圖 數秒后LightMaps界面會顯示光照貼圖,效果如下:
3》關掉場景中的Light (使用光照貼圖后的效果:平台差異導致的)
移動物體后效果
二、光照貼圖的Shader使用:
uv:紋理貼圖坐標 unity_LightmapST:紋理坐標縮放偏移向量 v.texcoord:就是uv坐標
模型展開的UV坐標信息,包含在模型網格中了。
源代碼:
// Upgrade NOTE: commented out 'float4 unity_LightmapST', a built-in variable// Upgrade NOTE: commented out 'sampler2D unity_Lightmap', a built-in variable

Shader "Sbin/TexShader2"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

sampler2D _MainTex;
float4 _MainTex_ST;//紋理縮放偏移向量(Unity默認此變量賦值,變量名規則:紋理名_ST)

// sampler2D unity_Lightmap;//若開啟光照貼圖,系統默認填值
// float4 unity_LightmapST;//與上unity_Lightmap同理

struct v2f{
float4 pos:POSITION;
float2 uv:TEXCOORD0;
float2 uv2:TEXCOORD1;
};

v2f vert (appdata_full v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
//第一種方式:
//o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
//第二種方式:內建宏,雙方和第一種一樣,只是對第一種計算的封裝
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);

o.uv2 = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;

return o;
}

fixed4 frag (v2f v) : COLOR
{
//解密光照貼圖計算公式
float3 lightmapColor = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap,v.uv2));
fixed4 col = tex2D(_MainTex, v.uv);//第一個參數:紋理,第二個參數UV向量
col.rgb *= lightmapColor;
return col;
}
ENDCG
}
}
}




注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com