WangTile實現小結

過程

square tiles with just two types of edge, the complete stochastic set consists of 16 tiles,While the number of tiles required to form a complete stochastic set increases dramatically as you add new types of edges,
在這裏插入圖片描述

在這裏插入圖片描述

方形tile最少需要兩種不同類型邊緣,需要22*22 = 16種原始tile變體,例如上圖,增加邊的類型會增加多樣性,但是原始tile變體會大量增加
紅色邊緣相互之間可以連續,藍色邊緣相互之間可以連續
上面原始tile圖片可以存到一張圖中(低級別mipmap邊緣會出現縫隙,需要ddx,ddy手算UV),或者存到一個tex2DArray中
貼圖製作方法:
https://www.pathofexile.com/forum/view-thread/55091

實現方法

1.根據UV可以計算TileID,tiling值可調
2.每個tile四個邊根據uv隨機出四個邊緣種類,(只有兩種就隨機出0,1),只算出邊的種類就好,上下/左右的tile共用一個邊的結果
3.根據四個邊隨機出的四個邊緣種類,計算出是哪種原始tile變體(備註1)
4.用局部tile uv讀取原始tile變體圖

備註1:
GPU Gem2中的算法比較複雜,而且需要if分支
https://developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-12-tile-based-texture-mapping
在這裏插入圖片描述

想出了一種簡單的算法:
int tileIDX = abs(3 * xE0 - xE1);
int tileIDY = abs(3 * yE0 - yE1);

性能優化

性能大頭是隨機算法,尤其是sin,最開始用的是隨處可見的隨機代碼
sin(dot(co.xy ,float2(12.9898,78.233))) * 43758.5453
然後凱奧斯大佬給出建議用asint來按位轉換達到隨機效果,但是會有大量重複的隨機結果導致tiling感依舊很強,seed值需要調整

優化過後iphoneX全屏繪製3.5ms變爲全屏繪製1.6ms

改進可能

網上還有很多paper會有旋轉,或者不侷限於方形等算法來進一步減少tiling感

放一張實現過程
在這裏插入圖片描述在這裏插入圖片描述--------------------- by wolf96 2020.4.25

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章