概要
来源为某项目需求,固定视角下,实现简易的海上场景及日夜变化。
整体架构流程
导入一张Cubemap,编写shader进行旋转和变色
技术细节
- 导入天空背景图像,设为Cubemap格式
-
编写shader
核心代码如下:
由于项目要求,定义了变量_Daytime来控制时间,范围为0-4
通过重新采样实现图像的旋转
fixed angle = _Daytime * radians(90);
//通过angle控制图像旋转
fixed finalx = cos(angle)*i.vertexLocal.x - sin(angle)*i.vertexLocal.y;
fixed finaly = sin(angle)*i.vertexLocal.x + cos(angle)*i.vertexLocal.y;
//旋转后的采样位置
fixed4 col = texCUBE(_CubeMap, normalize(fixed3(finalx,finaly,i.vertexLocal.z)));
//对输入图像重新采样
加入海面,对背景下半部分进行遮挡
定义4个_MainColor,对应正午、傍晚、夜晚、早晨,与背景图像相乘
fixed4 colsample = col *(_MainColor * (1 -saturate(abs(_Daytime - 0)* 4 - 3))
+ _MainColor2 * (1 - saturate(abs(_Daytime - 1) * 4))
+ _MainColor3 * (1 - saturate(abs(_Daytime - 2)* 4- 3))
+ _MainColor4 * (1 - saturate(abs(_Daytime - 3)* 4))
+ _MainColor * (1 - saturate(abs(_Daytime - 4)* 4- 3)));
//输入图像变色,这里手动限制了比例,正午和夜晚占比高。
-
使用Shader建立材质
-
在main camera添加对应的Skybox组件
-
编写C#脚本,使用SetFloat设置材质的参数
public Material _sky;
public void UpdateSky( float daytime)
{
_sky.SetFloat("_Daytime", daytime);
}
-
日夜变化过程中,海面可以用同样的方法做变色。最终效果:
小结
项目要求比较简单,借这个机会入门shader。有机会再深入研究