DirectX中,如何獲取深度值,然后將它存儲在一個txt文件中?其實只要修改兩個地方:
第一個地方是:創建Direct3D設備時,將D3DPRESENT_PARAMETERS類型表示變量的AutoDepthStencilFormat設置為D3DFMT_D32F_LOCKABLE,代碼如下:
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = width;
d3dpp.BackBufferHeight = height;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = windowed;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D32F_LOCKABLE; // 16位總不行
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
第二個地方是:設置鎖定緩存表面,并進行讀寫的代碼:
// 獲取深度模板表面
HRESULT hr = Device->GetDepthStencilSurface( &pZBuffer );

if ( FAILED( hr ) )
{
MessageBox( NULL, "GetDepthStencilSurface failure", 0, 0 );
}
// 打開文件
pFile = fopen( "ZBuffer.txt", "w" );

if ( pFile == NULL )
{
MessageBox( NULL, "shit", NULL, NULL);
}
// 獲取表面特性
D3DSURFACE_DESC surfaceDesc;
pZBuffer->GetDesc( &surfaceDesc );

// 鎖定表面
D3DLOCKED_RECT lockRect;
hr = pZBuffer->LockRect( &lockRect, NULL, D3DLOCK_READONLY );

if ( FAILED( hr ) )
{
MessageBox( NULL, "GetDepthStencilSurface", 0, 0 );
}
// 獲取指向表面區域指針
float* pData = (float*)lockRect.pBits;

// 將深度信息輸出到文件中

for (int y = 0; y < surfaceDesc.Height; ++y )
{

for (int x = 0; x < surfaceDesc.Width; ++x )
{
int index = y * lockRect.Pitch / 4 + x;
fprintf( pFile, "%f ", pData[index] );
}
fprintf( pFile,"\n");
}
// 解鎖表面鎖定
pZBuffer->UnlockRect();
// 釋放接口和文件
pZBuffer->Release();
fclose( pFile );