높이맵 ( Heightmap )
programming/direct3d 2024. 7. 26. 10:26 |
*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 |