用 shader effect 实现雨滴落水效果!Cocos Creator 3D !

摘要:
最近逛论坛时,看到一位大佬在分享各种shader特效。基于其中的水波shader,白玉无冰写了一个玩水效果!新建一个material,Effect属性选择water,接着将纹理图片拖到相应参数。constminPosition=item.node.worldPosition.clone().add;constmaxPosition=item.node.worldPosition.clone().add;this._temp_v4.set如何传值给shader中的uniform变量?this.model_plane.material.setProperty;当然还有一个效率更高的方法,直接使用pass的接口。constpass=this.model_plane.material.passes[0];pass.setUniform;既然用到了shader,顺便讲一下存储限定字吧。attribute只能出现在顶点着色器中,一般用来表示逐顶点信息。以上为白玉无冰使用CocosCreator3D实现"玩水效果"的技术分享。

最近逛论坛时,看到一位大佬在分享各种 shader 特效。基于其中的水波 shader ,白玉无冰写了一个玩水效果!文章底部获取完整代码!还可以试试水哦!

先一起看看效果~

用 shader effect 实现雨滴落水效果!Cocos Creator 3D !第1张

点击任意位置,会在该位置生成一个水纹,就像是雨水落在水洼中一样~

如何使用 effect 文件?新建一个 material ,Effect 属性选择 water , 接着将纹理图片拖到相应参数。

用 shader effect 实现雨滴落水效果!Cocos Creator 3D !第2张

最后为你的模型节点选择材料。

用 shader effect 实现雨滴落水效果!Cocos Creator 3D !第3张

水纹片元着色器实现原理:通过计算与点击点的距离和方向,用 sin 函数模拟水纹效果。通过计算点击时间戳和当前时间与距离,判断是否添加水纹效果。再将多个点击点叠加起来,得到 texture 最终 uv 。 主要代码如下。

for(int i = 0; i < 10; i++){
    vec2 uvDir = normalize(v_uv - center[i].xy);
    float dis = distance(v_uv, center[i].xy);
    float dis_time = center[i].z - cc_time.x + dis * 3.0;
    if ( center[i].z > 0.0 && dis_time < 0.0 && dis_time > -0.1 ){
        uv += sin_A  * uvDir * sin(sin_W * cc_time.x - dis * sin_D);
    }
}
o *= texture(mainTexture, uv);

如何获取点击点?这里需要用到射线检测,如果对射线检测不了解的话,可以参考 浅析射线检测 raycast 的使用 !Cocos Creator 3D !

通过射线检测,会返回一个距离参数,再结合射线的起点和方向,可以计算出点击点的坐标。参考代码如下。

this._temp_v3.set(this._ray.o);
this._temp_v3 = this._temp_v3.add(this._ray.d.clone().multiplyScalar(item.distance));

这个坐标是世界坐标,还需要计算出在模型中的相对位置,数值范围是 0~1。可以通过模型的最小、最大位置,计算出这个值。并将当前的渲染时间戳一并赋值。

const minPosition = item.node.worldPosition.clone().add(this.model_plane.mesh.struct.minPosition);
const maxPosition = item.node.worldPosition.clone().add(this.model_plane.mesh.struct.maxPosition);
this._temp_v4.set((this._temp_v3.x - minPosition.x) / (maxPosition.x - minPosition.x), (this._temp_v3.z - minPosition.z) / (maxPosition.z - minPosition.z), director.root.cumulativeTime, 0)

如何传值给 shader 中的 uniform 变量?可以通过 material 直接设置。

this.model_plane.material.setProperty(`center${this._count++ % 10}`, this._temp_v4);

当然还有一个效率更高的方法,直接使用 pass 的接口。

const pass = this.model_plane.material.passes[0];
pass.setUniform(pass.getHandle(`center${this._count++ % 10}`), this._temp_v4);

既然用到了 shader ,顺便讲一下存储限定字吧。attribute 只能出现在顶点着色器中,一般用来表示逐顶点信息。uniform 变量是一个全局变量,顶点着色器和片元着色器共用。varying 变量的任务是从顶点着色器向片元着色器传输数据。

用 shader effect 实现雨滴落水效果!Cocos Creator 3D !第4张

以上为白玉无冰使用 Cocos Creator 3D 实现"玩水效果"的技术分享。如果你有想法,欢迎留言分享!


用 shader effect 实现雨滴落水效果!Cocos Creator 3D !第5张


试玩链接
完整代码
参考文章
参考资料

免责声明:文章转载自《用 shader effect 实现雨滴落水效果!Cocos Creator 3D !》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇项目中应该怎么选择MySQL的事务隔离级别目标检测相关基础概念下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

OpenGL实现多层绘制(Layered Rendering) [转]

http://blog.csdn.net/u010462297/article/details/50589991 引言 在某些情况下会需要用到多层绘制。FBO下有多个颜色挂接点(Color Attachment),可以用不同的挂接点挂接不同的纹理对象,实现绘制多张纹理(MRT),这在之前的文章里已经有所描述。但是有时候这种方法是不够好用的: - 当纹理非...

Shader编程学习笔记(九)—— Cg语言入门1

Cg入门一:输入输出和语义   本小节对Cg语言进行一个入门了解。   在以前的课程中,我们了解了渲染管线、顶点和片段程序和颜色计算等,在本小结中来了解一个简单的shader的顶点和片段程序的输入输出以及常用语义。   编写一个简单的顶点和片段着色器,代码如下: Shader "Lesson/vertex&fragment"{ SubSh...

Geometry shader总结

什么是Geometry Shader GS存在于vertext shader和固定功能vertex post-processing stage之间,它是可选的不是必要的。GS的输入是单个primitive,输出可能是0个或多个primitive.  GS的作用 GS的主要作用就是从已有的primitive中生成新的primitive,它可以“无中生有”的...

CESIUM内置shader变量和函数[转]

cesium中内置了一些常量、变量和函数,在vs和fs中可直接使用。 内置uniform 内置uniform主要置于AutomaticUniforms类里面,该类私有未开放文档。 czm_backgroundColor An automatic GLSL uniform representing the current scene backgrou...

Unity3D优化总结(一)

容易忽略的美术资源的优化:         优化的美术制作真是一种感觉和经验的积累,能看出制作水平的不是做的效果多么犀利,而是得看制作的效果与对机器的要求等的性价比。 关于合并:  100个三角形的MESH,在渲染时与1500个面数的物体是没太大差别的,最佳的渲染设置应该在每个模型大约1500-4000个三角面。 材质共享:  如果需要通过脚本来访问复用...

RenderSettings 渲染设置

在Edit->RenderSettings里设置 Fog: 激活或不激活 Fog Color:雾的颜色,仅RGB起作用。 Fog Mode:显示方式 Linear线性 Exp指数 Exp2 指数2 Fog Density:雾化的强度 Linear Fog Start:开始距离 Linear Fog End:结束距离 Ambien...