DirectX Z缓冲区工作不正常
DirectX Z buffer not working correctly
我的问题集中在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缓冲区——你画了正确的像素,但把它们投影得比预期的更近。
- 不确定要在我的main中放入什么才能使我的代码正常工作
- C++中的memset函数工作不正常
- 为什么 HeapFree() 不能正常工作?
- 如果不在窗口 10 中声明名为 openCV 的 openCV namedWindow,QT 图像显示将无法正常工作
- 通用线程池类工作不正常
- 循环仅对第一行正常工作.其他行不受 for 的影响
- 为什么在C++中使用关系运算符创建的模板函数不能对字符串正常工作?
- C++自定义删除运算符不能正常工作?
- 为什么使用 exec() 重新启动程序不能正常工作?
- C++:返回本地对象,但不能正常工作
- 名为DLL的C++windows服务程序工作不正常
- C++-循环中的If语句工作不正常
- 为什么带lcov的codecov在Travis上不能正常工作,而在我当地的Linux Mint上却不能正常工作
- While循环和if/else语句工作不正常
- 为什么sizeof函数在这里不能正常工作
- 异步操作的 Asio 处理程序在其同步对应项正常工作时不会调用
- C++:最大数组值函数工作不正常
- 图像上的按钮不正常工作在QT
- 透明SDL2游戏(WIN32色键不正常工作)
- Qt 5.3 QSystemTrayIcon不正常工作[Linux]