Hello Vulkan(五)| 圖形渲染新技術(shù)Vulkan紋理
上一期技術(shù)分享中,我們講述了如何關(guān)于Vulkan的Data Buffers使用及VMA內(nèi)存管理器使用,自己創(chuàng)建或使用VMA在顯存里創(chuàng)建Buffers,并在CPU進(jìn)行讀取或?qū)懭搿?/p>
本期將繼續(xù)分享關(guān)于Vulkan的技術(shù),內(nèi)容是非常有趣的部分,即「紋理繪制」,我們會介紹如何在Vulkan中如何進(jìn)行紋理映射,所見即所得。很有趣的是,我們虹圖的英文即“TexelJoy”,其中“Texel”就是紋理的最小單元 – 紋素,熟悉圖形渲染的同學(xué)肯定不陌生,如果你感覺陌生也沒關(guān)系,像素“Pixel”總聽過吧,接下來本期講述的內(nèi)容也會涉及紋素和像素的關(guān)系。
基礎(chǔ)概念
紋理映射:圖形渲染中的一種將單獨的圖片映射覆蓋到3D模型上,并且跟隨模型移動、變換,映射到屏幕空間的圖形渲染操作。
紋理:進(jìn)行紋理映射的圖片,部分硬件要求必須是2的整數(shù)冪,當(dāng)然也并不是所有硬件的要求,確保安全最好是2的整數(shù)冪。
像素(Pixel):屏幕上的每個小點。
紋素(Texel):紋理上的每個小點。使用紋素這個術(shù)語,而不是像素來表示紋理對象中的顯示元素,主要是為了強調(diào)紋理對象的應(yīng)用方式。
紋理坐標(biāo):我們使用S,T來表示紋理對象中的紋素位置。S,T也可以用U,V來表示,紋理坐標(biāo)有時也稱UV坐標(biāo)。

映射原理:帶有紋理坐標(biāo)的3D模型會在每個頂點都有ST紋理坐標(biāo),由紋理坐標(biāo)找到對應(yīng)應(yīng)該在屏幕顯示的紋理中紋素位置,如下圖:

那么如何給每個頂點指定合適ST坐標(biāo)呢?
平面比較容易,做個比例縮小即可:


球體那就要做一些運算:


換做經(jīng)緯度:

這樣的模型呢?貌似有些復(fù)雜了。

這個可以放心,都是現(xiàn)成的自動化算法可以直接使用進(jìn)行計算ST坐標(biāo)。
存儲類型
讓我們回到Vulkan,先說內(nèi)存類型,首先分為CPU內(nèi)存和GPU顯存,GPU顯存則分為主機(jī)內(nèi)存(Host Visible Memory)和設(shè)備內(nèi)存(Device Local Memory)。CPU可以向主機(jī)內(nèi)存進(jìn)行讀寫操作。設(shè)備內(nèi)存是一種設(shè)備可見的內(nèi)存,常見的緩沖內(nèi)存和圖像內(nèi)存,可以被設(shè)備本地快速使用,而設(shè)備內(nèi)存最大的用處就是儲存紋理,因為紋理讀取是需要快速完成的。

在Vulkan里應(yīng)該如何設(shè)置紋理映射的參數(shù)呢?我們先看下之前OpenGL如何進(jìn)行參數(shù)設(shè)置的:
但在Vulkan里則是有一定區(qū)別的,但是類似于創(chuàng)建Buffer的操作。
對比下Vulkan和OpenGL,其實可以發(fā)現(xiàn)在設(shè)置Mode為LINEAR(線性濾波法)時Vulkan是mipmapMode,而OpenGL只是Mode。那么這個Mipmap是什么意思呢?Mipmap是縮小版本的image,每個新image是前一張圖的寬度和高度的一半。Mipmap用于作為細(xì)節(jié)級別(即Level of Detail)的一種方式。遠(yuǎn)離相機(jī)的物體將從較小的mip圖像中采樣紋理。使用較小的圖像可以提高渲染速度,避免鋸齒,具體做法就是平均4個像素,生成1個新的像素,依次循環(huán)。

最后放一個我覺得對大家有幫助的文件,就是如何把一個bmp、png、jpg圖片讀取成紋理。

關(guān)于Vulkan關(guān)于Command Buffers的內(nèi)容,我們會在本系列后續(xù)內(nèi)容中繼續(xù)與大家分享,Command Buffers也是Vulkan中很難理解,但卻很重要的一部分內(nèi)容。
敬請期待~