一、前言
本文旨在与大家一起探讨学习新知识,如有疏漏或者谬误,请大家不吝指出。
二、概述
在讲之前,我们先来看下最终渲染效果是什么样子的:(示例程序见原文中附件)
我们来对水效做一下简单的效果分解。
一般地,像很多网上所说的那样,水效=反射 折射
菲涅尔效应。这个公式是最简单的,也是最基础的。当然,到真正开发水效时需要考虑的东西就比较多了,在上面这张截图里,我考虑到的效果有:水波的模拟、反射、折射、菲涅尔效应、水的散射、大气的散射以及辉光。做过水效的同学可能应该清楚,除了以上的效果,还有Caustic(译作焦散)没有考虑进去。另外水底和水面的渲染在公式、参数和渲染实现上都有或多或少的差别,不能一概而论。这里我们只讨论水面的渲染,至于水底的,大同小异,但是需要准备另外一套shader,这里暂且不提。
下面会将各个效果单独实现,再整合成到一起,每个效果都会开一个文章说明。另外需要注意的是,水波的模拟我之前有篇文章有提过,这里就不写了。链接在这里:
Gerstner波是一种方法来实现水波模拟;另外还有基于FFT的,可能就需要有真实水波数据来经过FFT分解成若干正弦余弦波,这个我倒没有做过;还有就是基于noise的,将多个noise图根据分形噪声思想进行叠加,也可以实现出很漂亮的波形。在ShaderToy上有一个例子写的非常棒,大家可以看一看:
https://www.shadertoy.com/view/Ms2SD1</