c++ - DirectX Z 缓冲区无法正常工作

标签 c++ directx buffer depth

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

编辑:

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

更新:

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

@vines:有趣的假设。变换是不同的,但仅在世界矩阵中。我的直觉是它在 View 矩阵中。我正在研究 Frank D. Luna 在 Introduction to 3D Game Programming with DirectX 9.0c 一书中描述的实现,我已对其进行修改以满足我的目的,即三轴旋转。但是,我可能搞砸了我的实现。

这是一些代码...

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=右 vector , u=向上 vector , f=前向 vector , p=位置, w=世界矩阵, l=Local Space Offset Transformation(我自己的想法,在世界变换之前稍微平移一些东西)。

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

有什么想法吗?

最佳答案

一个猜测:

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

关于c++ - DirectX Z 缓冲区无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6377434/

相关文章:

即使在缓冲区完全填满之前,C 中已满缓冲的输出流是否可以自动刷新?

tcp - 在 Windows 下的非阻塞 TCP 套接字上使用 SO_SNDBUF 的奇怪行为

c++ - 返回类型推导是否可能?

c++ - DirectX ID3DXEFFECT::BeginPass()/EndPass() 问题

audio - 媒体基金会 IMFMediaSource::CreatePresentationDescriptor 调用永无止境

hyperlink - DirectX 11 链接错误 : fatal error LNK1104: cannot open file 'Effects11d.lib'

c++ - 如何判断一个多边形是凹的还是凸的?

python - 我如何在 Python 中使用 ITK 类

c++ - Mac OSX 和 Unix 快速问题

java - glReadPixels 返回的数据比预期多