DirectX深度检测问题

qq_35578084 2016-10-22 04:27:41
我做了一个程序,但在深度检测时出现了问题
只要开深度检测,旋转矩阵就会导致图形显示不全,
不开则没有这个问题
不开深度检测图片:

开深度检测图片

以下是初始化代码
BOOL Init(HWND hWnd)
{
IDirect3D9 *_pd3d9;
_pd3d9 = Direct3DCreate9(D3D_SDK_VERSION);

D3DCAPS9 caps;
if (FAILED(_pd3d9->GetDeviceCaps(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
&caps
)))
{
MessageBox(hWnd, L"获取硬件信息失败", L"错误", MB_OK | MB_ICONERROR);
return FALSE;
}
int vp = 0;
if (caps.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferHeight = 600;
d3dpp.BackBufferWidth = 800;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.Windowed = TRUE;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = NULL;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

if (FAILED(_pd3d9->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
vp,
&d3dpp,
&PDevice
)))
{
MessageBox(hWnd, L"创建接口失败", NULL, MB_OK | MB_ICONERROR);
return FALSE;
}
if (FAILED(D3DXCreateFont(PDevice, 36, 0, 0, 1, false, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, _T("微软雅黑"), &PFont)))
{
MessageBox(hWnd, L"创建字体失败", NULL, MB_OK | MB_ICONERROR);
return FALSE;
}

srand(timeGetTime());

if (FAILED(D3DXCreateBox(PDevice,
2,
3,
3,
&Box,
NULL)))
{
MessageBox(hWnd, L"创建盒子失败", NULL, MB_OK | MB_ICONERROR);
return FALSE;
}
if (FAILED(D3DXCreateTeapot(PDevice,
&Teapot,
NULL)))
{
MessageBox(hWnd, L"创建茶壶失败", NULL, MB_OK | MB_ICONERROR);
return FALSE;
}
D3DMATERIAL9 mtrl;
::ZeroMemory(&mtrl, sizeof(mtrl));
mtrl.Ambient = D3DXCOLOR(0.5f, 0.5f, 0.7f, 1.0f);
mtrl.Diffuse = D3DXCOLOR(0.6f, 0.6f, 0.6f, 1.0f);
mtrl.Specular = D3DXCOLOR(0.3f, 0.3f, 0.3f, 0.3f);
mtrl.Emissive = D3DXCOLOR(0.3f, 0.0f, 0.1f, 1.0f);
PDevice->SetMaterial(&mtrl);

LightSet(PDevice, 1);
PDevice->SetRenderState(D3DRS_LIGHTING, true);
PDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true);
PDevice->SetRenderState(D3DRS_SPECULARENABLE, true);


PDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); //开启背面消隐
PDevice->SetRenderState(D3DRS_ZENABLE, FALSE); //关闭深度检测
return TRUE;
}

以下是绘图代码
VOID Draw(FLOAT t,HWND hWnd)
{
PDevice->Clear(0,
NULL,
D3DCLEAR_TARGET,
D3DCOLOR_XRGB(0, 0, 0),
1.0f,
0);
PDevice->BeginScene();
// TODO:在此添加绘图代码
D3DVIEWPORT9 vp; //实例化一个D3DVIEWPORT9结构体,然后做填空题给各个参数赋值就可以了
vp.X = 0; //表示视口相对于窗口的X坐标
vp.Y = 0; //视口相对对窗口的Y坐标
vp.Width = 800; //视口的宽度
vp.Height = 600; //视口的高度
vp.MinZ = 0.0f; //视口在深度缓存中的最小深度值
vp.MaxZ = 1.0f; //视口在深度缓存中的最大深度值
SetMat(TRUE,
0, 0, 0,
0, 10, 0,
0, 0, 0,
TRUE,
&D3DXVECTOR3(0.0f, 0.0f, -10.0f),
&D3DXVECTOR3(0.0f, 0.0f, 0.0f),
&D3DXVECTOR3(0.0f, 1.0f, 0.0f),
TRUE,
D3DX_PI / 4.0f,
1.0f,
1.0f,
1000.0f,
TRUE,
&vp);

if (GetAsyncKeyState(0x31) & 0x8000)
PDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
if (GetAsyncKeyState(0x32) & 0x8000)
PDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);



if (::GetAsyncKeyState(0x51) & 0x8000)
LightSet(PDevice, 1);
if (::GetAsyncKeyState(0x57) & 0x8000)
LightSet(PDevice, 2);
if (::GetAsyncKeyState(0x45) & 0x8000)
LightSet(PDevice, 3);

static FLOAT rz = 0;
static FLOAT ry = 0;
if (GetAsyncKeyState(VK_UP) & 0X8000)
{
rz+=0.001f;
}
if (GetAsyncKeyState(VK_DOWN) & 0X8000)
{
rz-=0.001f;
}
if (GetAsyncKeyState(VK_LEFT) & 0X8000)
{
ry+=0.001f;
}
if (GetAsyncKeyState(VK_RIGHT) & 0X8000)
{
ry-=0.001f;
}
D3DXMATRIX R1;
D3DXMATRIX R2;
D3DXMatrixRotationZ(&R1, rz);
D3DXMatrixRotationY(&R2, ry);
D3DXMATRIX world[2];

D3DXMatrixTranslation(&world[0], 3.0f, -3.0f, 0.0f);
world[0] = world[0] * R1*R2;
PDevice->SetTransform(D3DTS_WORLD,&world[0]);
Box->DrawSubset(0);
D3DXMatrixTranslation(&world[1], -3.0f, -3.0f, 0.0f);
world[1] = world[1] * R1*R2;
PDevice->SetTransform(D3DTS_WORLD, &world[1]);
Teapot->DrawSubset(0);
GetFPSAndDraw(hWnd);

PDevice->EndScene();
PDevice->Present(0, 0, 0, 0);
}

望各位大神帮我解决。
...全文
673 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧