純Shading Language繪製飛機火焰效果

2021-09-21 00:03:09 字數 1769 閱讀 9416

上篇《純shading language繪製html5時鐘》體現了glsl可程式設計性特點,但沒有體現glsl可程式設計出各種酷炫效果的特點,今天我們將用純shading language繪製火焰效果,並將其應用到《ht圖形元件設計之道(四)》飛行的飛機例子上。

火焰的例子我已發在 其本質在繪製gl.points的點型別時,通過在fragment shader在點區域內生成noise的雜訊用於繪製多種顏色效果,並將多次不同雜訊演算法生成的顏色進行疊加,同時雜訊的生成還依賴於time的時間引數,這樣最終融合成不錯的圓形火焰效果。

採用gl.points的繪製方式會受不同瀏覽器對點大小的限制,可通過gl.getparameter(gl.aliased_point_size_range)獲知瀏覽器支援的最小和最大範圍,一般也都有1~255或1~300的區間,所以也基本夠用於展示效果,的例子中52行中的float color = 3.0 – (3.*length(2.*p));其中的第乙個3.0是火焰強度intensity引數,可通過改變此值達到改變火焰強度的效果,可在1.0~4.0範圍體驗從小火到大火的調節效果。

當然這樣疊加會導致火焰始終在最上層,無法真實反映三維空間層次的問題,但作為監控系統應用最關鍵的是展示重要指標,例如對於電信網管應用,當裝置有告警冒泡呈現時,往往要求告警冒泡要呈現在最上層不要被其他裝置遮擋住,同樣如果真的飛機失火需要監控系統實時提示該告警資訊時,肯定也是需要該火焰不被遮擋,因此真實世界的層次瑕疵在這裡反而是合適的解決方案。

以上**我們還傳入了intensity的強度引數,該引數我們通過ht.default.startanim動畫函式,控制其值在0~4之間不斷來回變化,這樣可達到火焰有小變大來回變換的類似告警閃爍提示效果。還有var devicepixelratio = window.devicepixelratio;引數也是容易被忽略的細節,該值會根據裝置的retina支援程度有不同的值,避免在高解析度裝置下出現鋸齒模糊的問題,當然通過devicepixelratio增大canvas.width和canvas.height也是有記憶體繪製效能代價的,如果效果要求不是太高情況下也可以都採用1來處理,其實要求不太高的三維場景即使時retina為3的iphone 6強制用devicepixelratio為1的方式也不會有太大問題,並且能節省記憶體提高繪製效能,某些低效能的終端某些情況下甚至可以再降級到小於1的值以犧牲效果換取效能。

千辛萬苦終於讓飛機飛出了我想要的效果(當然還有無數的細節可以完善,例如可以根據飛機離eye的距離動態改變point點的大小,或改造glsl實現煙霧的粒子系統效果等等,但元旦假期結束了我明天還要上班,其他可完善的地方留給讀者去想象了。

python純函式 Numpy純函式的效能,快取

這些函式已經存在於scipy中。sigmoid函式可用作 in 36 from scipy.special import expit 將expit與向量化乙狀結腸功能進行比較 in 38 x np.linspace 6,6,1001 in 39 timeit y sigmoid x 100 loop...

mysql 過濾純數字 SQL 中判斷 純數字

有這樣乙個需求 需要把乙個varchar 型別欄位中所有純數字的行取出來.那麼這個select語句要怎麼寫呢?首先想到的是isnumeric 這個sql函式.sql語句如下 select from view user where isnumeric logid 1 但是發現這樣的執行結果並不對.因為...

squid純記憶體快取

原貼 http blog.scaner.i.thu.cn index.php 2006 11 20 squid pure memory cache posted by scaner in linux,web trackback 看見網上不少介紹squid的使用經驗,說可以用ramdisk tmpfs...