天空盒子製作
準備:unity 5.4.1,天空盒子紋理貼圖(6張或者3張都行,看你要什麼樣的天空盒子)
1.project視圖右鍵->Create ->legacy->CubeMap.再把天空盒子紋理貼圖按名字選好。紋理貼圖分辨率和天空盒子的face size都統一設置爲256即可。
2.創建材質球命名SkyBoxMat和新建相應的shader:SkyBox
Shader "LT/SkyBox"
{
Properties
{
_Cubemap("Reflect Cubemap",Cube) = "white"{} //模擬反射的環境映射紋理
}
SubShader
{
Tags {
"RenderType"="Opaque" //着色器分類不透明
"Queue"="Geometry" //不透明物體
"ForceNoShadowCasting"="True" //表示不產生陰影
"IgnoreProjector"="True" //表示不接受陰影
"LightMode"="Always" //永遠都渲染,但不處理光照
}
Pass
{
Fog {Mode Off} //關閉霧模式
cull front
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0 //定義Shader模型爲Shader Model 3.0, 3.0, Direct3D 9。支持512張貼圖 + 512個計算
//用低精度,最快的
#pragma fragmentoption ARB_precision_hint_fastest
#pragma exclude_renderers flash //不在flash 平臺編譯
#include "UnityCG.cginc"
#include "AutoLight.cginc" //天空盒子
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 pos : SV_POSITION;
float3 cam : TEXCOORD0;
};
samplerCUBE _Cubemap;
v2f vert (appdata v)
{
v2f o;
float3 worldVertex = mul(unity_ObjectToWorld,v.vertex);
//物體反射到計算機中的方向可由光路可逆的原則求的,也就是說通過計算視角方向關於法線的反射方向來求得入射光的方向
//worldViewDir爲世界座標系下的視角方向,既視角(相機)到頂點的方向
//reflect要求入射向量是由光源指向交點處worldViewDir得先取反
o.cam =-UnityWorldSpaceViewDir(worldVertex);
// o.cam = worldVertex- _WorldSpaceCameraPos; //與上面這句等價
o.pos = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = texCUBE(_Cubemap, i.cam);
return col;
}
ENDCG
}
}
}