Unity3D引擎之渲染技術系列五

2021-07-30 03:53:01 字數 1655 閱讀 5986

筆者介紹:姜雪偉,it公司技術合夥人,it高階講師,csdn社群專家,特邀編輯,暢銷書作者,國家專利發明人;已出版書籍:《手把手教你架構3d遊戲引擎》電子工業出版社和《unity3d實戰核心技術詳解》電子工業出版社等。

經過投影矩陣的變換後,接下來開始進行裁剪操作了,當完成所有的裁剪工作後,就需要進行真正的投影了,也就是說需要把視錐體投影到螢幕空間中,螢幕空間是乙個二維空間,因此,必須把頂點從裁剪空間投影到螢幕空間中,生成對應的2d座標。這個過程需要兩個步驟。

首先,需要進行標準齊次除法,也稱為透視除法,就使用齊次座標系的w分量去除以x,y,z分量。在opengl中,我們把這一步得到的座標叫做歸一化的裝置座標(ndc),這個在以前的部落格中有所介紹。不理解的讀者可以去翻閱以前的博文,經過這一步,可以把座標從齊次裁剪座標空間轉換到ndc中。經過透視投影變換後的裁剪空間,進過齊次除法後會變換到乙個立方體內。按照opengl的傳統,這個立方體的x,y,z分量的範圍都是[-1,1]。但是在directx中,z的分量範圍是[0,1]。而unity選擇了opengl這樣的齊次裁剪空間。如下圖所示:

而對於正交投影來說,它的裁剪空間實際已經是乙個立方體了,而且由於經過正交投影矩陣變換後的頂點w分量是1,因此齊次除法並不會對頂點的x,y,z座標產生影響,如下圖所示:

經過齊次除法後,透視投影和正交投影的視錐體都變換到乙個相同的立方體內。現在,我們可以根據變換後的x和y座標來對映輸出視窗的對應畫素座標。

在unity 中,螢幕空間中左下角的畫素座標是(0,0),右上角的畫素座標是(pixelwidth,pixelheight),由於當前的x和y座標都是[-1,1],因此對映的過程就是乙個縮放的過程。

齊次除法和螢幕對映的過程可以使用下面的公式來表示:

在unity中,從裁剪空間到螢幕空間的轉換是由unity幫我們完成的,我們的頂點著色器只需要把頂點轉換到裁剪空間即可。在前面步驟中,我們知道了裁剪空間中模型的孩子位置-(11.691,15.311,23.692,27.31)。接下來確定模型的孩子節點在螢幕上的畫素位置。假設,當前螢幕的畫素寬度為400,高度為300。首先,我們需要進行齊次除法,把裁剪空間中的座標投影到ndc中,然後再對映到螢幕空間中。過程如下:

這樣就可以得到模型的孩子節點(285.617,234.096)。

總結:以上就是乙個頂點如何從模型空間變換到螢幕空間的過程,以及它們之間的矩陣變換。頂點著色器的最基本任務就是把頂點座標從模型空間轉換到裁剪空間中。而在片元著色器中,通常可以得到該片元在螢幕空間的畫素位置。以上只是告訴讀者一些最重要的座標空間,在實際開發中也會遇到,比如切線空間,通常用於法線對映。最後把unity的各個座標空間給讀者展示如下:

Unity3D技術之參考座標系詳解

參考座標系 reference coordinate system 列表是讓你指定用於變換 移動 move 旋轉rotate 和縮放scale 的座標系。選項包括檢視座標 view 螢幕座標 screen 世界座標 world 父座標 parent 區域性座標 local 網格座標 grid 和拾取...

Unity3D 參考座標系

參考座標系 reference coordinate system 列表是讓你指定用於變換 移動move 旋轉rotate和縮放scale 的座標系。選項包括檢視座標view,螢幕座標screen,世界座標world,父座標parent,區域性座標local,網格座標grid和拾取座標pick。在螢...

unity3d 參考座標系

參考座標系 reference coordinate system 列表是讓你指定用於變換 移動move 旋轉rotate和縮放scale 的座標系。選項包括檢視座標view,螢幕座標screen,世界座標world,父座標parent,區域性座標local,網格座標grid和拾取座標pick。在螢...