1

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

编辑:

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

更新:

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

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

整个想法是基于第三人称星际战斗机格斗游戏的相机。相机和您的船作为一个对象“连接”在一起(因此是局部空间变换),并且视图矩阵是船的世界矩阵的逆矩阵。不过,我不确定这是否是实现它的最佳方式。

有任何想法吗?

4

1 回答 1

0

一个推测:

似乎两个对象的矩阵不同:您使用一个转换设置渲染第一个对象,然后更改它并渲染第二个对象。然后,视觉上的第二个对象被投影到预期的位置,但是 z 坐标比例现在相对于第一个对象使用的内容发生了扭曲。因此,您“愚弄”了 Z 缓冲区——您绘制了正确的像素,但将它们投影得比预期的更近。

于 2011-06-16T19:34:34.540 回答