G-Buffer

G-buffering是一種在Video Post中基於圖象過濾和圖層事件中可使用的物體蒙板的一種著色技術。用戶可以通過標記物體ID或材質ID來得到專用的圖象通道。

基本介紹

  • 中文名:幾何緩衝
  • 外文名:G-Buffer
  • 說明:物體蒙板的一種著色技術
  • 簡介:包含顏色、世界空間坐標的紋理
互動式渲染中的G-Buffer
指Geometry Buffer,亦即“幾何緩衝”。區別於普通的僅將顏色渲染到紋理中,G-Buffer指包含顏色、法線、世界空間坐標的緩衝區,亦即指包含顏色、法線、世界空間坐標的紋理。
由於G-Buffer需要的向量長度超出通常紋理能包含的向量的長度,通常在遊戲開發中,使用多渲染目標技術來生成G-Buffer,即在一次繪製中將顏色、法線、世界空間坐標分別渲染到三張浮點紋理中。
如在DirectX平台下:
//OnCreateDevice中:
//先創建三張紋理及其相應渲染表面,分別用於存法線(Normal)、顏色(Color)、空間坐標(Position)
V_RETURN(pd3dDevice->CreateTexture(pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &g_pNormalMap, NULL));
V_RETURN(g_pNormalMap->GetSurfaceLevel(0, &g_pNormalSurface));
V_RETURN(pd3dDevice->CreateTexture(pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &g_pColorMap, NULL));
V_RETURN(g_pColorMap->GetSurfaceLevel(0, &g_pColorSurface));
V_RETURN(pd3dDevice->CreateTexture(pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &g_pPositionMap, NULL));
V_RETURN(g_pPositionMap->GetSurfaceLevel(0, &g_pPositionSurface));
//開啟多渲染目標
pd3dDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA);
pd3dDevice->SetRenderState(D3DRS_COLORWRITEENABLE1, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA);
pd3dDevice->SetRenderState(D3DRS_COLORWRITEENABLE2, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA);
//OnFrameRender中:
//保存螢幕表面,設定渲染目標為0,1,2號
LPDIRECT3DSURFACE9 pRTScreen;
V( pd3dDevice->GetRenderTarget(0, &pRTScreen) );
V( pd3dDevice->SetRenderTarget(0, g_pNormalSurface));
V( pd3dDevice->SetRenderTarget(1, g_pColorSurface));
V( pd3dDevice->SetRenderTarget(2, g_pPositionSurface));
/*……渲染場景……*/
//恢復渲染目標
V( pd3dDevice->SetRenderTarget(0, pRTScreen));
V( pd3dDevice->SetRenderTarget(1, NULL));
V( pd3dDevice->SetRenderTarget(2, NULL));
//Shader中,定義像素格式為COLOR[n],注意在輸出時需要把法線和空間坐標映射到0~1範圍
struct PS_OUTPUT
{
float4 Normal : COLOR0; // Normal
float4 RGBColor : COLOR1; // Pixel color
float4 Position : COLOR2; // Position
};

相關詞條

熱門詞條

聯絡我們