作者为 DirectX 11 渲染器项目Gradient创建了水渲染系统,分享了构建过程中的经验。
波模型和生成:
- 高度函数和法线:用水面高度场模拟水表面,通过正弦波叠加来表示波,控制波的振幅、方向、频率、相位和尖锐度等参数,基于高度函数计算表面各点的法线。
- 生成波参数:在 HLSL 中建模单个波,包括振幅、波长、速度、尖锐度和方向等参数,在应用启动时在 CPU 上生成波数组并传递给着色器,波的方向从围绕风向的正态分布中采样,以控制总振幅等。
- 网格细分和位移:使用 DirectX 11 的细分着色器管道在运行时生成额外的顶点,绘制平面网格并根据高度函数位移顶点,以控制细分程度,通过距离基细分方法计算细分因子,在域着色器中进行高度位移和法线计算,并在外壳着色器中剔除相机背面的补丁以提高性能。
像素着色和视觉效果:
- PBR 光照:使用 PBR 光照系统进行水着色,设置粗糙度为 0.2、金属性为 1 使水表面具有反射性,设置反照率为(1, 1, 1)使所有颜色通过反射,通过插值顶点法线与向上向量来减少远处水面的噪点。
- 次表面散射:使用 Alan Zucconi 的简单方法实现次表面散射,根据像素在波上的高度近似厚度,为每个场景光计算次表面散射贡献并添加到像素的总光照中,增加了波浪尖端的柔和 glow。
- 菲涅尔效应和改进的次表面散射:观察到湖水在不同视角下的反射特性,模拟菲涅尔效应,通过插值反照率和乘以浅海水颜色来改善水的深度感和透明度。
- 反射和改进空间:水的模拟仍存在问题,如水面反射平淡、近距离细节不足、可见的平铺以及缺乏泡沫和起伏等细节,可添加平面或屏幕空间反射、滚动法线图等方法改进,还可将法线计算从域着色器移动到像素着色器以影响性能。总体而言,这是作者首次尝试水模拟,对结果较为满意。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。