请问为什么 D3D 渲染 X 模型的遮挡顺序不正确

akima 2017-07-25 08:48:08
楼主我用的 Direct3D 9,加载并渲染一个 X 模型,可是发现渲染后多边形的遮挡顺序不正确,不知道是不是哪里有问题,请各位前辈指点一下。
下面是在 3DS 建模软件中的效果,可以看出遮挡顺序是正常的:

然后下面是我用代码加载并显示后的效果,可以看出遮挡顺序明显不正确:

下面是代码节选,只放出 D3D 相关的代码,其它代码应该不会有问题:

// 创建 D3D 设备的参数:

D3DPP.BackBufferCount = 1;
D3DPP.BackBufferFormat = D3DFMT_A8R8G8B8;
D3DPP.BackBufferWidth = uWidth;
D3DPP.BackBufferHeight = uHeight;
D3DPP.hDeviceWindow = hWnd;
D3DPP.Windowed = (bFullscreen ? FALSE : TRUE);
D3DPP.PresentationInterval = (bVSync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE);
D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD;
D3DPP.EnableAutoDepthStencil = TRUE;
D3DPP.AutoDepthStencilFormat = D3DFMT_D24S8;
D3DPP.MultiSampleType = MultiSampleType;
D3DPP.MultiSampleQuality = uMultiSampleQuality;

// D3D 设备的渲染状态相关设置:

SetRenderState(D3DRS_LIGHTING, TRUE);
SetRenderState(D3DRS_SPECULARENABLE, TRUE);
SetRenderState(D3DRS_NORMALIZENORMALS, TRUE);

SetRenderState(D3DRS_ZENABLE, TRUE);
SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS);
SetRenderState(D3DRS_ZWRITEENABLE, TRUE);

SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

// 清除屏幕缓存相关代码:

if (SUCCEEDED(m_pD3DDevice9->Clear(
0,
NULL,
D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
ClearColor,
1.0f,
0)))
{
bRet = true;
}


...全文
1271 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
akima 2017-07-26
  • 打赏
  • 举报
回复
搞定了,搞定了,原来是自己封装的函数,在内部实现的时候,将错误的参数传递给了 D3D 函数,导致绘制异常的,把参数传递错误的问题纠正过来就可以了,和参数自身的值没有关系,看来还是太粗心大意了,大家要引以为戒啊;

akima 2017-07-26
  • 打赏
  • 举报
回复
引用 1 楼 WJN92 的回复:
这个角度看上去觉得是你的投影矩阵没设对吧
朋友,你帮忙看看,我在 2 楼补充了一点代码,帮忙看看参数对不对,函数是自己封装过的,但是参数含义是一样的,谢谢了啊
akima 2017-07-26
  • 打赏
  • 举报
回复

// 设置 D3D 透视投影与摄像机相关参数
	CGraphDevice::Get()->SetViewTransform(
		// Eye
		0, 0, -10,
		// Target
		0, 0, 0,
		// Up
		0, 1, 0);
	CGraphDevice::Get()->SetPerspectiveTransform(
		// FOV
		3.141592627f * 0.5f,
		// Acspect
		SCREEN_WIDTH,
		SCREEN_HEIGHT,
		// Near Far
		20,
		0);
// 启用一个平行光源
	CGraphDevice::Get()->SetDirectionLightParam(0, 1.0, -1.0, 1.0, 0xFFFFFFFF);
	CGraphDevice::Get()->EnableLight(0, true);
WJN92 2017-07-26
  • 打赏
  • 举报
回复
这个角度看上去觉得是你的投影矩阵没设对吧

456

社区成员

发帖
与我相关
我的任务
社区描述
其它游戏引擎
社区管理员
  • 其它游戏引擎社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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