DirectX Graphics 프로그래밍 가이드 고도의 주제 프레임 버퍼 포그(안개:fog)의 종류 픽셀 포그(안개:fog)   [목차열람] [주소복사] [슬롯비우기]
픽셀 포그(안개:fog)
 
Microsoft DirectX 9.0

픽셀 포그(안개:fog)


픽셀 포그(안개:fog)라는 이름은, 장치 드라이버가 픽셀 단위로 계산하는 것에 유래한다. 이것은 정점 포그(안개:fog)와는 다르다. 정점 포그(안개:fog)는, 변환 및 조명의 계산시에 파이프라인이 계산한다. 픽셀 포그(안개:fog)는, 드라이버에 따라서는, 혼합 계산에 적용하는 포그(안개:fog) 계수 ( 각 픽셀의 깊이를 사용)를 결정하기 위해서(때문에) 사전에 계산된 참조 테이블을 사용하기 (위해)때문에, 테이블 포그(안개:fog)라고 부르기도 한다. 픽셀 포그(안개:fog)는,D3DFOGMODE 열거형의 멤버가 가리키는 포그(안개:fog) 공식의 어느쪽이든을 사용해 적용한다. 이러한 공식의 처리은 드라이버 고유하다. 드라이버가 복잡한 포그(안개:fog) 공식을 지원 하고 있지 않는 경우는, 보다 단순한 공식을 사용하는 것.

시점으로부터의 상대 깊이와 Z 베이스의 깊이

깊이 버퍼내에서의 z 값의 불균등인 격차에 의해 생기는, 포그(안개:fog)의 부자연스러운 그래픽스 효과를 억제하기 위해서(때문에), 대부분의 하드웨어 장치에서는, 픽셀 포그(안개:fog)에 z 베이스 깊이값은 아니고 시점으로부터의 상대 깊이를 사용한다. 시점으로부터의 상대 깊이란, 본질적으로는 동차 좌표 세트로부터의 w 요소이다. Microsoft® Direct3D® 는, 장치 공간 좌표로부터 RHW 요소의 역수를 취득해 진정한 w 를 재생성한다. 장치가 시점으로부터의 상대 포그(안개:fog)를 지원 하고 있는 경우,IDirect3DDevice9::GetDeviceCaps 메서드를 호출하면, 그 장치는 D3DCAPS9 구조체의 RasterCaps 멤버에 D3DPRASTERCAPS_WFOG 플래그를 설정한다. 레퍼런스 래스터라이저를 제외해, 소프트웨어 장치는 항상 z 를 사용해 픽셀 포그(안개:fog) 이펙트를 계산한다.

시점과의 상대 포그(안개:fog)가 지원 되고 있을 때, 설정된 투영 행렬로 장치 공간의 w 값에 대응하는, 월드 공간의 z 값을 생성하는 경우, 시스템은 z 베이스 깊이보다 시점으로부터의 상대 깊이를 우선해 자동적으로 사용한다. 투영 행렬을 설정하려면 ,IDirect3DDevice9::SetTransform 메서드를 호출해,D3DTS_PROJECTION 값을 사용해, 목적의 행렬을 나타내는 D3DMATRIX 구조체를 건네준다. 투영 행렬이 이 요건에 대응하고 있지 않는 경우, 포그(안개:fog) 이펙트는 올바르게 적용되지 않는다. 대응하고 있는 행렬의 생성의 더 자세한 정보는, 「W 버퍼에 유효한 투영 행렬」을 참조할것. 「투영 변환이란」으로 설명하는 퍼스펙티브 투영 행렬은, 적절한 투영 행렬을 생성한다.

Direct3D 에서는, 현재 설정되어 있는 투영 행렬을 사용해 w 베이스 깊이의 계산을 실행한다. 따라서, 애플리케이션으로 Direct3D 변환 파이프라인을 사용하지 않는 경우여도, 목적의 w 베이스 기능을 얻어오기 위해 적절한 투영 행렬을 설정해 둘 필요가 있다.

Direct3D 는 투영 행렬의 제 4 열을 조사한다. 계수가 [0,0,0,1] (아핀 투영)의 경우에는, 시스템은 z 베이스의 깊이값을 포그(안개:fog)에 사용한다. 이 경우, 장치 공간의 선형 포그(안개:fog) 이펙트의 시작 거리 및 종료 거리를 지정할 필요도 있다. 이 범위는, 사용자에 가장 가까운 포인트를 0.0 으로 해, 가장 먼 포인트를 1.0 으로 한 범위이다.

픽셀 포그(안개:fog)의 사용법

애플리케이션으로 픽셀 포그(안개:fog)를 유효하게 하려면 , 다음의 순서를 실행한다.

  1. D3DRS_FOGENABLE 렌더링 스테이트를 TRUE 로 설정해, 포그(안개:fog) 혼합을 유효하게 한다.
  2. D3DRS_FOGCOLOR 렌더링 스테이트로, 목적의 포그(안개:fog)색을 설정한다.
  3. D3DRS_FOGTABLEMODE 렌더링 스테이트를 D3DFOGMODE 열거형의 대응하는 멤버로 설정해, 사용하는 포그(안개:fog) 공식을 선택한다.
  4. 선택한 포그(안개:fog) 모드에 필요한 포그(안개:fog) 파라미터를, 관련하는 렌더링 스테이트로 설정한다. 선형 포그(안개:fog)의 시작 거리와 종료 거리, 지수 포그(안개:fog)의 포그(안개:fog) 밀도도 포함한다.

다음 샘플 코드는, 이러한 순서를 나타내고 있다.

// 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 메서드는, 제 2 파라미터에 DWORD 값만을 받지만, 부동 소수점의 포그(안개:fog) 파라미터가 요구되는 일도 있다. 위에의예에서는 부동 소수점의 값을 IDirect3DDevice9::SetRenderState 에 건네주기 위해서(때문에), 데이터를 평행이동 하는 것이 아니라, 부동 소수점 변수의 주소를 DWORD 포인터에 캐스트 해, 다음에 그것을 참조하고 있다.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP