Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ DirectX Z缓冲区工作不正常_C++_Directx_Buffer_Depth - Fatal编程技术网

C++ DirectX Z缓冲区工作不正常

C++ DirectX Z缓冲区工作不正常,c++,directx,buffer,depth,C++,Directx,Buffer,Depth,我的问题集中在DirectX 9中的深度测试上。我试图在游戏中的静态点渲染一个对象,在可以根据DirectInput的输入进行更改的点渲染另一个对象。其中一个对象的绘制距离几乎为500个单位。第一次绘制场景时,两个对象将正确渲染,但一旦第二个对象的位置发生变化(同时移动摄影机),则会在较近的对象上绘制另一个对象,尽管启用了深度测试并更正了近平面和远平面值。这个问题让我在论坛(包括这一个)上苦苦思索,想找到一个答案,但运气不好。如果有人能帮忙,我将不胜感激 编辑: 也许我有点不清楚。在对位置进行任

我的问题集中在DirectX 9中的深度测试上。我试图在游戏中的静态点渲染一个对象,在可以根据DirectInput的输入进行更改的点渲染另一个对象。其中一个对象的绘制距离几乎为500个单位。第一次绘制场景时,两个对象将正确渲染,但一旦第二个对象的位置发生变化(同时移动摄影机),则会在较近的对象上绘制另一个对象,尽管启用了深度测试并更正了近平面和远平面值。这个问题让我在论坛(包括这一个)上苦苦思索,想找到一个答案,但运气不好。如果有人能帮忙,我将不胜感激

编辑:

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

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

@藤蔓:有趣的假说。变换是不同的,但仅在世界矩阵中。我的直觉是它在视图矩阵中。我正在使用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=局部空间偏移变换(我自己的想法是在世界变换之前稍微转换一些东西)

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

有什么想法吗?

猜测:


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

发布一些代码,特别是启用深度测试、初始化zbuffer和为顶点设置Z值的位。我们应该能够就您的z缓冲区是否设置不正确,或者您是否由于错误的摄像头实现而误解了正在发生的情况向您提供建议。请使用提供的来构建矩阵。D3DX还提供了一个构建投影矩阵的函数。我正在使用D3DX函数创建投影矩阵。我没有使用D3DXMatrixLookAtLH函数的一个原因是因为我认为没有办法指定滚动角度。然而,现在我看了一下,我想我可以通过创建一个旋转矩阵来解决它,旋转角度,平移世界上方向向量,然后使用它作为“世界”上方向向量。我会测试一下,看看能得到什么