尝试用高度图制作沙漠地形:在Maya种应用Height Map但是锯齿严重。在unity场景拉近时非常明显。
unity中的场景 - 锯齿明显
最后还是使用了Blender的Sculpture工具拉出来了一个尽可能圆滑的沙漠模型。在unity中获得了更好的视觉效果
unity中的场景 - 边缘较平滑
粗糙表面光照模型:Oren Nayar光照模型
以及基于像素(片元)的多光源支持
根据沙丘朝向变换法线纹理方向
镜面反射:用一个Detail Normal的细节法线纹理制造在镜面反射区域的波纹效果。
镜面反射采用Blinn-phong光照模型。
闪烁:用一张Glitter Noise与时间参数与摄像机视线方向相乘,主要在菲涅尔区域产生随视线和时间闪动的光点。
主要实现了法线波动、湖水深度颜色透明度变化、边缘处的发光纹理(模拟泡沫)以及水面位移。
仙人掌生成节点图。以此为基础创建HDA文件,输入为一个线段。
节点中可调节的参数包括了主干的宽度、副枝干的宽度、副枝干的数量、弯曲程度等。
河边沙石:
创建了Rock Sculpter和Rock Noise两个辅助图表:
风格化砖块:
因为应用高度图的本质是一个顶点位移着色器,顶点太少就难以看出使用了高度图。
所以为了能够更好得展示在SD中制作的沙石材质,需要采用曲面细分的方式才能更好地将Height Map应用到地面上。
曲面细分着色器:
Hull Shader
Tessellation Function
Domain Shader
曲面细分优化:根据摄像机距离进行曲面细分复杂程度变化。
根据摄像机距离判断细分参数
用Polybrush工具在一个地形模型上混合不同的材质需要编写一个材质根据顶点颜色通道变化的Shader。
在Shader中用顶点颜色通道值定义不同材质的融合:
Height Blend
Normal Blend
Color Blend
AO Blend
用Polybrush在地形上涂刷不同材质:
*图为示例并非原场景
在角色移动脚本和着色器中定义脚印数据结构体并在着色器中声明一个Structured Buffer用来传递数值。
用一个结构体数组储存所有脚印信息,定义最多能够显示的脚印数量并编写信息写入逻辑。
C#定义
Shader定义
编写角色控制脚本,在角色移动脚面落地的动画事件触发脚印信息写入Shader函数。
角色脚踩地面时
设置动画事件
主要写入函数逻辑
每帧更新着色器中的时间变量,通过计算差值计算出脚印的淡化参数。
进行时长更新
根据时长计算淡化比例
沿用并优化曲面细分着色器
只在运用了需要细分的材质(沙石)和脚印部分采用曲面细分,同时保留摄像机距离优化。
为了贴近脚印的形状写了一个圆角矩形范围检测判断。
编写计算逻辑和判定方式查看定点是否处于定义的脚印面积内。
通过平滑插值改变下陷深度和计算法线变化。
脚印形状计算与判断、深度变换、法线变换的逻辑
方便法线旋转计算的小函数
脚印形状
显示线框脚印展示
建筑、石头、小草、棕榈树用了资源。
用Polybrush物体笔刷搭建再微调。
沙石与沙漠材质混合也使用了Polybrush材质混合笔刷绘制。
建筑上的墙面用了SD中制作的风格化砖块。
用sprite sheet制作的简易粒子系统。
调整了色彩、模糊、暗角、辉光等。