Opengl ES实现简单水波纹效果

       之前通过win32 api做过水波的效果,但是始终不是很真实。于是就有了用Opengl来模拟水波的现象的想法。

      

       首先,在Vertex Shader里,我们先算出顶点与水波中心点的距离。

       {

            vec3 pos = WORLD * POSITION.xyz;

            vec3 posWaveCenter = WORLD * vWaveCenter;

            float len = distance(pos, posWaveCenter);

        }

 

        然后通过转换,用cos函数来模拟水波,将len转换为各个顶点的相对偏移角度,从而进一步计算出各个顶点的Z轴偏移。

扫描二维码关注公众号,回复: 1563480 查看本文章


       {

            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资源。

猜你喜欢

转载自blog.csdn.net/miller1026/article/details/8537017