一、在unity场景中如何添加反射探针?
可以先添加一个空对象,在空对象的上方添加反射探针组件(Reflection Probe)
反射探针的类型有:Baked、Custom、Realtime
其中“Baked”反射探针类型,可以将场景中的静态对象烘焙到一张立方体纹理中
"Custom"类型的反射探针可以自定义添加立方体纹理
"Realtime"类型的反射探针可以实时的反射场景中的画面,无论对象是否为静态
二、在Shader中读取反射探针中所得到的立方体纹理画面
首先利用反射向量R对unity中的存储的立方体纹理进行采样
flixed4 cubeMap = UNITY_SAMPLE_TEXCUBE ( unity_SpecCube0 , R );
然后再对采样后的cubeMap进行解码(注意解码后的为fixed3类型)
fixed3 skyColor = DecodeHRD ( cubeMap , unity_SpecCube0_HDR );
unity_SpecCube0 是由反射探针实现并存储在unity中的立方体纹理贴图
利用 UNITY_SAMPLE_TEXCUBE( ) 对纹理进行采样
利用 DecodeHRD(cubeMap,unity_SpecCube0_HDR) 对采样后的立方体纹理进行解码
Shader"unity/Probe02"
{Properties{}SubShader{Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdate{float4 vertex:POSITION;float3 normal:NORMAL;};struct v2f{float4 pos:SV_POSITION;float3 worldNormal:TEXCOORD;float4 worldPos:TEXCOORD1;};v2f vert(appdate v){v2f o;o.pos=UnityObjectToClipPos(v.vertex);o.worldPos=mul(unity_ObjectToWorld,v.vertex);o.worldNormal=UnityObjectToWorldNormal(v.normal);return o;}float4 frag(v2f i):SV_TARGET{//V是由模型指向摄像机方向的向量,也就是指向视角方向的向量fixed3 V=_WorldSpaceCameraPos-i.worldPos;//法向量fixed3 N=normalize(i.worldNormal);//由视角入射方向向量和法向量求得反射向量fixed3 R=reflect(-V,N);//对unity_SpecCube0进行采样fixed4 cubeMap=UNITY_SAMPLE_TEXCUBE(unity_SpecCube0,R);//解码采样后的cubeMap(注意结果为三维向量)fixed3 skyColor=DecodeHDR(cubeMap,unity_SpecCube0_HDR);return fixed4(skyColor,1);}ENDCG}}}