Texture(一)代碼生成圖片

了解Texture2D

如上圖,Texture2D是一張二維圖片

是由一顆一顆像素組成的。

通常是由低到高,由左到右排列的。

如果想要通過代碼操作像素,我們必須要知道像素的坐標位置,現在我們來驗證下是否真的如此排列。

我們通過簡短的代碼,NEW一個圖片,並且根據X,Y軸對應R,G通道,逐像素賦值。我們將得到一張紅綠漸變圖,如下。

根據圖片的顏色漸變過程,我們可以確信,像素排列順序是和我們預測的一樣。

  • TextureFormat是什麼

TextureFormat為貼圖的類型,ARGB32位,代表有ARGB4個通道,每個通道的顏色有8位,對應的還有A8,RGB24等。任何圖片從本質上就是這樣的。

而常見的JPG,PNG等是操作系統採用的壓縮/非壓縮讀取格式,ETC/DDS為圖形介面讀取的壓縮格式。

  • 賦值完後為什麼要Apply

因為在貼圖更改像素時並不是直接對現在的內存進行更改,而是在另外一個內存空間中更改,這時候GPU還會實時讀取舊的貼圖位置。

當Apply後,更改後的內容才會應用到現在的內存中。

  • 所有的圖片的像素排列順序都一樣嗎?

事實上OpenGL和DX在UV方向和取值上是不同的,在此我們應該感謝Unity3D為我們做的那些事,讓一切變得簡單。

製作一個簡單的筆刷

最終效果

實現輪廓

我們對上面的代碼稍作修改。

我們在第一個紅線引入一張貼圖,第二個紅線,將像素乘以這張貼圖對應位置的alpha通道。

在色階上每個通道是8位,0-255,但在計算時為浮點數。0~1。

所以如果alpha為0,任何顏色乘以他,結果都為0。

通過以上代碼,我們實現如下效果:

這張貼圖是張Alpha通道為0和1的通道,1為有顏色,0自然就沒有顏色。也可以通過0-1之間的值實現漸變。

同樣的,因為只用到一個通道,我們可以將它壓縮為一張Alpha8的單通道8位貼圖,來節省空間。

實現紋理

我們再次對上述代碼進行更改,同樣引入一張貼圖來做紋理。

這次我們進行顏色相乘,因為顏色為浮點值,所以他們乘後的結果不會大於1,也不會小於0。

而重載運算符,在*的過程中,幫我們把RGBA通道一一對應的運算。

這裡我們用到了相乘,很多人在用圖像軟體時,會遇到,相乘,相加,相除,相減等辭彙。

一開始會很納悶,為什麼要這樣命名。現在我們知道了,他們是在像素之間的數學運算關係。

通過以上簡短的代碼,我們就實現了一個比較複雜且完整的功能。
推薦閱讀:

怎樣理解結構張量?
ImagePy開發文檔 —— 宏引擎
1.4【OpenCV圖像處理】Mat對象
圖片一拉大就模糊!要不要試試無損放大圖片?
圖像上的頻率指的是什麼?

TAG:Unity游戏引擎 | 图像处理 |