在虚拟环境中,我们需要模拟材质球反射周围的环境,立方体反射正是让材质球反射出天空盒的背景的方法之一。
当我们观察物体时,物体表面足够光滑,再视线方向和物体相交的点上,能够看到物体映射的周围环境,交点上呈现的正是沿着反射方向观察到的物体。
1. 我们需要在同一空间(这里是世界空间)中计算 视线方向I、反射向量R;
视线方向: float3 I = posW -_WorldSpaceCameraPos.xyz;//摄像机指向顶点的方向
反射向量: o.R = reflect(I,N);//反射向量,cg内置函数
源代码:
Shader "JQM/CubeReflectCube"
{
Properties
{
_Reflectivity ("Reflectivity", Range (,)) = 0.5
_MainTex("Base", 2D) = "white"
_Environment ("Environment", Cube) = "white"
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D \_MainTex;
float4 \_MainTex\_ST;
samplerCUBE \_Environment;
float \_Reflectivity;
struct v2f
{
float4 pos : SV\_POSITION;
float2 uv : TEXCOORD0;
float3 R:TEXCOORD1;
};
v2f vert (appdata\_base v)
{
v2f o;
o.pos = mul(UNITY\_MATRIX\_MVP, v.vertex);
o.uv = TRANSFORM\_TEX(v.texcoord, \_MainTex);
float3 posW = mul(\_Object2World,v.vertex).xyz;
float3 I = posW -\_WorldSpaceCameraPos.xyz;//顶点到摄像机方向
float3 N = mul((float3x3)\_Object2World,v.normal);
N = normalize(N);
o.R = reflect(I,N);//反射向量
return o;
}
fixed4 frag (v2f i) : SV\_Target
{
float4 reflectiveColor = texCUBE(\_Environment,i.R);
float4 decalColor = tex2D(\_MainTex,i.uv);
float4 outp = lerp(decalColor,reflectiveColor,\_Reflectivity);
return outp;
}
ENDCG
}
}
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章