【问题标题】:DirectX 9 projection matrix infinite element?DirectX 9投影矩阵无限元?
【发布时间】:2015-06-02 19:45:32
【问题描述】:

我一直在努力在 DirectX 9 中进行转换,在调试过程中,我终于在调用时发现了一个问题

D3DXMatrixPerspectiveFovLH(&projection, D3DX_PI/4, yRes/xRes, 1, 100);

投影的第一个元素 (_11) 是#INF,我很确定它不应该是。这是在声明此矩阵之后,直接在将其分配给 DirectX 的投影变换之前。

背景:我使用了 RHW 设置为 1 的自定义向量,所以我得到了我应该得到的正交视图,我也让索引缓冲区工作。此后发生的变化是添加了矩阵,如Drunken HyenaDirectXTutorial.com 所示,但不是我看不到任何模型。我尝试将相机放在另一侧(因为渲染了每个三角形的一个面)并将其移出,以及放大模式(就像我在 XNA 中的问题一样),但我仍然只看到背景图像或我清除屏幕的颜色。

添加代码:

void setTransforms()
{
    D3DXMATRIX final;
    D3DXMATRIX translate;
    D3DXMATRIX rotate;
    D3DXMATRIX scale;

    D3DXMatrixIdentity(&final);
    D3DXMatrixTranslation(&translate, 0, 0, 1);

    static float f = 0;
    D3DXMatrixRotationY(&rotate,f++/1000);

    D3DXMatrixScaling(&scale, 100.0f, 100.0f, 100.0f);

    D3DXMatrixMultiply(&final, &final, &scale);
    D3DXMatrixMultiply(&final, &final, &rotate);
    D3DXMatrixMultiply(&final, &final, &translate);

    pd3dDevice->SetTransform(D3DTS_WORLD, &final);

    //---- Projection

    D3DXMATRIX projection;
    D3DXMatrixPerspectiveFovLH(&projection, D3DX_PI/4, yRes/xRes, 1, 100);

    pd3dDevice->SetTransform(D3DTS_PROJECTION, &projection);

    //~~~~ Projection
    //---- Camera / viewport

    D3DXMATRIX camera;
    D3DXVECTOR3 camPos(-10,0,0);
    D3DXVECTOR3 camTarget(0,0,0);
    D3DXVECTOR3 camUp(0,1,0);
    D3DXMatrixLookAtLH(&camera, &camPos, &camTarget, &camUp);

    pd3dDevice->SetTransform(D3DTS_VIEW, &camera);

    //~~~~ Camera

    pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
}

并且在我进行渲染之前调用了这个函数(我在 begin() 之前和之后的各个阶段都尝试过)。与之前的工作代码相比,唯一的变化是删除了 RHW,其他一切都是正确的,包括缓冲区大小。

欢迎任何帮助或想法,在此先感谢!

【问题讨论】:

  • yResxRes 是否声明为 int
  • 只是添加到前面的评论,如果两个变量都是inty/x 可能是0。顺便说一句,纵横比是width by height,而不是相反。
  • 是的,yRes 和 xRes 确实是整数,将它们转换为无限元素!我怀疑我会想到它,非常感谢!虽然仍然没有呈现任何内容,但调试仍在继续.. 既然您回答了标题的问题,您可能想发布 is 作为答案,以便我可以标记它?
  • 我会将其发布为答案。谢谢。顺便说一句,您可能需要检查您的划分,以确保您将宽度除以高度,而不是相反。
  • 也更正了那个,但在我不幸画出一些东西之前不会有太大影响

标签: c++ graphics 3d directx-9


【解决方案1】:

yResxRes 是否声明为 int? 如果是这种情况,则y/x 可能是0。尝试将其中一个变量转换为 float

此外,我注意到您正在使用yRes/xRes 计算纵横比。

如果您使用yRes 表示高度,使用xRes 表示宽度,则必须将分割更改为xRes/(double)yRes

D3DXMatrixPerspectiveFovLH 期望的纵横比是width by height,而不是相反。

【讨论】:

  • 这就是导致矩阵无穷大的原因,谢谢
猜你喜欢
  • 2013-08-22
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 2015-11-01
  • 2013-08-03
  • 1970-01-01
相关资源
最近更新 更多