DirectX Z缓冲区无法正常工作

时间:2011-06-16 19:27:53

标签: c++ directx buffer depth

我的问题集中在DirectX 9中的深度测试。我试图在游戏中的静态点渲染一个对象,而另一个对象可以根据DirectInput的输入进行更改。其中一个物体被抽出近500个单位。在第一次绘制场景时,两个对象正确渲染,但是一旦第二个对象的位置发生变化(同时移动摄像机),另一个对象将被绘制在较近的对象上,尽管已启用深度测试且正确接近并且远飞机的价值。这个问题让我仔细研究论坛(包括这一个)找到一个没有运气的答案。如果有人能提供帮助,我们将不胜感激。

编辑:

也许我有点不清楚。在对位置进行任何更改之前正确绘制对象,但可以随意更改摄像机方向,并且不会产生任何不良影响。更改位置后,对象将被错误地渲染。

更新

@ paul-jan:我会发布代码,但它分散在几个类中......深度缓冲区只是在D3DPRESENT_PARAMETERS中声明的D3DFMT_D16自动缓冲区。根据MSDN文档,它自动启用,写入启用,功能为D3DCMP_LESSEQUAL。此外,模型从X文件加载,它们在DirectX Viewer中显示正常。

@vines:有趣的假设。转换是不同的,但仅限于世界矩阵。我的直觉是它在视图矩阵中。我正在使用Frank D. Luna所着的使用DirectX 9.0c进行3D游戏编程的一书中描述的实现,我已经修改了以适应我的目的,即三轴旋转。但是,我可能搞砸了我的实现。

这是一些代码......

void BuildViewMatrix()
{    
    D3DXVec3Normalize(&f,&f);
    D3DXVec3Cross(&u,&f,&r);
    D3DXVec3Normalize(&u,&u);
    D3DXVec3Cross(&r,&u,&f);
    D3DXVec3Normalize(&r,&r);       
    w(0,0)=r.x;
    w(0,1)=r.y;
    w(0,2)=r.z;
    w(0,3)=p.x;
    w(1,0)=u.x;
    w(1,1)=u.y;
    w(1,2)=u.z;
    w(1,3)=p.y;
    w(2,0)=f.x;
    w(2,1)=f.y;
    w(2,2)=f.z;
    w(2,3)=p.z;
    w(3,0)=0.0f;
    w(3,1)=0.0f;
    w(3,2)=0.0f;
    w(3,3)=1.0f;
    D3DXMatrixInverse(&view,0,&w);
    w=l*w;
}

r =右矢量, u =向上矢量, f =前向矢量, P =位置, w =世界矩阵, l =局部空间偏移变换(我自己想在世界变换之前略微翻译事物)。

整个想法是基于第三人称星战斗士游戏的相机。摄像机和您的船作为一个对象“连接”(因此是局部空间变换),视图矩阵是船舶世界矩阵的倒数。不过,我不确定这是否是实现这一目标的最佳方式。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

猜测:

似乎两个对象的矩阵不同:您使用一个转换设置渲染第一个对象,然后更改它并渲染第二个对象。然后, visual 第二个对象被投影到预期的位置,但z坐标比例现在失真关于第一个对象的内容。因此,你“愚弄”Z缓冲区 - 你绘制正确的像素,但是将它们投射到比预期更接近的位置。