示例
Shader "Custom/CubeTest"
{
Properties
{
_Cube ("Reflection Cubemap", Cube) = "_Skybox" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
//模型空间坐标
float4 vertex : POSITION;
//模型空间法线
float3 normal : NORMAL;
};
struct v2f
{
//裁剪空间坐标
float4 pos : SV_POSITION;
//天空盒uv坐标
float3 uv : TEXCOORD0;
};
sampler2D _MainTex;
float4 _MainTex_ST;
samplerCUBE _Cube;
v2f vert (appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
//模型空间中的视图方向
float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));
//根据入射光方向向量 I,和顶点法向量 N,计算反射光方向向量。
//其中 I 和 N 必须被归一化,需要非常注意的是,这个 I 是指向顶点的;
//函数只对三元向量有效
o.uv = reflect(-viewDir, v.normal);
//将uv从模型空间转到视图空间
o.uv = mul(UNITY_MATRIX_MV, float4(o.uv,0));
return o;
}
fixed4 frag (v2f i) : SV_Target
{
//在视图空间中对天空盒采样,就可以反射出周围环境
return texCUBE(_Cube, i.uv);
}
ENDCG
}
}
}
效果