1.固定渲染管線與可編程渲染管線的區別:
1)、固定渲染管線 ——這是標准的幾何&光照(T&L)管線,功能是固定的,它控制着世界、視、投影變換及固定光照控制和紋理混合。T&L管線可以被渲染狀態控制,矩陣,光照和采制參數。
2)、頂點着色器——圖形開發人員可以對渲染管線中的頂點運算和像素運算分別進行編程處理了,而無須象以前那樣套用一些固定函數,取代設置參數來控制管線,最早出現與DX8,包括PS和VS兩部分。
2.為了解決D3D或者OpenGL對不同硬件廠商的支持,解決移植性的問題,可以通過將加速卡功能抽象出來,統一定義接口的形式來實現。於是,人們采用了典型的分層模式(參閱:設計模式),將一套應用程序分為3個層次:
應用程序層 -> 硬件抽象層 -> 硬件層其中
應用層 就是游戲和應用軟件開發人員的開發主體,他們調用統一的加速卡API來進行上層開發,而不用考慮移植性問題;
硬件抽象層 則抽象出硬件的加速功能,進行有利於應用層開發的封裝,並向應用層開放API;
硬件層 將硬件驅動提供給抽象層,以實現抽象層加速功能的有效性。
這個結構有效的將游戲和應用程序 與 硬件加速卡隔離開,這就很好的提升了程序的移植能力。並且,還有一個好處就是,開發
人員的知識復用率得到提高,從而降低了這類軟件的開發門檻。
3.3D加速卡的主要功能就是協助CPU,負責將內存中的矢量圖像數據(頂點集合)進行變換、光照計算、裁剪等操作,最后經過光柵化將圖像呈現給人眼。這個過程就叫做渲染
D3D把整個渲染分為9個步驟,9個步驟的組合,就叫做流水線,或者叫 管線 (參閱 設計模式 之 流水線模式)。
D3D的渲染管線(Rendering Pipeline):局部坐標變換 -> 世界坐標變換 ->觀察坐標變換->背面消除->光照->裁剪->投影->視口計算->光柵化。
無論是固定渲染管線還是可編程管線,都需要經過這九個步驟:
可編程管線,顧名思義,就是說管線中的某些環節是可以被控制的。人們可以通過對GPU中的着色器進行編程的方式,來控制、管理加速卡的渲染效果。
着色器分為 頂點着色器和像素着色器。
頂點着色器是在進行坐標變換 和光照計算時工作
像素着色器是在光柵化環節工作。
人們對着色器進行自定義編程時,這個流水線就叫做 可編程管線。同時,D3D還提供默認的着色器程序,當游戲或應用程序完全使用默認着色器程序時,這個流水線就叫做 固定管線。
4.變換步驟:
在固定管線中,變換分成2個步驟:
局部坐標系到世界坐標系 和 世界坐標系到觀察坐標系。
局部坐標系:就是建模坐標系,它是在建模時由3DMAX之類的工具定義的
世界坐標系:用來統一場景中各個object的位置、尺寸等規格
觀察坐標系:也就是攝像機的坐標系。
局部坐標系到世界坐標系變換:
這個變換是為了把在不同建模工具或者有用不同規格的建模尺寸下設計的模型,都統一到一個通用的坐標系下面。這個動作的作用,就像秦始皇統一度量衡一樣。從局部坐標系到世界坐標系 這個變換的動作,通常是在游戲設計時,由 游戲工具(如:場景編輯器)來預先計算,並且為每個模型都計算出一個變換矩陣(即記錄模型在游戲場景中的 大小、朝向、位置),叫做世界坐標變換矩陣。在渲染時,實時的應用這些矩陣來參與運算寫法:
D3DXMATRIX worldMatrix; //這個矩陣就從文件中讀進來
Device->SetTransform(D3DTS_WORLD, &worldMatrix); 注意,使用宏 D3DTS_WORLD
從世界坐標系到觀察坐標系變換:
這個變換動作,實際上是為了簡化運算而做的。這樣變換之后,所有的頂點也就可以直接轉換為向量,非常的便於某些計算。這個動作通常是,將攝像機平移到世界坐標系原點,再旋轉攝像師,使它的光軸與世界坐標系z軸方向一致。與此同時,空間中的所有幾何體都要隨攝像機一同變換,以確保攝像機的視場不變。這個變換叫取景變換,變換后得到觀察坐標系。寫法如下:
D3DXMATRIX ViewMatrix; D3DXVECTOR3 position, targetPoint, worldUp;
D3DXMatrixLookAtLH(&ViewMatrix, //[OUT], 計算出的變換矩陣 &position, //攝像機位置 &targetPoint, //攝像機的觀察朝向 &worldUp);//攝像機的y朝向,也就是頭的朝向
Device->SetTransform(D3DTS_VIEW, &ViewMatrix); 注意宏,D3DTS_VIEW
其實,D3DXMatrixLookAtLH()函數只是類似功能函數中的一個,注意后綴 LH 這表示左手坐標系,對應的還有一個右手坐標系,它們的區別在於:左手系 其z軸向里為正;右手系向外為正。
D3DXMatrixLookAtLH()函數解析: The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixLookAtLH function can be used as a parameter for another function. This function uses the following formula to compute the returned matrix. zaxis = normal(At - Eye) xaxis = normal(cross(Up, zaxis)) yaxis = cross(zaxis, xaxis) xaxis.x yaxis.x zaxis.x 0 xaxis.y yaxis.y zaxis.y 0 xaxis.z yaxis.z zaxis.z 0 -dot(xaxis, eye) -dot(yaxis, eye) -dot(zaxis, eye) l 5.