2012年4月1日 星期日

Unreal的繪圖底層界面

UE提供一個跨平台的繪圖底層界面,叫做Render Hardware Interface,簡稱RHI。它是以全域函式的形式給子系統去呼叫,例如RHISetViewport()、RHISetDepthState()、RHISetRenderTarget()等。在RHI.h的#include "RHIMethods.h"那行宣告這些全域函式。

而這些RHI全域函式的定義形式分成StaticRHI和DynamicRHI兩種。差別在於這些函式是轉呼靜態成員函式還是虛擬函式,根據不同平台擇一使用。

Windows DynamicRHI
Mac DynamicRHI
XBox360 StaticRHI
PS3 StaticRHI
PS Vita StaticRHI
WiiU StaticRHI

StaticRHI


StaticRHI會有一個型別為STATIC_RHI_CLASS_NAME類別的全域變數叫GStaticRHI。在StaticRHI.h裡會把RHI全域函式實作成去轉呼GStaticRHI的同名靜態成員函式。

DynamicRHI


DynamicRHI一樣也有一個全域變數叫GDynamicRHI,型別為FDynamicRHI。在DynamicRHI.h裡一樣會把RHI全域函式實作成去轉呼GDynamicRHI的同名成員函式,只是它們是宣告成純虛擬函而非靜態成員函式。實際實作是在各平台裡的原始碼。

在D3D9版,FD3D9DynamicRHI類別繼承FDynamicRHI,並且實作這些虛擬RHI函式。
在D3D10版,FD3D10DynamicRHI類別繼承FDynamicRHI,並且實作這些虛擬RHI函式。

例如D3D9版的RHISetViewport(),實際上它對應到的函式是FD3D9DynamicRHI::SetViewport()。

沒有留言:

張貼留言