꼭 짓 점 안개 (Direct3D 9)Vertex Fog (Direct3D 9)

시스템에서 꼭 짓 점 fogging 수행 하는 경우 다각형의 각 꼭 짓 점에 안개 계산을 적용 한 다음 래스터화 중에 다각형의 표면에 걸쳐 결과를 보간합니다.When the system performs vertex fogging, it applies fog calculations at each vertex in a polygon, and then interpolates the results across the face of the polygon during rasterization. 꼭 짓 점 안개 효과는 Direct3D 조명 및 변환 엔진에서 계산 됩니다.Vertex fog effects are computed by the Direct3D lighting and transformation engine. 자세한 내용은 안개 매개 변수 (Direct3D 9)를 참조 하세요.For more information, see Fog Parameters (Direct3D 9).

응용 프로그램에서 변환 및 조명에 Direct3D를 사용 하지 않는 경우 응용 프로그램은 안개 계산을 수행 해야 합니다.If your application does not use Direct3D for transformation and lighting, the application must perform fog calculations. 이 경우 각 꼭 짓 점에 대 한 반사 색의 알파 구성 요소에서 계산 되는 안개 계수를 추가 합니다.In this case, place the fog factor that is computed in the alpha component of the specular color for each vertex. 원하는 모든 수식 (범위 기반, 대규모 또는 기타)을 자유롭게 사용할 수 있습니다.You are free to use whatever formulas you want - range-based, volumetric, or otherwise. Direct3D는 제공 된 안개 요소를 사용 하 여 각 다각형의 표면에 대해 보간합니다.Direct3D uses the supplied fog factor to interpolate across the face of each polygon. 자체 변환 및 조명을 수행 하는 응용 프로그램은 고유한 꼭 짓 점 안개 계산도 수행 해야 합니다.Applications that perform their own transformation and lighting must also perform their own vertex fog calculations. 따라서 이러한 응용 프로그램은 안개 혼합을 사용 하 고 안개 혼합 (direct3d 9)안개 색 (direct3d 9)에 설명 된 대로 연결 된 렌더링 상태를 통해 안개 색을 설정 하기만 하면 됩니다.As a result, such an application need only enable fog blending and set the fog color through the associated render states, as described in Fog Blending (Direct3D 9) and Fog Color (Direct3D 9).

참고

꼭 짓 점 셰이더를 사용 하는 경우 꼭 짓 점 안개를 사용 해야 합니다.When using a vertex shader, you must use vertex fog. 이는 꼭 짓 점 셰이더를 사용 하 여 oFog 레지스터에 꼭 짓 점 당 안개 강도를 기록 하는 방식으로 수행 됩니다.This is accomplished by using the vertex shader to write the per-vertex fog intensity to the oFog register. 픽셀 셰이더가 완료 된 후에는 oFog 데이터를 사용 하 여 안개 색으로 선형으로 보간합니다.After the pixel shader completes, the oFog data is used to linearly interpolate with the fog color. 이 강도는 픽셀 셰이더에 사용할 수 없습니다.This intensity is not available in a pixel shader.

Range-Based 안개Range-Based Fog

참고

Direct3D는 Direct3D 변환 및 조명 엔진과 함께 꼭 짓 점 안개를 사용 하는 경우에만 범위 기반 안개 계산을 사용 합니다.Direct3D uses range-based fog calculations only when using vertex fog with the Direct3D transformation and lighting engine. 이는 픽셀 안개는 장치 드라이버에서 구현 되 고 현재는 픽셀 별 범위 기반 안개를 지원할 수 있는 하드웨어가 없기 때문입니다.This is because pixel fog is implemented in the device driver, and no hardware currently exists to support per-pixel range-based fog. 응용 프로그램에서 자체 변환과 조명을 수행 하는 경우에는 자체 안개 계산, 범위 기반 또는 기타를 수행 해야 합니다.If your application performs its own transformation and lighting, it must perform its own fog calculations, range-based or otherwise.

경우에 따라 안개를 사용 하면 개체가 nonintuitive 방식으로 안개 색과 혼합 되도록 하는 그래픽 아티팩트가 발생할 수 있습니다.Sometimes, using fog can introduce graphic artifacts that cause objects to be blended with the fog color in nonintuitive ways. 예를 들어 보이는 개체가 두 개 있습니다. 즉, 안개에 영향을 줄 수 있을 만큼 멀리 떨어져 있고 다른 하나는 거의 영향을 받지 않을 수 있습니다.For example, imagine a scene in which there are two visible objects: one distant enough to be affected by fog, and the other near enough to be unaffected. 보기 영역을 회전 하는 경우 개체가 고정 된 경우에도 명백한 안개 효과가 변경 될 수 있습니다.If the viewing area rotates in place, the apparent fog effects can change, even if the objects are stationary. 다음 다이어그램에서는 이러한 상황의 하향식 보기를 보여 줍니다.The following diagram shows a top-down view of such a situation.

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

범위 기반 안개는 안개 효과를 결정 하는 또 다른 방법입니다.Range-based fog is another, more accurate, way to determine the fog effects. 범위 기반 안개에서 Direct3D는 관점에서 해당 안개 계산을 위해 꼭 짓 점에 이르는 실제 거리를 사용 합니다.In range-based fog, Direct3D uses the actual distance from the viewpoint to a vertex for its fog calculations. Direct3D는 장면 내에서 꼭 짓 점 깊이가 아닌 두 점 사이의 거리가 증가할수록 회전 아티팩트를 방지 하기 때문에 안개의 효과를 높입니다.Direct3D increases the effect of fog as the distance between the two points increases, rather than the depth of the vertex within in the scene, thereby avoiding rotational artifacts.

현재 장치에서 범위 기반 안개를 지 원하는 경우 _ IDirect3DDevice9:: GetDeviceCaps 메서드를 호출 하면 D3DCAPS9 의 RasterCaps 멤버에 D3DPRASTERCAPS FOGRANGE 값이 설정 됩니다.If the current device supports range-based fog, it will set the D3DPRASTERCAPS_FOGRANGE value in the RasterCaps member of D3DCAPS9 when you call the IDirect3DDevice9::GetDeviceCaps method. 범위 기반 안개를 사용 하도록 설정 하려면 D3DRS _ RANGEFOGENABLE render 상태를 TRUE 로 설정 합니다.To enable range-based fog, set the D3DRS_RANGEFOGENABLE render state to TRUE.

범위 기반 안개는 변환 및 조명 중 Direct3D에서 계산 됩니다.Range-based fog is computed by Direct3D during transformation and lighting. Direct3D 변환 및 조명 엔진을 사용 하지 않는 응용 프로그램 에서도 고유한 꼭 짓 점 안개 계산을 수행 해야 합니다.Applications that don't use the Direct3D transformation and lighting engine must also perform their own vertex fog calculations. 이 경우 각 꼭 짓 점에 대 한 반사 구성 요소의 알파 구성 요소에 범위 기반 안개 요소를 제공 합니다.In this case, provide the range-based fog factor in the alpha component of the specular component for each vertex.

꼭 짓 점 안개 사용Using Vertex Fog

응용 프로그램에서 꼭 짓 점 안개를 사용 하도록 설정 하려면 다음 단계를 수행 합니다.Use the following steps to enable vertex fog in your application.

  1. D3DRS _ fogenable을 TRUE 로 설정 하 여 안개 혼합을 사용 하도록 설정 합니다.Enable fog blending by setting D3DRS_FOGENABLE to TRUE.
  2. D3DRS _ fogcolor 렌더링 상태에서 안개 색을 설정 합니다.Set the fog color in the D3DRS_FOGCOLOR render state.
  3. D3DRS _ FOGVERTEXMODE render 상태를 D3DFOGMODE 열거 형식의 멤버로 설정 하 여 원하는 안개 수식을 선택 합니다.Choose the desired fog formula by setting the D3DRS_FOGVERTEXMODE render state to a member of the D3DFOGMODE enumerated type.
  4. 렌더링 상태에서 선택한 안개 수식에 필요에 따라 안개 매개 변수를 설정 합니다.Set the fog parameters as desired for the selected fog formula in the render states.

C + +로 작성 된 다음 예제에서는 이러한 단계가 코드에서 보이는 것 처럼 보일 수 있습니다.The following example, written in C++, shows what these steps might look like in code.

// 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 값만 허용 하더라도 일부 안개 매개 변수는 부동 소수점 값으로 필요 합니다.Some fog parameters are required as floating-point values, even though the IDirect3DDevice9::SetRenderState method only accepts DWORD values in the second parameter. 이 예제에서는 부동 소수점 변수의 주소를 DWORD 포인터로 캐스팅 한 다음이를 역참조 하 여 데이터 변환 없이 이러한 메서드에 부동 소수점 값을 성공적으로 제공 합니다.This example successfully provides the floating-point values to these methods without data translation by casting the addresses of the floating-point variables as DWORD pointers, and then dereferencing them.

안개 형식Fog Types