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)의 제어등을 설정한다.
다음 코드에서는, 베이스 텍스처 맵, 범프 맵, 및 스펙큐러 환경 맵의 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 로 설정한다. 더 자세한 정보는, 「디퓨즈 라이트 맵」을 참조할것.