距离上次技术相关的博文有半年了吧。。。这次回来了,会坚持下去。
说到反射纹理,本质上就是创建一个 CubeMap 立方体贴图, 把需要被反射的目标渲染的6个纹理上, 然后反射的物体根据自身的法线方向在对应的6个面上进行采样。
一步一步来

首先创建一个CubeMap纹理
在project面板上右键->Create->Legacy->CubeMap
然后在Inspector面板上将前后左右上下的纹理添加进去 like this..
cubemaptex
创建好后,不如把它作为天空盒吧,这样到时候反射物体可以直接反射周围的天空的说,说干就干。。
首选创建一个材质,设置材质的Shader为skybox->Cubemap,然后把刚才创建的纹理赋予它 like this
cubemapmat
打开菜单 Window->Lighting 将创建的材质放入 SkyBox槽位,我们就能看见天空啦
skyboxview

之后我们需要编写一个Shader来对天空盒的cubemap 进行采样,就是反射啦
[cc language=”cpp”]
Shader “Custom/CubeMap” {
Properties {
_Cube(“Reflection Map”, Cube) = “” {}
}
SubShader {
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

#include “UnityCG.cginc”

uniform samplerCUBE _Cube;

struct vertexInput
{
float4 vertex : POSITION;
float3 normal : NORMAL;
};

struct vertexOutput
{
float4 pos : SV_POSITION;
float3 normalDir : TEXCOORD0;
float3 viewDir : TEXCOORD1;
};

vertexOutput vert(vertexInput input)
{
vertexOutput output;

float4x4 modelMatrix = _Object2World;
float4x4 modelMatrixInverse = _World2Object;

//计算视野方向,世界空间顶点与世界空间内相机位置相减
output.viewDir = mul(modelMatrix, input.vertex).xyz – _WorldSpaceCameraPos;
//将法线从模型空间也统一转换到世界空间
output.normalDir = normalize(mul(float4(input.normal, 0.0), modelMatrixInverse).xyz);
output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
return output;
}

float4 frag(vertexOutput input) :COLOR
{
//计算视线方向与法线法线方向的反射向量
float3 reflectDir = reflect(input.viewDir, input.normalDir);
//texCUBE是CubeMap采样,tex2D是2D纹理采样
return texCUBE(_Cube, reflectDir);
}

ENDCG
}
}
FallBack “Diffuse”
}
[/cc]
Continue reading