之前通过win32 api做过水波的效果,但是始终不是很真实。于是就有了用Opengl来模拟水波的现象的想法。
首先,在Vertex Shader里,我们先算出顶点与水波中心点的距离。
{
vec3 pos = WORLD * POSITION.xyz;
vec3 posWaveCenter = WORLD * vWaveCenter;
float len = distance(pos, posWaveCenter);
}
然后通过转换,用cos函数来模拟水波,将len转换为各个顶点的相对偏移角度,从而进一步计算出各个顶点的Z轴偏移。
{
float len_angle = ((len / fWaveR) * PI) + wave_angle;
float Wave0 = cos(len_angle) * 100.0;
vec3 pxyz = POSITION.xyz + vec3(0.0, 0.0, Wave0);
gl_Position = WORLD_VIEW_PROJECTION * vec4(pxyz, 1.0);
}
注:wave_angle为相位偏移,通过改变wave_angle来营造出水波流动的效果。
于是,每个顶点都会跟随余弦函数上下摆动起来。
每块两个三角形
但是实际出来的效果却怎么看都不像是水波。
这是因为顶点数量太少,效果大打折扣。由于硬件环境不支持Tesselation和Geometry Shader,只好麻烦CPU辛苦一些,自己插入和细分顶点。
每块722个三角形
顶点越多,效果越好,但是也更耗CPU资源。