Water - myl2232/WorkingOn GitHub Wiki
DCGWater是一款水的插件。提供了反射,折射,水沫,波动等效果。
-
用到了深度,用来判断海岸,制作近处的水沫,远处就比较清亮。用来三个贴图,反射、法线、移位。屏幕空间位置projPos得到了partZ,深度图中的位置SceneZ,从而用SceneZ-PartZ用来判断水面有效范围。岸边是有shoreForm的水沫,可以控制它的范围,由水面可视中心扩散到岸边,岸边的水沫最深。反射图提供了n.v下的fresnel亮度,它同shoreform是相反的作用,即没有水沫的地方是体现反射亮度的地方。
-
至于移位贴图,主要作用是制造水沫和反射的交替效果,可以多次移位采样叠加来参与最终计算。
-
至于波动,通过unity_WorldToObject计算wave,控制uv波动的频率、幅度。法线图采样两次混合之后的r、g通道作为提供给后续计算的normal方向。它有几处作用。首先是折射,它可以参与扭曲场景采样uv,可以在grabTexture下获取的scene采样做一个扭曲。反射当然也一样,也是扭曲的sceneUV参与的计算。其次,做为正式用于切线空间的法线,通过reflect函数提供了反射方向,提供反射高亮。
-
注:常用的_ProjectionParams实际是 Vector4f(device.GetInvertProjectionMatrix() ? -1.0f : 1.0f, projNear, projFar, invFar,一般用_ProjectionParams.g来参与屏幕坐标或深度坐标的计算。
float4 _ProjectionParams;
// x = 1 or -1 (-1 if projection is flipped)
// y = near plane
// z = far plane
// w = 1/far plane
其他:关于SSR
-
对于tl的water有两种反射,一种是ssr,另一种就是反射图。SSR基本原理是将计算重点集中在了观察空间,通过深度贴图获取深度,继而可以计算出观察空间下的位置,通过延迟渲染获取法线,然后便可以得到反射后的光线方向;之后通过比对光线路径上的点的深度,即可获得近似反射的效果。额外需要一次背面渲染,同上一次的深度做差值,从而得到深度的厚度,用来在步进计算中判断是否在反射路线上相交。
-
在tl的ssr当中最费的也是类似raymarch的计算。
-
unity_CameraProjection 相机投影矩阵:
m00 = 2.0F * near / (right - left);
m11 = 2.0F * near / (top - bottom);
m22 = -(far + near) / (far - near);