godot 隨機(jī)地圖4 生成voronoise的基點(diǎn)
在之前的測試代碼中,我們使用的是uv到基點(diǎn)的距離來填色,越原理基點(diǎn)值越大,也就越白。簡單的形容就是又大又白。


一、我們先隨機(jī)生成色彩,當(dāng)然還是用sincos取小數(shù),這樣隨機(jī)有可靠。
????1、準(zhǔn)備一個noise

????2、判斷的時候不僅僅判斷最小距離,還要判斷最小uv,把uv 給換著花園給float noise 處理三次得到一個vec3,當(dāng)做色彩。


這時候我們已經(jīng)得到了很穩(wěn)定的index產(chǎn)生的色彩,并且圖形穩(wěn)定。
二、傳入穩(wěn)定的index color,并且基礎(chǔ)color和map相關(guān)。
????1、voronoise和隨機(jī)地圖的關(guān)系

????就像上圖,是正方形的,但是我如果在voronoise的的index沒有偏移的時候也是正方形的。如果我們的基礎(chǔ)圖形按照這個方式生成,也就沒毛病了。如果在這個基礎(chǔ)上去生成圖形,這樣地圖的隨機(jī)是建立在我們已有的地形規(guī)劃之上。
????2.0 對于基礎(chǔ)地圖生成的需求大致分成兩類
????我們?yōu)榱松苫A(chǔ)點(diǎn)圖,會用上地圖分層

????????這時候我們有兩種方法
????????第一種是使用一階noise控制高度,然后多次生成,這樣有一個好處就是可控性高,并且代碼簡單。
????大概就像這樣子。

????第二種方法是使用marble texture noise

????實(shí)際上marble在只在noise texture的基礎(chǔ)上改了一點(diǎn)點(diǎn)

????如果我們這時候把返回的color的v再改一下隨著Y越大,顏色越深。
????但是我并不想。
????雖然這樣很好的分層了,但是我需要的是像泰拉瑞亞那樣的游戲地圖,不然我也不會出godot的筆記,因?yàn)間odot對2d支持太好了。但不能讓我控制FBO,不過也沒關(guān)系,我已經(jīng)滿足了。

????使用marble會很難控制我想生成的地圖。不過marble的特性可以讓我們對他多多調(diào)教。
????比如
????斜的


????豎的


????越往下越暗


????
????2.1使用noise_1D創(chuàng)建
????有兩種方案處理:
????????第一種是創(chuàng)建一個512*1的image讓shader去處理
????????第二種是創(chuàng)建PackedFloatArray就在CPU上干了,處理512次,后面還可能更多,優(yōu)化了少1/10秒,沒必要。
? ??
????因?yàn)樯蒳mage在shader上面干,是必須要做的,這里就熟悉使用PackedFloat32Array。
????在源碼中他們就是vector的套牌

????? ??

然后就意識到,我還沒分型呢。如果是1024次,還得分型5次???。我們跟著寫一個生成texture的。
????2.2生成image 扔給shader并行處理
????因?yàn)間odot不能直接調(diào)用fbo,雖然少了一點(diǎn)自由度,但是無傷大雅。
????但是隨后發(fā)現(xiàn)godot的texture不能隨便設(shè)置

????但是隨后發(fā)現(xiàn)godot的shader不能隨便給texture套用
????但是隨后發(fā)現(xiàn)godot的sprite2D必須預(yù)先設(shè)置特效圖熱的大小
????但是隨后發(fā)現(xiàn)godot的image的長寬是局部函數(shù)

????此時此刻,我心里面在奔騰
不過imagetexture繼承了texture的特性,而且還有w和h

隨后我發(fā)現(xiàn)可以create image

隨后我又發(fā)現(xiàn)這是錯的,image不能new后就不能在設(shè)置大小了,然而我必須使用

我尼瑪,你可不可以保留這個new,你這個操作很反人類啊。
但是image是保存與內(nèi)存上的東西,texture才能保存在顯存上
這樣操作屁反應(yīng)也不會有,我的sprite2D并不能把它的texture進(jìn)行處理。

我尼瑪,那我就得把texture.set_data()

然并卵什么也沒有
即便我await changed

?2.3 三個小時也沒解決,我放棄了
????沒法了,我只能使用殺器了:打開ps,創(chuàng)建一個512*1 png的圖片扔進(jìn)去,3分鐘

???
我稍微有點(diǎn)點(diǎn)無語,好吧,如果我開發(fā)游戲引擎,也不會想到有人會這樣操作。

所以我大膽的猜測,godot的image并不是用來生成圖片的,而是純粹用來截圖保存了。
那我趕快給他寫一個shader,這里直接套用2Dnosie的shader,因?yàn)閥為1,也沒啥變化,那我的y就可以改為seed。
????我真是真的一個愣頭青傻批。
????2.4優(yōu)化noise2d

因?yàn)閚oise是分型多層疊加,fractal brownian motion的參數(shù)我也左右修改,如果看不習(xí)慣可以自己改回去,下面提供了原詞。相對的國外作者,那全是縮寫,剛學(xué)的時候全都不認(rèn)識。

為了改為1D的noise,我把uv.y的數(shù)據(jù)拋棄,直接改為seed



這樣我就得到一個512*1的圖片了。

fbo的特性就是穿入多大的texture,就創(chuàng)建多大的計(jì)算陣列,這里傳入512*1,那就是512*1的并行度,不會多和少。如果sprite2d縮放后,只是換一種方式采樣,fragment的處理的texture的數(shù)據(jù)不會變化。

縮放后的sprite2D改變你的fragmentshader 后面的testing blending(混色)過程。所以不用擔(dān)心。
????2.5 我們把時間暫停,把texture的數(shù)據(jù)導(dǎo)出去
????操蛋的事情有發(fā)生了


他獲得了我原始image的數(shù)據(jù)。我尼瑪。
然后我使用godot的頭來測試

他又對了,我再次尼瑪。我真尼瑪?shù)模H了,真的是有毒。
人的精力是有限的,但是別人的操蛋是無限的。
我就不信邪了,我扔一個512*10的進(jìn)去試一試。
還是原始數(shù)據(jù)

我有傳入一個512*10的svg進(jìn)去,還是不行

我尼瑪呵呵了。
沒辦法了,我只能直接用mesh了,用傳統(tǒng)的opengl的方式,這下他跑不掉了吧。