다음을 통해 공유


꼭짓점 안개(Direct3D 9)

시스템은 꼭짓점 안개를 수행할 때 다각형의 각 꼭짓점에서 안개 계산을 적용한 다음 래스터화 중에 다각형의 얼굴에서 결과를 보간합니다. 꼭짓점 안개 효과는 Direct3D 조명 및 변환 엔진에 의해 계산됩니다. 자세한 내용은 안개 매개 변수(Direct3D 9)를 참조하세요.

애플리케이션이 변환 및 조명에 Direct3D를 사용하지 않는 경우 애플리케이션은 안개 계산을 수행해야 합니다. 이 경우 각 꼭짓점에 대한 반사 색의 알파 구성 요소에 계산되는 안개 요소를 배치합니다. 범위 기반, 볼륨 또는 기타 등 원하는 수식을 자유롭게 사용할 수 있습니다. Direct3D는 제공된 안개 요소를 사용하여 각 다각형의 얼굴을 보간합니다. 자체 변환 및 조명을 수행하는 애플리케이션은 자체 꼭짓점 안개 계산도 수행해야 합니다. 따라서 이러한 애플리케이션은 안개 혼합 (Direct3D 9) 및 안개 색(Direct3D 9) 에 설명된 대로 안개 혼합만 사용하도록 설정하고 연결된 렌더링 상태를 통해 안개 색을 설정해야 합니다.

참고

꼭짓점 셰이더를 사용하는 경우 꼭짓점 안개를 사용해야 합니다. 이 작업은 꼭짓점 셰이더를 사용하여 꼭짓점별 안개 강도를 oFog 레지스터에 기록하여 수행됩니다. 픽셀 셰이더가 완료되면 oFog 데이터를 사용하여 안개 색을 선형으로 보간합니다. 이 강도는 픽셀 셰이더에서 사용할 수 없습니다.

 

Range-Based 안개

참고

Direct3D는 Direct3D 변환 및 조명 엔진에서 꼭짓점 안개를 사용하는 경우에만 범위 기반 안개 계산을 사용합니다. 이는 픽셀 안개가 디바이스 드라이버에서 구현되고 현재 픽셀당 범위 기반 안개를 지원하는 하드웨어가 없기 때문입니다. 애플리케이션이 자체 변환 및 조명을 수행하는 경우 자체 안개 계산, 범위 기반 또는 기타 작업을 수행해야 합니다.

 

경우에 따라 안개를 사용하면 개체가 직관적이지 않은 방식으로 안개 색과 혼합되는 그래픽 아티팩트를 도입할 수 있습니다. 예를 들어 두 개의 눈에 보이는 개체가 있는 장면을 상상해 보세요. 하나는 안개의 영향을 받을 만큼 멀리 떨어져 있고 다른 하나는 영향을 받지 않을 정도로 가깝습니다. 보기 영역이 제자리에 회전하는 경우 개체가 고정되어 있더라도 겉보기 안개 효과가 변경됩니다. 다음 다이어그램은 이러한 상황에 대한 하향식 보기를 보여줍니다.

두 뷰포인트의 다이어그램 및 두 개체의 안개에 미치는 영향

범위 기반 안개는 안개 효과를 결정하는 또 다른, 더 정확한 방법입니다. 범위 기반 안개에서 Direct3D는 안개 계산을 위해 뷰포인트에서 꼭짓점까지의 실제 거리를 사용합니다. Direct3D는 장면 내 꼭짓점의 깊이가 아니라 두 점 사이의 거리가 증가함에 따라 안개의 영향을 증가시켜 회전 아티팩트 방지합니다.

현재 디바이스가 범위 기반 안개를 지원하는 경우 IDirect3DDevice9::GetDeviceCaps 메서드를 호출할 때 D3DCAPS9의 RasterCaps 멤버에서 D3DPRASTERCAPS_FOGRANGE 값을 설정합니다. 범위 기반 안개를 사용하도록 설정하려면 D3DRS_RANGEFOGENABLE 렌더링 상태를 TRUE로 설정합니다.

범위 기반 안개는 변환 및 조명 중에 Direct3D에 의해 계산됩니다. Direct3D 변환 및 조명 엔진을 사용하지 않는 애플리케이션도 자체 꼭짓점 안개 계산을 수행해야 합니다. 이 경우 각 꼭짓점에 대한 반사 구성 요소의 알파 구성 요소에 범위 기반 안개 요소를 제공합니다.

꼭짓점 안개 사용

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

  1. D3DRS_FOGENABLE TRUE로 설정하여 안개 혼합을 사용하도록 설정합니다.
  2. D3DRS_FOGCOLOR 렌더링 상태에서 안개 색을 설정합니다.
  3. D3DRS_FOGVERTEXMODE 렌더링 상태를 D3DFOGMODE 열거형 형식의 멤버로 설정하여 원하는 안개 수식을 선택합니다.
  4. 렌더링 상태에서 선택한 안개 수식에 대해 안개 매개 변수를 원하는 대로 설정합니다.

C++로 작성된 다음 예제에서는 이러한 단계가 코드에서 어떤 모습일지 보여 있습니다.

// 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);
}

IDirect3DDevice9::SetRenderState 메서드가 두 번째 매개 변수의 DWORD 값만 허용하더라도 일부 안개 매개 변수는 부동 소수점 값으로 필요합니다. 이 예제에서는 부동 소수점 변수의 주소를 DWORD 포인터로 캐스팅한 다음 역참조하여 데이터 변환 없이 이러한 메서드에 부동 소수점 값을 성공적으로 제공합니다.

안개 유형