Ⅰ opengl為什麼使用右手坐標系
眾所周知,在固定管線的OpenGL中只能使用右手坐標系,OpenGL並沒有提供API讓你在左右手坐標系中切換。而在可編程管線的OpenGL中,就沒有那麼
多限制了,所有的Vertex Transform都由你來控制。事實上,你直接把左手坐標系的頂點和矩陣傳給OpenGL Shader也是沒有問題的,在Vertex Shader
使用mul(v, matrix)變換頂點,得到的會是跟Direct3D同樣的結果。注意是跟Direct3D同樣的結果,而不是跟固定管線OpenGL相同的結果,事實上,正如
上面所說,左右手坐標系渲染的結果的左右顛倒的。唯一要區別的是Viewport的Z,在OpenGL中,裁剪空間的Z坐標是[-1. 1],而在Direct3D中是[0, 1],
而經過Viewport變化後,不管是OpenGL還是Direct3D, Z都是[0, 1], OpenGL的視口變化是 Z=(Z/W + 1) / 2 ,而Direct3D是Z=(Z/W),這對Depth
Test不受影響,Depth Test只比較相對位置遠近,但Depth Buffer的值就不同了。所以需要對project matrix做一些調整,才能讓他們寫到depth buffer中
的數值相同。具體來說,如果要讓OpenGL流水線接受D3D的project matrix,就需要乘上
相當於把project space的頂點z都作了z = z * 2 – 1的操作,所以經過viewport變換就一致了。
Ⅱ 如何區分可編程渲染流水線與固定渲染流水線
1.固定渲染管線與可編程渲染管線的區別:
1)、固定渲染管線
——這是標準的幾何&光照(T&L)管線,功能是固定的,它控制著世界、視、投影變換及固定光照控制和紋理混合。T&L管線可以被渲染狀態控制,矩陣,光照和採制參數。
2)、頂點著色器——圖形開發人員可以對渲染管線中的頂點運算和像素運算分別進行編程處理了,而無須象以前那樣套用一些固定函數,取代設置參數來控制管線,最早出現與DX8,包括PS和VS兩部分。