DirectX Graphics 프로그래밍 가이드 고도의 주제 픽셀 파이프라인 범프 맵핑 범프 맵핑의 사용법   [목차열람] [주소복사] [슬롯비우기]
범프 맵핑의 사용법
 
Microsoft DirectX 9.0

범프 맵핑의 사용법


범프 맵핑의 지원의 검출

장치가 D3DTOP_BUMPENVMAP 또는 D3DTOP_BUMPENVMAPLUMINANCE 의 몇개의 텍스처 혼합 처리를 지원 하고 있는 경우, 그 장치에서는 범프 맵핑을 실행할 수 있다. 포맷이 범프 맵핑으로 지원 되고 있는지를 확인하려면,IDirect3D9::CheckDeviceFormat 를 D3DUSAGE_QUERY_LEGACYBUMPMAP 와 함께 사용한다.

또, 애플리케이션에서는 장치 능력을 조사하는 것으로, 그 애플리케이션으로 적절한 혼합 스테이지수 (보통은 3 개 이상)가 지원 되어 적어도 1 개의 범프 맵핑 픽셀 포맷이 공개되고 있는 것을 확인할 필요가 있다.

다음 코드는, 지정된 조건에 의해 장치 능력을 조사해, 현재의 장치에서의 범프 맵핑의 지원을 검출한다.

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

범프 맵 텍스처의 생성

다른 텍스처의 경우와 같게, 범프 맵 텍스처를 생성 한다. 「범프 맵핑의 지원의 검출」로 설명한 것처럼, 애플리케이션으로 범프 맵핑의 지원을 확인해, 유효한 픽셀 포맷을 얻어온다.

표면의 생성 후는, 적절한 델타값을 가지는 각 픽셀과 휘도(Luminance) (표면 포맷에 휘도(Luminance)가 포함되는 경우)를 로드할 수 있다. 각 픽셀 구성 요소의 값에 대해서는, 「범프 맵 픽셀 포맷」으로 설명한다.

범프 맵핑 파라미터의 설정

애플리케이션으로 범프 맵의 생성과 각 픽셀의 내용의 설정이 완료하면 범프 맵핑 파라미터를 설정해 렌더링의 준비를 실시할 수가 있다. 범프 맵핑 파라미터에는, 필요한 텍스처와 그 혼합 처리나, 범프 맵 자체에 대한 변환과 휘도(Luminance)의 제어등을 설정한다.

  1. 베이스 텍스처 맵 (사용되고 있는 경우), 범프 맵, 및 환경 맵 텍스처를 텍스처 혼합 스테이지로 설정한다.
  2. 각 텍스처 스테이지의 색 및 알파 혼합 처리를 설정한다.
  3. 범프 맵 변환 행렬을 설정한다.
  4. 필요에 따라서, 휘도(Luminance) 스케일값 및 오프셋(offset)값을 설정한다.

다음 코드에서는, 베이스 텍스처 맵, 범프 맵, 및 스펙큐러 환경 맵의 3 개의 텍스처를, 적절한 텍스처 혼합 스테이지로 설정한다.

// 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_BUMPENVMAT00 및 D3DTSS_BUMPENVMAT11 멤버를 1.0 으로 설정해, 2 × 2 범프 맵핑 행렬을 단위행렬로 설정한다. 행렬을 단위행렬로 설정 하면, 시스템에서는 미수정의 범프 맵의 델타값이 사용되게 되지만, 이것은 반드시 필요하지 않다.

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

범프 맵핑 처리에 휘도(Luminance) (D3DTOP_BUMPENVMAPLUMINANCE)를 포함하는 경우는, 휘도(Luminance) 제어를 설정할 필요가 있다. 휘도(Luminance) 제어에 의해, 다음의 스테이지의 텍스처로부터 색을 조정하기 전에 시스템이 실시하는 휘도(Luminance)의 계산방법을 설정한다. 더 자세한 정보는, 「범프 맵핑의 공식」을 참조할것.

// 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 로 설정한다. 더 자세한 정보는, 「디퓨즈 라이트 맵」을 참조할것.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP