안개는 그리려는 픽셀을 깊이 값에 따라 미리 설정해 둔 안개 컬러를 혼합하여 변조하는 작업이다.
멀어질 수록 흰색이 되도록 설정하면, 공기 원근을 표현할 수 있다. 또한 리얼한 정경을 표현하거나 먼 경치를 희미하게 표현할 수 있다.
포그는 장면 내에 개체의 깊이 또는 시점으로부터의 거리에 근거해 장면 내의 개체의 색과 선택한 포그 색을 블랜딩해 실현된다.
개체가 멀어짐에 따라 원래 색에 대한 포그색의 블렌드가 늘어난다.
장면에 안개를 추가하는 방법에는 정점 포그와 픽셀 포그가 있다.
1. 정점 포그
// For brevity, error values in this example are not checked // after each call. A real-world application should check // these values appropriately. // // For the purposes of this example, g_pDevice is a valid // pointer to an IDirect3DDevice9 interface. void SetupVertexFog(DWORD Color, DWORD Mode, BOOL UseRange, FLOAT Density) { float Start = 0.5f, // Linear fog distances End = 0.8f; // Enable fog blending. g_pDevice->SetRenderState(D3DRS_FOGENABLE, TRUE); // Set the fog color. g_pDevice->SetRenderState(D3DRS_FOGCOLOR, Color); // Set fog parameters. if(D3DFOG_LINEAR == Mode) { g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, Mode); g_pDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&Start)); g_pDevice->SetRenderState(D3DRS_FOGEND, *(DWORD *)(&End)); } else { g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, Mode); g_pDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density)); } // Enable range-based fog if desired (only supported for // vertex fog). For this example, it is assumed that UseRange // is set to a nonzero value only if the driver exposes the // D3DPRASTERCAPS_FOGRANGE capability. // Note: This is slightly more performance intensive // than non-range-based fog. if(UseRange) g_pDevice->SetRenderState(D3DRS_RANGEFOGENABLE, TRUE); }
다각형의 각 정점에 포그 계산을 적용해 결과를 보간한다.
포그에는 여러가지 열거형이 있다.
// 포그 켜기
g_pd3dDevice->SetRenderState(D3DRS_FOGENABLE,TRUE);
// 포그 색 결정
g_pd3dDevice->SetRenderState(D3DRS_FOGCOLOR,m_Color);
위 그림을 보면 일직선인 것을 볼 수 있다.
2. 픽셀 포그
// For brevity, error values in this example are not checked // after each call.A real-world application should check // these values appropriately. // // For the purposes of this example, g_pDevice is a valid // pointer to an IDirect3DDevice9 interface. void SetupPixelFog(DWORD Color, DWORD Mode) { float Start = 0.5f; // For linear mode float End = 0.8f; float Density = 0.66f; // For exponential modes // Enable fog blending. g_pDevice->SetRenderState(D3DRS_FOGENABLE, TRUE); // Set the fog color. g_pDevice->SetRenderState(D3DRS_FOGCOLOR, Color); // Set fog parameters. if( Mode == D3DFOG_LINEAR ) { g_pDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode); g_pDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&Start)); g_pDevice->SetRenderState(D3DRS_FOGEND, *(DWORD *)(&End)); } else { g_pDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode); g_pDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density)); }
// 거리에 따른 포그 결정
// 정점 포그에서만 먹는다.
g_pd3dDevice->SetRenderState(D3DRS_RANGEFOGENABLE,TRUE);
를 사용하면 거리에 따라 포그 농도를 지정할 수 있다.
아래 그림은 깊이에 따라 포그 농도를 달리 준 것이다.
[참조]
http://telnet.or.kr/directx/graphics/programmingguide/gettingstarted/rendering/fog/fog.htm
http://www.slideshare.net/KooKyeongWon/fog-13069184
'예전 > 3D' 카테고리의 다른 글
[3D] 수면 파동 (0) | 2013.01.18 |
---|---|
[3D] 수면을 해보자 (3) | 2013.01.15 |
노멀매핑하려다가 ... (0) | 2013.01.14 |
[3D] LOD Crack (0) | 2013.01.10 |
[3D] LOD (Level of Detail) (0) | 2013.01.10 |