Unity Shader 实现简单日夜变化

概要

来源为某项目需求,固定视角下,实现简易的海上场景及日夜变化。

整体架构流程

导入一张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。有机会再深入研究

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值