픽셀 안개(Direct3D 9)
픽셀 안개는 디바이스 드라이버에서 픽셀 단위로 계산된다는 사실에서 해당 이름을 가져옵니다. 이는 변환 및 조명 계산 중에 파이프라인에서 계산하는 꼭짓점 안개와 다릅니다. 일부 드라이버는 미리 계산된 조회 테이블을 사용하여 각 픽셀의 깊이를 사용하여 혼합 계산에 적용하기 때문에 픽셀 안개를 테이블 안개라고도 합니다. D3DFOGMODE 열거형 형식의 멤버로 식별된 모든 안개 수식을 사용하여 적용할 수 있습니다. 이러한 수식의 구현은 드라이버에 따라 다릅니다. 드라이버가 복잡한 안개 수식을 지원하지 않는 경우 덜 복잡한 수식으로 저하되어야 합니다.
Eye-Relative 및 Z 기반 깊이
깊이 버퍼에서 z 값의 고르지 않은 분포로 인한 안개 관련 그래픽 아티팩트 완화를 위해 대부분의 하드웨어 디바이스는 픽셀 안개에 대한 z 기반 깊이 값 대신 눈 상대 깊이를 사용합니다. 눈 상대 깊이는 본질적으로 동종 좌표 집합의 w 요소입니다. Microsoft Direct3D는 디바이스 공간 좌표 집합에서 RHW 요소의 상호를 가져와 true w를 재현합니다. 디바이스가 시선 상대 안개를 지원하는 경우 IDirect3DDevice9::GetDeviceCaps 메서드를 호출할 때 D3DCAPS9 구조체의 RasterCaps 멤버에서 D3DPRASTERCAPS_WFOG 플래그를 설정합니다. 참조 래스터라이저를 제외하고 소프트웨어 디바이스는 항상 z를 사용하여 픽셀 안개 효과를 계산합니다.
눈 상대 안개가 지원되면 제공된 프로젝션 매트릭스가 디바이스 공간의 w 값과 동일한 세계 공간에서 z-값을 생성하는 경우 시스템은 z 기반 깊이가 아닌 눈 상대 깊이를 자동으로 사용합니다. D3DTS_PROJECTION 값을 사용하고 원하는 행렬을 나타내는 D3DMATRIX 구조를 전달하여 IDirect3DDevice9::SetTransform 메서드를 호출하여 프로젝션 행렬을 설정합니다. 프로젝션 행렬이 이 요구 사항을 준수하지 않으면 안개 효과가 제대로 적용되지 않습니다. 규격 행렬을 생성하는 방법에 대한 자세한 내용은 프로젝션 변환(Direct3D 9)을 참조하세요.
Direct3D는 w 기반 깊이 계산에 현재 설정된 프로젝션 행렬을 사용합니다. 따라서 애플리케이션은 Direct3D 변환 파이프라인을 사용하지 않더라도 원하는 w 기반 기능을 수신하도록 규격 프로젝션 매트릭스를 설정해야 합니다.
Direct3D는 프로젝션 행렬의 네 번째 열을 확인합니다. 계수가 [0,0,0,1]인 경우(아핀 프로젝션의 경우) 시스템은 안개에 z 기반 깊이 값을 사용합니다. 이 경우 디바이스 공간의 선형 안개 효과에 대한 시작 및 끝 거리도 지정해야 합니다. 이 간격은 가장 가까운 지점에서는 0.0, 가장 먼 지점에서는 1.0입니다.
픽셀 안개 사용
애플리케이션에서 픽셀 안개를 사용하도록 설정하려면 다음 단계를 사용합니다.
- D3DRS_FOGENABLE 렌더링 상태를 TRUE로 설정하여 안개 혼합을 사용하도록 설정합니다.
- D3DRS_FOGCOLOR 렌더링 상태에서 원하는 안개 색을 설정합니다.
- D3DRS_FOGTABLEMODE 렌더링 상태를 D3DFOGMODE 열거형 형식의 해당 멤버로 설정하여 사용할 안개 수식을 선택합니다.
- 연결된 렌더링 상태에서 선택한 안개 모드에 대해 안개 매개 변수를 원하는 대로 설정합니다. 여기에는 선형 안개의 시작 및 끝 거리와 지수 안개 모드의 안개 밀도가 포함됩니다.
다음 예제에서는 코드에서 이러한 단계가 어떻게 표시되는지 보여줍니다.
// 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));
}
IDirect3DDevice9::SetRenderState 메서드가 두 번째 매개 변수의 DWORD 값만 허용하더라도 일부 안개 매개 변수는 부동 소수점 값으로 필요합니다. 앞의 예제에서는 부동 소수점 변수의 주소를 DWORD 포인터로 캐스팅한 다음 역참조하여 데이터 변환 없이 IDirect3DDevice9::SetRenderState 에 부동 소수점 값을 제공합니다.
관련 항목