다음을 통해 공유


픽셀 안개(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입니다.

픽셀 안개 사용

애플리케이션에서 픽셀 안개를 사용하도록 설정하려면 다음 단계를 사용합니다.

  1. D3DRS_FOGENABLE 렌더링 상태를 TRUE로 설정하여 안개 혼합을 사용하도록 설정합니다.
  2. D3DRS_FOGCOLOR 렌더링 상태에서 원하는 안개 색을 설정합니다.
  3. D3DRS_FOGTABLEMODE 렌더링 상태를 D3DFOGMODE 열거형 형식의 해당 멤버로 설정하여 사용할 안개 수식을 선택합니다.
  4. 연결된 렌더링 상태에서 선택한 안개 모드에 대해 안개 매개 변수를 원하는 대로 설정합니다. 여기에는 선형 안개의 시작 및 끝 거리와 지수 안개 모드의 안개 밀도가 포함됩니다.

다음 예제에서는 코드에서 이러한 단계가 어떻게 표시되는지 보여줍니다.

// 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 에 부동 소수점 값을 제공합니다.

안개 유형