【问题标题】:DirectX 9 not rendering after adding transforms添加转换后 DirectX 9 不渲染
【发布时间】: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


【解决方案1】:

在您的代码(下载)中,xResyRes 是整数。由于整数除法,yRes/xRes 将为零,因为 xRes > yRes。您将其作为纵横比传递给 D3DXMatrixPerspextiveFovLH 函数,这将产生无效的矩阵。相反,先将它们转换为浮点数,然后再进行除法,然后将结果传入。

【讨论】:

  • 好的:我在某个时候纠正了这个问题,但看起来我在某个时候恢复了,所以我非常高兴你指出了这一点。在 PIX 中,网格位于视口内。此外,所有值看起来都非常正确。坏处:我在 Render 上没有得到任何东西(当然,我在应用程序中也看不到任何东西)。在进一步打扰您之前,我会再进行一次非常彻底的检查,看看是否能发现任何问题。
  • 顺便说一句,它是否适合您?虽然不太可能,但我可能已经调整了其他东西,如果它为你运行,那么它可能已经解决了。
  • 我没有尝试运行它。如果您有其他问题,请发布另一个问题。当问题问题尽可能少时,SO 效果更好。
  • 我今天会再调试一些,看看是否可行。正如问题中所说,问题仍然存在,它不是渲染 - 尽管毫无疑问已经取得了进展,并感谢您。我问了,所以我知道只是重写代码是否可以让它运行,但无论如何我都会这样做。
  • 我按照整个问题的描述重写了它,它工作了,看起来我插手了别的东西,谢谢你的帮助。
猜你喜欢
  • 2022-06-27
  • 2013-01-18
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多