[转]DirectX9获取深度缓存值
http://www.cppblog.com/xiaowugui/archive/2010/01/06/104962.html
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 );
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构