shader飞线改进版

项目github地址:https://github.com/ecojust/flyline

 

前面写过一个飞线(基于THREE.Line进行的颜色变化),只是简单地将可视区片元颜色的alpha通道值设为1.0,不在可视区的设为0.0。效果是这样的:

做得很粗糙,而且因为线是没有粗细的,所以效果也不是很理想,后来用pointSize实现线条粗细变化,以及可视区线条颜色的处理,线段头尾点平滑处理等等,所以,改良后的效果如下:

后续又优化了一下代码,用于测试性能(400根线FPS60):

然后不断增加飞线的数量到4000根,FPS依旧能保持在40:

显卡相当于N卡1050的水平,但要比1050差一点。

其实废话了这么多,下面直接上核心代码吧:

    //创建ShaderMaterial纹理的函数
    function createMaterial(vertexShader, fragmentShader) {var vertShader = document.getElementById(vertexShader).innerHTML; //获取顶点着色器的代码var fragShader = document.getElementById(fragmentShader).innerHTML; //获取片元着色器的代码//配置着色器里面的attribute变量的值var attributes = {};//配置着色器里面的uniform变量的值var uniforms = {time: {type: 'f', value: -70.0},size:{type:'f',value:20.0},};var meshMaterial = new THREE.ShaderMaterial({uniforms: uniforms,defaultAttributeValues : attributes,vertexShader: vertShader,fragmentShader: fragShader,transparent: true});return meshMaterial;}
    var flylinegroup = [];function addline(minx,maxx){var flyline;var curve = new THREE.CubicBezierCurve3(new THREE.Vector3( minx, 0, minx ),new THREE.Vector3( minx/2,maxx % 100 + 60, maxx * 2/ 3 ),new THREE.Vector3( maxx/2,maxx % 100 + 60, maxx / 3  ),new THREE.Vector3( maxx, 0,  maxx));var points = curve.getPoints( (maxx - minx) * 5 );var geometry = new THREE.Geometry();geometry.vertices = points;var material = createMaterial("vertex-shader", "fragment-shader-7");flyline = new THREE.PointCloud( geometry, material );flyline.material.uniforms.time.value = minx;flyline.minx = minx;flyline.maxx = maxx;flylinegroup.push(flyline);scene.add(flyline);}

贝塞尔曲线上取点,这里简单地根据x轴的长度来决定取点的数量。

<script id="vertex-shader" type="x-shader/x-vertex">uniform float time;uniform float size;varying vec3 iPosition;void main(){iPosition = vec3(position);float end = time + size;float pointsize = 1.0;if(position.x > time && position.x < end){pointsize = (position.x - time)/size;}gl_PointSize = pointsize * 2.0;gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);}
</script><script id="fragment-shader-7" type="x-shader/x-fragment">uniform float time;uniform float size;varying vec3 iPosition;void main( void ) {float end = time + size;vec4 color;if(iPosition.x > end || iPosition.x < time){discard;}else if(iPosition.x > time && iPosition.x < end){float ca = fract((iPosition.x - time)/size);color = vec4(ca/1.9,ca,ca/1.6,1.0);}float d = distance(gl_PointCoord, vec2(0.5, 0.5));if(abs(iPosition.x - end) < 0.2 || abs(iPosition.x - time) < 0.2){if(d > 0.1){discard;}}gl_FragColor = color;}
</script>
for(var i = 0;i< 4000;i++){var minx = randomNum(-2000,-600)/10;var maxx = randomNum(600,2000)/10;addline(minx,maxx);
}

 

思路:

1、利用贝塞尔曲线绘制飞线轨迹,并取点(取点数量暂时简单地根据x轴的跨度来算),利用 three.PointCloud 这个类将取得的顶点传给顶点着色器;

2、在顶点着色器中,对于在可视区内的点(position.x值在time和time+size之间)的pointSize进行从左到右依次增大,实现飞线右边粗左边细;

3、在片元着色器中,如果顶点不在可视区那么就discard(不绘制),在可视区内的点从左到右颜色渐变(后期可以通过外部传入的颜色进行渐变处理);

4、在片元着色器中,对于可视区头尾附近的点,进行平滑处理(同理于绘制圆点);

5、随机生成一定范围内的轨迹起始点的x坐标值来生成飞线,for循环来添加n条飞线。

再来一张飞线的近照:

 

转载于:https://www.cnblogs.com/eco-just/p/11210816.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转向盘失控怎么办?

定义 转向失控就是方向盘不管用了&#xff0c;打方向盘&#xff0c;但是前轮不动&#xff0c;不受方向盘控制。 转向失控的原因 转向失控可能因为车辆过快、酒驾、疲劳、车况不佳、雨雪路滑等&#xff0c;还有转向机构中有零部件脱落、损坏、卡滞时&#xff0c;也会使转向机构突…

Socket网络编程【获取本机IP】

//12.3.2//运行环境VS2013//获取本地IP #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib")void main() { // 调用WSAStarup初始化WINsock库 WSADATA wsaData; ::WSAStartup( MAKEWORD(2,2), &wsaData);// 存放主机名的…

onresize

1 window.onresize function (ev) { 2 console.log(尺寸发生改变&#xff01;); 3 }; 4 5 window.addEventListener(resize, function (ev) { 6 console.log(尺寸发生改变&#xff01;); 7 }); 1 /*2 当屏幕的宽度>960时&#xff0c;页面的背景颜色为红色…

Vuejs:组件 slot 内容分发

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 本文是在官方文档的基础上&#xff0c;更加细致的说明&#xff0c;代码更多更全。 简单来说&#xff0c;更适合新手阅读 &#xff08;…

C++获取本机所有ip地址,可区分类型是有线无线虚拟机还是回环

一个小程序&#xff0c;可以获取本地所有ip地址&#xff0c;包括有线&#xff0c;无线&#xff0c;虚拟机&#xff0c;环回接口网卡&#xff0c;等。 如图&#xff0c;一台机器多个网卡&#xff1a; 程序执行结果&#xff1a; #include"stdio.h" #include"…

顿悟人生十一句话

一、永远不要埋怨你已经发生的事情 如果你打算忍受一件事情就闭上嘴巴吧。要么就改变它&#xff0c;要么就安静的接受它。 二、最让你忿忿不平的问题&#xff0c;就是你需要解决的问题 一个被酒后驾驶的司机撞死自己儿子的妇女&#xff0c;发起了反对酒后驾驶母亲协会…

Mybatis 在 IDEA 中使用 generator 逆向工程生成 pojo,mapper

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 使用mybatis可以逆向生成pojo和mapper文件有很多种方式&#xff0c;我以前用的是mybtais自带的generator包来生成&#xff0c;连接如下&…

控制台程序隐藏方法总结(四种)

学习计算机&#xff0c;往往先从Windows环境下学习编程&#xff0c;学习编程&#xff0c;往往从C学起&#xff0c;学习C&#xff0c;往往又从控制台程序学习&#xff0c;何为控制台&#xff0c;就是那个黑框白字的界面。对于这样一个最初认为奇陋无比而现在认为无所不能的编程平…

十大教养,让你气度非凡!

01.守时 无论是开会、赴约&#xff0c;有教养的人从不迟到。他们懂得&#xff0c;即使是无意迟到&#xff0c;对其他准时到场的人来说&#xff0c;也是不尊重的表现。 02.谈吐有节 注意从不随便打断别人的谈话&#xff0c;总是先听完对方的发言&#xff0c;然后再去反驳或者补…

mybatis :Criteria 查询、条件过滤用法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 PS&#xff1a;hibernate 中也有 Criteria 的用法&#xff0c;见另一文章&#xff1a;jpa : criteria 作排除过滤、查询 1. 包&#xf…

C++11多线程----线程管理

说到多线程编程&#xff0c;那么就不得不提并行和并发&#xff0c;多线程是实现并发&#xff08;并行&#xff09;的一种手段。并行是指两个或多个独立的操作同时进行。注意这里是同时进行&#xff0c;区别于并发&#xff0c;在一个时间段内执行多个操作。在单核时代&#xff0…

揭秘赚钱的技巧,学会让钱自己进来

学习把负债变为资产 贫穷是一种习惯&#xff0c;而不只是口袋里金钱的多寡。 每个人每天的时间是相同的&#xff0c;有人利用它来打工&#xff0c;赚取约80新台币的工资。也有人将时间用来教书&#xff0c;每小时赚取约500新台币&#xff0c;也有人用这些时间来上网&#xff0c…

Shell编程入门基础上

前言 为什么学 Shell Shell 脚本语言是实现 Linux/UNIX 系统管理及自动化运维所必备的重要工具&#xff0c; Linux/UNIX 系统的底层及基础应用软件的核心大都涉及 Shell 脚本的内容。每一个合格 的Linux 系统管理员或运维工程师&#xff0c;都需要能够熟练地编写 Shell 脚本语言…

宝宝不开心 : 减肚子大战进行中、持续更新,看看一个月后能不能把腰瘦下来 ...

公司研发中心离家很近&#xff0c;于是来这边后就天天回家吃吃、喝喝、睡睡 ... 中午一个半小时休&#xff0c;吃完就滚上床铺&#xff1a;睡午觉&#xff0c;就这样 天天过得好不惬意 ... // 每周也会发零售&#xff0c;大家都吃得乐呵呵的&#xff0c;晚上加班都是组上好些个…

内存问题提醒!结构体+protobuf做协议体发送!序列化

内存的三种分配方式&#xff1a; 1&#xff0e; 从静态存储区分配&#xff1a;此时的内存在程序编译的时候已经分配好&#xff0c;并且在程序的整个运行期间都存在。全局变量&#xff0c;static变量等在此存储。 2&#xff0e; 在栈区分配&#xff1a;相关代码执行时创建&…

穷人迈向富翁的理财十步曲

当你每日的储蓄随着时间的累积&#xff0c;达到一定数量后再转存到存款薄里&#xff0c;如此日积月累&#xff0c;就可以逐渐养成自身存钱理财的习惯。不管你做什么事情&#xff0c;是否养成了良好的习惯&#xff0c;都会决定你的成败。理财投资也是同样道理&#xff0c;在你养…

【融云分析】选择IM云服务,需要看哪些核心技术指标?

IM&#xff08;即时通讯&#xff09;云服务已发展数年&#xff0c;不少企业与开发者都倾向于选择第三方IM云服务&#xff0c;短平快地为应用添加即时通讯能力&#xff0c;但如何选择服务商却是个难题&#xff0c;单从简单的功能介绍来看无法判断&#xff0c;因为IM云服务接入后…

Nginx 配置详解

序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今&#xff0c;凭借开源的力量&#xff0c;已经接近成熟与完善。 Nginx功能丰富&#xff0c;可作为HTTP服务器&#xff0c;也可作为反向代理服务器&#xff0c;邮件服务器。支持FastCGI…

protocol buffers使用说明

一、什么是protocol buffers Protocol buffers是一个灵活的、高效的、自动化的用于对结构化数据进行序列化的协议&#xff0c;与XML相比&#xff0c;Protocol buffers序列化后的码流更小、速度更快、操作更简单。你只需要将要被序列化的数据结构定义一次(译注&#xff1a;使用…

jeeCMS首页加载流程

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/gyshun/article/details/79669293 如果JEECMS部署完毕之后&#xff0c;在浏览器中输入http://localhost:8080/jeecms&#xff0c;系统直接会按照以下步骤执行&#xff1a; 首…