DirectX Z缓冲区工作不正常

DirectX Z buffer not working correctly

本文关键字:不正常 工作 缓冲区 DirectX      更新时间:2023-10-16

我的问题集中在DirectX 9中的深度测试上。我试图在游戏中的静态点渲染一个对象,在可以根据DirectInput的输入更改的点渲染另一个对象。其中一个物体被绘制在大约500个单位之外。在第一次绘制场景时,两个对象会正确渲染,但一旦第二个对象的位置发生变化(同时移动相机),就会在更近的对象上绘制另一个对象,尽管启用了深度测试并校正了近平面和远平面值。这个问题让我仔细研究了论坛(包括这个论坛),却没有找到答案。如果有人能帮忙,我们将不胜感激。

编辑:

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

更新:

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

@葡萄藤:有趣的假设。变换是不同的,但只是在世界矩阵中。我的直觉是它在视图矩阵中。我正在完成Frank D.Luna的《DirectX9.0c3D游戏编程导论》一书中描述的一个实现,我对该实现进行了修改以适应我的目的,即三轴旋转。然而,我可能把它的实现搞砸了

这是一些代码。。。

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=局部空间偏移变换(我自己的想法是在世界变换之前稍微翻译一下)。

整个想法是基于第三人称明星战斗机战斗游戏的摄像头。相机和你的船是";加入";作为一个对象(因此是局部空间变换),并且视图矩阵是船舶的世界矩阵的逆矩阵。不过,我不确定这是否是实现这一点的最佳方式。

有什么想法吗?

猜测:

这两个对象的矩阵似乎不同:用一个变换设置渲染第一个对象,然后更改它并渲染第二个对象。然后,在视觉上第二个对象被投影到预期的位置,但z坐标比例现在相对于第一个对象被扭曲了。因此,你"愚弄"了Z缓冲区——你画了正确的像素,但把它们投影得比预期的更近。