關於雲紋理和Perlin Noise

2022-07-13 06:33:10 字數 1513 閱讀 4724

前幾天看到一本《directx特效開發》的書,翻了幾頁發現了關於一些perlin noise和雲紋理的生成。自己做了一下,搞到現在終於弄出個比較像perlin noise的噪音圖。

perlin noise主要目標是生成乙個比較平滑的隨機數,如果是紋理圖,那麼u,v方向的各個紋素應該較為平滑,不能太過劇烈的變化。

頻率:波長的倒數,這裡是指距上一次隨機點多遠取乙個隨機數。也就是兩個隨機數之間的寬度的倒數。頻率越高說明波長越短,也就有更多的鋸齒。

振幅:波的高度,這裡也就是隨機數產生的範圍,振幅越大,範圍越大。

實質:首先我們要乙個大體輪廓,然後輪廓是大體平滑的有些凸起的地方(振幅大,頻率低),然後在其中平滑的地方再次新增輪廓(振幅比上次小,頻率比上次高,新增細節),然後再繼續,當然可以無限劃分,不過我們一般使用在10次以內。這就是所謂的分形,比如一座山,遠遠望去你可以看到輪廓,走近點,還有凹凸,如果有顯微鏡,還可以看到更小的尺寸也是不平整的,柏林噪音就模擬了這些東西,也包括雲。

inline 

float

noise2d(

intx, 

inty)

這是乙個隨機數種子,產生[-1,+1]範圍內的隨機數,對應於顏色為[0,255]

對於我們的紋理,振幅大也就相當於0~255,不過當然要稍微設定得小一點。那麼頻率呢,假設第一張紋理圖為16x16.那麼相當於u方向取樣16個隨機點,對於32x32那麼相當於u方向取樣32個隨機點,因此,頻率增大了一倍。當然,頻率大的只是為了增加更小尺寸的細節輪廓,因此增幅就不能超過16x16的範圍了,一般為前者的0.5倍。這就是通常所說的「倍頻層」,依次類推。至於隨機點的插值運算,我們就直接交給顯示卡了,使用紋理的雙線性插值法。當然,頻率越高需要插值的次數越少,極端一點,頻率無限大那麼就是連續函式了。而頻率越大則紋理的尺寸越大32x32 對映到512x512的螢幕上自然要比16x16插值的次數少。

將每張紋理渲染到使用線性插值渲染到rendertarget後,再將rendertarge的紋理進行復合再渲染就行了。

紋理矩陣和自動生成紋理

glmatrixmode gl texture 將矩陣變換對應到紋理座標上,這個時候使用gltranslatef glrotatef,glscalef所對應的座標變化都對映到紋理座標上,也可以使用glmultimatrixf,直接進行座標變換,紋理的自動生成 glfloat s vector 4 g...

關於Opengl建立多個紋理

關於紋理對映 以下簡稱貼圖 在正六面體的各個表面貼圖,網上有幾種錯誤的示例,編譯沒有語法問題,但是不能被執行 1 csdn 上看到有人採用 for迴圈,逐個建立紋理,如下 char pictures for int i 0 i 6 i 遍歷位圖名稱陣列,根據位圖名稱分別生成 if textureim...

關於opengl的紋理和調色盤問題

最近碰到了一點問題,關於載入和顯示方面的。1.壓縮紋理 簡單講一下,內部壓縮就是,原始檔並不是壓縮後的檔案,所以opengl需要通過第三方庫來載入檔案,生成的unsigned char陣列,這個陣列大小是 unsigned char的大小也就是1byte 長 寬 通道數,然後使用glteximage...