当前位置: 首页 > news >正文

假云阴影模拟

云阴影效果简介

这里说的云阴影,是使用噪声图或者特定规律的随机图模拟的假云阴影。效果类似于大片云投影在大地上,同时阴影按照一定速度移动和随机流动变化,并且支持双层阴影叠加。

全局参数

请添加图片描述

全局云阴影开关

可以看到,有一个是否启用(Enable)的全局开关控制是否开启全局云阴影。这可以使用全局变体实现,由于全局变体无法剔除,容易引入变体爆炸问题。因此,最好使用材质局部变体替代。

云阴影颜色

有一个全局的云阴影颜色用于调整整体的云阴影颜色,比如可以调出红色等特殊颜色的云阴影,默认是黑色。

云阴影参数

从参数设置可以看到,云阴影分为两层。每层有大小、强度、方向、速度以及噪声的强度、速度、tiling。噪声是为了模拟云阴影边缘的快速变化抖动效果。同时,需要一张云阴影贴图来控制这两层的参数;规定贴图的R、G通道是第一层阴影的强度和噪声的强度,B、A通道是第二层阴影的强度和噪声的强度。

Shader或者材质参数

请添加图片描述

材质云阴影开关

Shader上有专门的变体开关控制是否激活云阴影。这里针对的是当前材质的开关,使用local变体即可满足据要求。

材质云阴影强度

同时,有一个强度滑块控制该材质的云阴影强度。这样,可以定制不同材质接收到云阴影强度。

实现原理

修改albedo

#if _GLOBAL_CLOUD_SHADOWsurfaceData.albedo = ApplyGlobalCloudShadow修改(surfaceData.albedo, input.positionWS, _CloudShadowIntensity);
#endif

从上述代码可以看到,在开启变体_GLOBAL_CLOUD_SHADOW时候,使用函数ApplyGlobalCloudShadow修改albedo。

计算CloudShadow

inline half3 ApplyGlobalCloudShadow(half3 albedo, float3 positionWS, half intensity = 1.0f)
{half firstCloudShadowIntensity = GetFirstGlobalCloudShadowIntensity(positionWS);half secondCloudShadowIntensity = GetSecondGlobalCloudShadowIntensity(positionWS);albedo *= lerp(half3(1, 1, 1), _CloudShadowColor, intensity * max(firstCloudShadowIntensity, secondCloudShadowIntensity));return albedo;
}
  1. 函数ApplyGlobalCloudShadow首先计算两层云阴影强度,再使用max获得两层的最大强度(两层阴影叠加的位置取最大值)作为云阴影强度。
  2. 然后使用这个云阴影强度在白色与云阴影颜色之间进行插值获得最终的云阴影颜色。
  3. 最终,将该云阴影颜色乘到albedo上。

计算单层CloudShadow强度

该函数代码比较关键,不再直接提供源码,有需要的可以理解后再自行实现。

  1. 使用传入的positionWS计算出worldUV。
  2. 使用worldUV结合云阴影的大小、速度计算出云阴影的位置(cloudUV),然后使用cloudUV采用贴图的R通道获得云阴影强度。
  3. 使用worldUV结合云阴影噪声的速度、tiling计算出云阴影噪声的位置(cloudNoiseUV),然后使用cloudNoiseUV采用贴图的B通道获得云阴影噪声强度。
  4. 将云阴影强度和云阴影噪声强度进行叠加获得整体的云阴影强度。注意:叠加算法很关键,需要使用PS的线性加深模式。

整体效果

请添加图片描述
更精细的效果可以参考文章:假云阴影模拟

相关文章:

  • 数字孪生三维建模+虚拟仿真,构建可预测的未来工厂
  • QT采用mqtt进行通信(17.1)
  • 小波变换和图像的融合
  • 征程 6 逆向自证 hbm 与 bc 一致性
  • Spring系列五:手动实现Spring底层机制 第一部分
  • 在 Conda 中,包的安装路径在电脑的哪里
  • SwiftUI 10.Toggle介绍和使用
  • 无人设备遥控器之实时数据保护技术篇
  • 60、微服务保姆教程(三)Sentinel---高可用流量管理框架/服务容错组件
  • 新时代下的存储过程开发实践与优化
  • 模板方法模式(Template Method Pattern)
  • 计算机考研精炼 计网
  • Python爬虫技术全解析:从入门到实战的终极指南大纲(深度解读与扩展)
  • 02_使用 AES 算法实现文件加密上传至阿里云、解密下载
  • AGV、AMR机器人控制器x86/RK3588/NV各有什么优劣势?
  • 数量关系6_排列组合、概率
  • 【QT】QT控制硬件
  • vuex与vuex-persistedstate 插件固化数据
  • 将有序数组转换为高度平衡二叉搜索树 | 详解与Java实现
  • [密码学实战]SDF之密钥管理类函数(二)
  • 美军空袭也门拘留中心,已致68人死亡
  • 纪录电影《中国有戏:天幕计划》启动,有望太空播放
  • 大家聊中国式现代化|陶希东:打造高水平安全韧性城市,给群众看得见的安全感
  • 生于1987年,万宏宇已任内蒙古鄂温克旗委常委
  • 文庙印象:一周城市生活
  • 印巴在克什米尔实控线附近小规模交火,巴防长发出“全面战争”警告