Android-OpenGL-ES-实现动态,技术详细介绍

texCoord = texCoord / vec2(1.0, ratio);//转换回来
outColor = texture(s_TextureMap, texCoord);

}


绘制的逻辑:

void ShockWaveSample::Draw(int screenW, int screenH)
{
LOGCATE(“ShockWaveSample::Draw()”);
m_SurfaceWidth = screenW;
m_SurfaceHeight = screenH;
if(m_ProgramObj == GL_NONE || m_TextureId == GL_NONE) return;

m_FrameIndex ++;

UpdateMVPMatrix(m_MVPMatrix, m_AngleX, m_AngleY, (float)screenW / screenH);

glUseProgram (m_ProgramObj);
glBindVertexArray(m_VaoId);

GLUtils::setMat4(m_ProgramObj, "u_MVPMatrix", m_MVPMatrix);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_TextureId);
GLUtils::setFloat(m_ProgramObj, "s_TextureMap", 0);

//float time = static_cast<float>(fmod(GetSysCurrentTime(), 2000) / 2000);
float time = static_cast<float>(fmod(m_FrameIndex, 150) / 120);
GLUtils::setFloat(m_ProgramObj, "u_Time", time);

//设置点击位置
GLUtils::setVec2(m_ProgramObj, "u_TouchXY", m_touchXY);
//设置纹理尺寸
GLUtils::setVec2(m_ProgramObj, "u_TexSize", vec2(m_RenderImage.width, m_RenderImage.height));
//设置边界值
GLUtils::setFloat(m_ProgramObj, "u_Boundary", 0.1f);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (const void *)0);

}


我们使用 y=-(8*x)^3 作为平滑函数得出来的效果图如下所示,虽然有水波纹效果,但是形变边界跳变严重,原来是该平滑函数没有满足,在边界处输出值为 0 的条件。

![使用-8x^3平滑函数绘制效果](https://upload-images.jianshu.io/upload_images/22976303-d14d945c410ef5dd?imageMogr2/auto-orient/strip)

为了满足平滑函数的输出值在边界处为 0 的条件,我们利用 fooplot 构建的一个函数 y=20x*(x-0.1)*(x+0.1) ,函数曲线如下图所示,由于边界值 u_Boundary 为 0.1 ,该函数满足我们的需求。

![](https://upload-images.jianshu.io/upload_images/22976303-b46bf60de299e4d1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


在上述片段着色器中,我们替换下平滑函数:

float x = (distance - u_Time); //输入 diff = x
float moveDis = 20.0 * x * (x - 0.1)(x + 0.1);//平滑函数 y=20.0 * x * (x - 0.1)(x + 0.1) 采样坐标移动距离


我们替换平滑函数后,绘制结果如下图所示,结果符合预期,没有了形变在边界处的跳变。

![动态(水波纹)涟漪效果](https://www.icode9.com/i/ll/?i=img_convert/3715521ff42e95a5a4bb6e878c8f0a5a.gif)

另外,我们在网上找到一个古怪的函数,y= (1-Math.pow(Math.abs(20*x), 4.8))*x ,绘制出来的效果如下图所示,看起来比较有意思。

![古该函数对应的效果](https://www.icode9.com/i/ll/?i=img_convert/752aa277cc7bf5e29f07fc462d7225ff.gif)

当然,我们也可以在形变区域内构建具有多个零点的平滑函数,来制造多个波动效果,更多有意思的效果留给你去探索吧。

****
**更多系列教程GitHub白嫖入口:[https://github.com/Timdk857/Android-Architecture-knowledge-2-](

)**

**B站全套Android移动架构师进阶视频教程白嫖地址:[https://space.bilibili.com/544650554](

)**


> **Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码**
> **网盘:pan.baidu.com/s/12WbFc8cmVXhdgFkOLEfS5g**
> **提取码:wecw	(复制链接至浏览器打开)**


### 尾声

最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

![](https://www.icode9.com/i/ll/?i=img_convert/cffb132bb31a00f5e7618cb6cbd9eaff.png)

##### Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
![](https://www.icode9.com/i/ll/?i=img_convert/05018f9b86caf912affa35033c59c83f.png)

* ##### **[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](

)**
(img-KeMfXOjH-1631456658409)]

* ##### **[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](

)**
上一篇:OpenGL配置环境文件


下一篇:OpenGL十二讲代码