범프 매핑 사용(Direct3D 9)

범프 매핑에 대한 지원 검색

디바이스는 D3DTOP_BUMPENVMAP 또는 D3DTOP_BUMPENVMAPLUMINANCE 텍스처 혼합 작업을 지원하는 경우 범프 매핑을 수행할 수 있습니다. D3DUSAGE_QUERY_LEGACYBUMPMAP IDirect3D9::CheckDeviceFormat 을 사용하여 범프 매핑에 형식이 지원되는지 확인합니다.

또한 애플리케이션은 디바이스 기능을 검사 디바이스가 적절한 수의 혼합 단계(일반적으로 3개 이상)를 지원하고 하나 이상의 범프 매핑 픽셀 형식을 노출하도록 해야 합니다.

다음 코드 예제에서는 지정된 조건을 사용하여 디바이스 기능을 검사하여 현재 디바이스에서 범프 매핑에 대한 지원을 검색합니다.

BOOL SupportsBumpMapping()
{
    D3DCAPS9 d3dCaps;

    d3dDevice->GetDeviceCaps( &d3dCaps );

    // Does this device support the two bump mapping blend operations?
    if ( 0 == d3dCaps.TextureOpCaps & ( D3DTEXOPCAPS_BUMPENVMAP |
                                            D3DTEXOPCAPS_BUMPENVMAPLUMINANCE ))
        return FALSE;

    // Does this device support up to three blending stages?
    if( d3dCaps.MaxTextureBlendStages < 3 )
        return FALSE;

    return TRUE;
}

범프 맵 텍스처 만들기

다른 텍스처와 마찬가지로 범프 맵 텍스처를 만듭니다. 애플리케이션은 범프 매핑에 대한 지원을 확인하고 범프 매핑에 대한 지원 검색에서 설명한 대로 유효한 픽셀 형식을 검색합니다.

표면을 만든 후 표면 형식에 광도를 포함하는 경우 적절한 델타 값과 광도를 사용하여 각 픽셀을 로드할 수 있습니다. 각 픽셀 구성 요소의 값은 범프 맵 픽셀 형식(Direct3D 9)에 설명되어 있습니다.

범프 매핑 매개 변수 구성

애플리케이션이 범프 맵을 만들고 각 픽셀의 콘텐츠를 설정한 경우 범프 매핑 매개 변수를 구성하여 렌더링을 준비할 수 있습니다. 범프 매핑 매개 변수에는 필요한 텍스처 및 혼합 작업 설정뿐만 아니라 범프 맵 자체에 대한 변환 및 광도 컨트롤도 포함됩니다.

  1. 사용되는 경우 기본 텍스처 맵, 범프 맵 및 환경 맵 텍스처를 텍스처 혼합 단계로 설정합니다.
  2. 각 텍스처 단계에 대한 색 및 알파 혼합 작업을 설정합니다.
  3. 범프 맵 변환 매트릭스를 설정합니다.
  4. 필요에 따라 광도 배율 및 오프셋 값을 설정합니다.

다음 코드 예제에서는 세 개의 텍스처(기본 텍스처 맵, 범프 맵 및 반사 환경 맵)를 적절한 텍스처 혼합 단계로 설정합니다.

// Set the three textures.
d3dDevice->SetTexture( 0, d3dBaseTexture );
d3dDevice->SetTexture( 1, d3dBumpMap );
d3dDevice->SetTexture( 2, d3dEnvMap );

텍스처를 혼합 단계로 설정한 후 다음 코드 예제에서는 각 스테이지에 대한 혼합 작업 및 인수를 준비합니다.

// Set the color operations and arguments to prepare for
//   bump mapping.

// Stage 0: The base texture
d3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
d3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
d3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
d3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); 
d3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 1 );

// Stage 1: The bump map - Use luminance for this example.
d3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
d3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_BUMPENVMAPLUMINANCE);
d3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );

// Stage 2: A specular environment map
d3dDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 0 );
d3dDevice->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_ADD );
d3dDevice->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3dDevice->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );

혼합 작업 및 인수가 설정되면 다음 코드 예제에서는 D3DTEXTURESTAGESTATETYPE 의 D3DTSS_BUMPENVMAPMAT00 및 D3DTSS_BUMPENVMAPMAT11 멤버를 1.0으로 설정하여 2x2 범프 매핑 매트릭스를 ID 행렬로 설정합니다. 행렬을 ID로 설정하면 시스템에서 범프 맵의 델타 값을 수정되지 않은 상태로 사용하게 되지만 이는 요구 사항이 아닙니다.

// Set the bump mapping matrix.
//
// Note  These calls rely on the following inline shortcut function:
//   inline DWORD F2DW( FLOAT f ) { return *((DWORD*)&f); }
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT00, F2DW(1.0f) );
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT01, F2DW(0.0f) );
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT10, F2DW(0.0f) );
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT11, F2DW(1.0f) );

D3DTOP_BUMPENVMAPLUMINANCE(광도)를 포함하도록 범프 매핑 작업을 설정하는 경우 광도 컨트롤을 설정해야 합니다. 광도 컨트롤은 다음 단계에서 텍스처에서 색을 변조하기 전에 시스템에서 광도를 계산하는 방법을 구성합니다. 자세한 내용은 범프 매핑 수식(Direct3D 9)을 참조하세요.

// Set luminance controls. This is only needed when using
// a bump map that contains luminance, and when the 
// D3DTOP_BUMPENVMAPLUMINANCE texture blending operation is
// being used.
//
// Note  These calls rely on the following inline shortcut function:
//   inline DWORD F2DW( FLOAT f ) { return *((DWORD*)&f); }
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVLSCALE, F2DW(0.5f) );
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVLOFFSET, F2DW(0.0f) );

애플리케이션이 범프 매핑 매개 변수를 구성한 후에는 정상적으로 렌더링될 수 있으며 렌더링된 다각형은 범프 매핑 효과를 받습니다.

앞의 예제에서는 반사 환경 매핑에 대해 설정된 매개 변수를 보여 줍니다. 확산 광원 매핑을 수행할 때 애플리케이션은 마지막 단계에 대한 텍스처 혼합 작업을 D3DTOP_MODULATE 설정합니다. 자세한 내용은 확산 조명 맵(Direct3D 9)을 참조하세요.

범프 매핑