Unity3D 開發之shader教程(淺談GPU渲染入門)


  尊重他人智慧成果,歡迎轉載,請注明作者 心若透明,原文地址  http://www.cnblogs.com/ubanck/p/4109411.html

 

  這篇隨筆,就不按照各種專業的解釋來描述了,完全看自己發揮吧,寫到哪兒算哪兒。若是哪里有說的不對的地方,請各位看官直說無妨!

 

  說到游戲研發,就不可避免會提到圖形學,圖形學里面細去研究,就會牽涉到各種各樣的數學知識,向量,矩陣之類的!而到這兒,咱們先開始從shader談起,什么是shader?咱們通常說寫個shader,其實也就是寫了一個執行某種功能的程序,跟你寫個普通的程序原理上說一樣的,而不同之處在於,shader是寫個GPU執行的,說到GPU執行,那么就得談到3D游戲里面的那些人物啊,花鳥啊,是怎么看到的,或者說的專業一點,叫做渲染出來的!

  如果在2D上面,很簡單,完全可以看作是一張圖貼在屏幕上就OK。在3D上面,就復雜了一點,首先,我們的屏幕上2D的,不像現實世界,是三維空間!那么怎么在屏幕上畫東西才能看上去有3D效果呢,你可以試試在紙上畫一個立方體,學過數學都會畫,你第一眼看上去就會覺得這是3D的,而不是一個簡單的矩形!  

  模型坐標系:在計算機的3D世界里,也是通過這樣一種東西來實現了3D效果。如果在計算機屏幕上面繪制3D模型,那么我們首先在3D軟件上制作出這個模型,這個模型會有一個原點,來建一個坐標系,無論是左手還是右手都差不多,這個坐標系,我們就叫做模型坐標系,那么這個模型的每個部位都相對於原點有一個坐標。

  世界坐標系:既然每個模型都有一個坐標系,就相當於你自己舉着手,你的手在臉的正前方,那么相對於旁邊的人,你的手在哪兒。那么就會有了一個概念叫世界坐標系,在世界坐標系中,每個模型的坐標都是相對於世界坐標系原點的,那么除非重疊,否則是不可能出現坐標一樣的情況。就相當於你站的位置,不會再有人站了一樣。而我們的光照計算也會是在世界坐標系中進行。

  攝影坐標系:每個人都是在以自己的眼睛來看這個世界,比如你轉動你的眼睛,看到的事物就會不一樣。同樣,在計算機的世界里,每次只能從唯一的視角出發來渲染物體,3D游戲都會提供攝像機漫游的功能,屏幕顯示的內容會隨着攝像機的變化而變化,這是因為GPU將物體的頂點坐標從世界坐標系轉到了攝像機坐標系。所謂的攝像機坐標系,是以攝像機為原點,由視線方向,視角和遠近平面,組成的一個梯形體的三維空間,叫做viewing frustum(視錐體)如下圖

既然可以看見的區域已經確定,那么GPU就得做一下篩檢,就像你面朝大海,即便春暖花開,你也只能看到你朝着的那面,你背后的風景你是看不到的,但那又客觀存在着。這個時候,GPU就得做一下裁剪,在這個區域內的東西才會渲染,不在這個區域內的,那就只能被拋棄了,這一步叫做裁剪(clip),怎么判斷物體在不在這個區域的過程,叫做裁剪算法。

至於怎么裁剪的,過程算法比較復雜,請自行參閱資料(這個過程也可以在應用程序中做)。裁剪過后,你這些東西都還是在3D空間里面的概念,而始終得顯示在二維的屏幕上面,那么就得有個過程叫做屏幕映射,也就是說將3D的東西在2D的平面上顯示出來就如同將這個立方體畫在紙上,而你一看到一張紙上畫的圖,還是看出3D效果來。

之后的步驟,叫做圖元裝配,根據頂點的位置和索引關系,組成線和面,然后將超出屏幕外的三角形進行裁剪,就像一個三角形有一個頂點在屏幕外,剪掉之后,這三角形就會變成四邊形了。接下來的過程,叫做光柵化,所謂光柵化,就是給顯示器的像素點賦值,屏幕是由一個一個的像素點構成,給每個點賦值上相應的顏色,連起來就是一整個屏幕了,結果之前的過程,我們可以得到每個點的屏幕坐標值,也知道我們要繪制成啥樣(點,線,面)其中還有個問題,如圖

 

 

 

 

 

之后,我們就需要知道每個頂點的顏色了,這個顏色也在頂點信息之中,其中會牽涉到一種情況叫做混色,是根據當前的顏色跟正在計算的顏色的透明值,混合為一種顏色進行輸出,也就是我們常說的Alpha值,一般叫做alpha混合技術,每個像素都關聯一個RGB顏色值和一個A值,Alpha值用來描述物體的透明度.

計算公式為newColor=curColor*a+(1-a)*nextColor   。混合之后,顏色被寫入幀緩存中。那么如果同樣一個位置的,有兩個頂點,如果有兩種顏色,而且都不透明,那么,到底是繪制那一種顏色呢?這里就有一個概念,叫做Z Buffer一般叫Z緩沖區,或者叫深度緩沖區,用來確定這個遮擋關系,這個值在(0,1)值越小,離近裁屏幕就更近,想象一下,在現實生活中,兩塊木板豎着疊在你面前,你當然只能看到近的那塊。那么,GPU通過比較來判斷頂點之間的遮擋關系,這個值其實也只是一個相對的大小,完全就是用來比較才有用的。

算了,暫時停一下先,好累的說

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM