꼭짓점 안개(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 변환 및 조명 엔진을 사용하지 않는 애플리케이션도 자체 꼭짓점 안개 계산을 수행해야 합니다. 이 경우 각 꼭짓점에 대한 반사 구성 요소의 알파 구성 요소에 범위 기반 안개 요소를 제공합니다.
꼭짓점 안개 사용
애플리케이션에서 꼭짓점 안개를 사용하도록 설정하려면 다음 단계를 사용합니다.
- D3DRS_FOGENABLE TRUE 설정하여 안개 혼합을 사용하도록 설정합니다.
- D3DRS_FOGCOLOR 렌더링 상태에서 안개 색을 설정합니다.
- D3DRS_FOGVERTEXMODE 렌더링 상태를 D3DFOGMODE 열거형 형식의 멤버로 설정하여 원하는 안개 수식을 선택합니다.
- 렌더링 상태에서 선택한 안개 수식에 대해 안개 매개 변수를 원하는 대로 설정합니다.
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 포인터로 캐스팅한 다음 역참조하여 데이터 변환 없이 이러한 메서드에 부동 소수점 값을 성공적으로 제공합니다.
관련 항목