*Heightmap

- texture를 읽어와 texture의 크기 만큼 지형의 크기를 잡아주고

해당 픽셀의 음영값을 vertex의 높낮이로 정해준해준다.

 

*D3DCreateTextureFromFileEx()

- Heightmap texture를 LPDIRECT3DTEXTURE9 com객체에 메모리를 할당하여 texture 정보를 읽어온다.

 

*D3DSURFACE_DESC 구조체

- LPDIRECT3DTEXTURE9의 GetLevelDesc() 함수를 이용하여

D3DSURFACE_DESC구조체에 texture정보를 추출한다.

- texture의 width와 height는 2^n의 수로 변환되며

본래 texture의 크기가 2^n보다 클경우 log_2( size ) = k, 2^(k+1)로 변환한다.

 

*D3DLOCKED_RECT 구조체

- texture에 lock을 걸어 pixel정보에 접근할 수 있게 한다.

- .pBits : pixel정보를 가지고있는 포인터로 첫 주소를 가리킨다.

- .Pitch : 한 열의 길이

 

*의사 코드

LPDIRECT3DTEXTURE9 pTex = NULL;

 

D3DCreateTextureFromFileEx( pDevice, pszPath, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0

, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &pTex );

 

D3DSURFACE_DESC ddsd;

pTex->GetLevelDesc( 0, &ddsd );

POINT ptSize;

 

ptSize.x = ddsd.Width;

ptSize.y = ddsd.Height;

 

D3DLOCKED_RECT ddlr;

pTex->LockRect( 0, &ddlr, NULL, D3DLOCK_READONLY );

 

DWORD dwRowPixelSize = ddlr.Pitch / 4;

 

//반복문을 사용하여 픽셀의 포인터를 갱신한다.

for( int iZ = 0; iZ < ptSize.z; ++iZ )

{

for( int iX = 0; iX < ptSize.x; ++iX )

{

//해당 픽셀의 주소 계산

DWORD dwPixel = *( (LPDWORD)ddlr.pBits + iX + iZ * dwRowPixelSize );

 

//필요정보는 픽셀의 색상이 아니라 음영값이므로

//0x000000ff와 비트& 연산을 하여 한 byte값(blue value)을 구한다.

float fHeight = (float)( dwPixel & 0x000000ff );

}

}

 

pTex->UnlockRect( 0 );

 

pTex->Release();

 

'programming > direct3d' 카테고리의 다른 글

picking  (0) 2024.07.26
directx terrain 약 2주간 업데이트 사항  (0) 2024.07.26
dirextx xFile 띄우기  (0) 2024.07.26
directx 지형 알파 멀티텍스쳐의 복수 사용  (0) 2024.07.26
directx 지형 알파 텍스쳐 입히기  (0) 2024.07.26
Posted by mainep
: