【发布时间】:2015-06-03 21:14:21
【问题描述】:
到目前为止,我得到了一个没有任何变换的立方体渲染(因此它是在正交透视图中渲染的),并且我正在处理之前的代码以将其转换为透视图,其中涉及所有矩阵。我更改了灵活顶点格式以便没有 RHW(因此只有 XYZ 坐标和颜色,尝试了 ARGB 和 XRGB,但我认为这并不重要),我添加了一个设置所有矩阵的函数。
调试
表明矩阵创建正确,函数返回正确(据我所见),没有崩溃(如果出现问题,DirectX 永远不会抱怨,它只是不渲染),一般来说,逐步调试显示没有超自然活动。
现有项目(我修改并最终阻止其工作):
随着我的进步,我还编写了各种教程,这样我就可以回去看看我上次做了什么来让它工作,这次我保留了版本,所以你可以得到代码 here 以及 VS2010 解决方案,所有 DirectX 工作都在 3Dheader.h 和 D3DLoader.h 中完成
变化:
- 自定义顶点格式 FVF_CUSTOMVERTEX 已更改为不包含 RHW,据我所知,必须将其删除以便通过转换进行计算
- 在Render() 中,我添加了对函数setMatrices() 的调用,该函数执行所有矩阵和变换工作,如下所示:
void setMatrices()
{
//--------------transformation code----------------//
D3DXMATRIX objectM, translationM, rotationM, projectionM, lookAtM, finalM;
HRESULT hr;
D3DXMatrixIdentity(&objectM);
D3DXMatrixRotationY(&rotationM, D3DX_PI/4);
//D3DXMatrixMultiply(&finalM, &objectM, &rotationM);
D3DXMatrixPerspectiveFovLH(&projectionM,D3DX_PI/4,(float)yRes/xRes, 1, 100);
D3DXVECTOR3 camera;
camera.x = -10;
camera.y = 0;
camera.z = 0;
D3DXVECTOR3 cameraTarget;
cameraTarget.x = 0;
cameraTarget.y = 0;
cameraTarget.z = 0;
D3DXVECTOR3 cameraUp;
cameraUp.x = 0;
cameraUp.y = 1;
cameraUp.z = 0;
D3DXMatrixLookAtLH(&lookAtM,&camera,&cameraTarget, &cameraUp);
hr = pd3dDevice->SetTransform(D3DTS_WORLD, &objectM);
hr = pd3dDevice->SetTransform(D3DTS_PROJECTION, &projectionM);
hr = pd3dDevice->SetTransform(D3DTS_VIEW, &lookAtM);
D3DVIEWPORT9 view_port;
view_port.X=0;
view_port.Y=0;
view_port.Width=xRes;
view_port.Height=yRes;
view_port.MinZ=0.0f;
view_port.MaxZ=1.0f;
pd3dDevice->SetViewport(&view_port);
}
当然请注意,有些元素可能不需要,放在那里以防万一,这是我目前拥有的代码,因此我们有一个共同的参考。
提前感谢您的任何回答和/或尝试回答。
【问题讨论】:
-
获取 PIX 捕获。通常会很清楚出了什么问题。尤其是网格选项卡。
-
您是否也更改了立方体中顶点的位置和大小?世界空间坐标的比例与转换后的屏幕空间坐标不同。
-
@MuertoExcobito 甚至不知道 PIX 的存在,哇!好的,“详细信息”面板中的“网格”选项卡似乎是唯一一个我可以从当前读数中获取信息的选项,当我选择了
DrawIndexedPrimitives时,在顶点着色器前视图中我有一个线框渲染,在 VS 后绝对没有,并且视口有两条水平线,我想它们只是窗口边框。 -
@RossRidge,是的,角落的坐标是 1 和 -1 的组合,取自大量书籍和教程,在进入 3D 之前,它们是 200 和 400 的组合,所以我相信我做对了
-
将所有矩阵设置为单位矩阵使网格进入视口,但渲染始终为空......我也尝试设置材质但没有区别。此外,一旦离开
DrawIndexedPrimitives,网格就会再次消失。
标签: c++ 3d directx direct3d directx-9