Desert Rendering

场景渲染展示

Footprint Showcase

脚印展示
1. Desert Landscape Model
沙漠模型

尝试用高度图制作沙漠地形:在Maya种应用Height Map但是锯齿严重。在unity场景拉近时非常明显。

HeightMap Landscape Problem
HeightMap Landscape Problem

unity中的场景 - 锯齿明显

最后还是使用了Blender的Sculpture工具拉出来了一个尽可能圆滑的沙漠模型。在unity中获得了更好的视觉效果

Desert Landscape
Desert in Unity

unity中的场景 - 边缘较平滑

2. Desert Shader - Surface
沙漠Shader - 表面

粗糙表面光照模型:Oren Nayar光照模型
以及基于像素(片元)的多光源支持

Desert Landscape
Desert in Unity
Desert in Unity

根据沙丘朝向变换法线纹理方向

Desert Landscape
Desert in Unity

镜面反射:用一个Detail Normal的细节法线纹理制造在镜面反射区域的波纹效果。
镜面反射采用Blinn-phong光照模型。

Desert Landscape
Desert in Unity
Desert in Unity

闪烁:用一张Glitter Noise与时间参数与摄像机视线方向相乘,主要在菲涅尔区域产生随视线和时间闪动的光点。

Desert Landscape
Desert in Unity
Desert in Unity
3. Lake Shader Graph
湖泊Shader Graph

主要实现了法线波动、湖水深度颜色透明度变化、边缘处的发光纹理(模拟泡沫)以及水面位移。

Desert Landscape
Desert in Unity
4. Houdini PCG - Cactus
仙人掌Houdini生成

仙人掌生成节点图。以此为基础创建HDA文件,输入为一个线段。

Desert Landscape
Desert in Unity

节点中可调节的参数包括了主干的宽度、副枝干的宽度、副枝干的数量、弯曲程度等。

5. Substance Designer - Gravel & Stylized Brick
SD - 沙石与风格化砖块

河边沙石:

Desert Landscape

创建了Rock Sculpter和Rock Noise两个辅助图表:

Desert Landscape
Desert in Unity

风格化砖块:

Desert Landscape
6. Desert Shader - Tessellation
沙漠Shader - 曲面细分

因为应用高度图的本质是一个顶点位移着色器,顶点太少就难以看出使用了高度图。
所以为了能够更好得展示在SD中制作的沙石材质,需要采用曲面细分的方式才能更好地将Height Map应用到地面上。
曲面细分着色器:

Desert Landscape

Hull Shader

Desert in Unity

Tessellation Function

Desert in Unity

Domain Shader

曲面细分优化:根据摄像机距离进行曲面细分复杂程度变化。

Desert Landscape

根据摄像机距离判断细分参数

7. Desert Shader - Texture Blend
沙漠Shader - 材质混合

用Polybrush工具在一个地形模型上混合不同的材质需要编写一个材质根据顶点颜色通道变化的Shader。
在Shader中用顶点颜色通道值定义不同材质的融合:

Desert Landscape

Height Blend

Desert Landscape

Normal Blend

Desert Landscape

Color Blend

Desert Landscape

AO Blend

用Polybrush在地形上涂刷不同材质:

Desert Landscape

*图为示例并非原场景

8. Desert Shader + C# Script - Footprint
沙漠Shader与角色脚本 - 角色脚印实现

在角色移动脚本和着色器中定义脚印数据结构体并在着色器中声明一个Structured Buffer用来传递数值。
用一个结构体数组储存所有脚印信息,定义最多能够显示的脚印数量并编写信息写入逻辑。

Desert Landscape

C#定义

Desert Landscape

Shader定义

编写角色控制脚本,在角色移动脚面落地的动画事件触发脚印信息写入Shader函数。

Desert Landscape

角色脚踩地面时

Desert Landscape

设置动画事件

Desert Landscape

主要写入函数逻辑

每帧更新着色器中的时间变量,通过计算差值计算出脚印的淡化参数。

Desert Landscape

进行时长更新

Desert Landscape

根据时长计算淡化比例

沿用并优化曲面细分着色器
只在运用了需要细分的材质(沙石)和脚印部分采用曲面细分,同时保留摄像机距离优化。

Desert Landscape

为了贴近脚印的形状写了一个圆角矩形范围检测判断。
编写计算逻辑和判定方式查看定点是否处于定义的脚印面积内。
通过平滑插值改变下陷深度和计算法线变化。

Desert Landscape

脚印形状计算与判断、深度变换、法线变换的逻辑

Desert Landscape

方便法线旋转计算的小函数

Desert Landscape

脚印形状

Desert Landscape

显示线框脚印展示

9. Scene Build
场景搭建

建筑、石头、小草、棕榈树用了资源。
用Polybrush物体笔刷搭建再微调。
沙石与沙漠材质混合也使用了Polybrush材质混合笔刷绘制。
建筑上的墙面用了SD中制作的风格化砖块。

Desert Landscape
10. Grass Sway Shader
小草摆动Shader
Desert Landscape
Desert Landscape
11. Dust Storm
沙尘效果

用sprite sheet制作的简易粒子系统。

Desert Landscape
Desert Landscape
12. Fog
增加雾效
13. Lighting & Skybox
调整打光和天空盒
Desert Landscape
14. Post Process
后处理

调整了色彩、模糊、暗角、辉光等。

Desert Landscape
Desert Landscape