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.pswp.cn/news/448244.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448244.shtml
英文地址,請注明出處:http://en.pswp.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; 首…