DirectX 9投影矩阵无限元?
DirectX 9 projection matrix infinite element?
我一直在努力在 DirectX 9 中进行转换,在调试过程中我终于注意到一个问题,当调用
D3DXMatrixPerspectiveFovLH(&projection, D3DX_PI/4, yRes/xRes, 1, 100);
投影的第一个元素 (_11) 是#INF,我很确定它不应该是。这是在声明此矩阵之后直接在将其分配给 DirectX 的投影变换之前。
背景:我使用了 RHW 设置为 1 的自定义矢量,所以我得到了我应该看到的正交视图,我还得到了索引缓冲区。从那以后发生的变化是添加了矩阵,如 Drunken Hyena and DirectXTutorial.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,其他所有内容都是正确的,包括缓冲区大小。
欢迎任何帮助或想法,在此先感谢!
yRes
和 xRes
是否声明为 int
?
如果是这样的话,除法 y/x
可能是 0
。尝试将其中一个变量转换为 float
.
此外,我注意到您正在使用 yRes/xRes
计算纵横比。
如果您对高度使用 yRes
,对宽度使用 xRes
,则必须将分隔更改为 xRes/(double)yRes
。
D3DXMatrixPerspectiveFovLH
预期的宽高比是 width by height 而不是相反。
我一直在努力在 DirectX 9 中进行转换,在调试过程中我终于注意到一个问题,当调用
D3DXMatrixPerspectiveFovLH(&projection, D3DX_PI/4, yRes/xRes, 1, 100);
投影的第一个元素 (_11) 是#INF,我很确定它不应该是。这是在声明此矩阵之后直接在将其分配给 DirectX 的投影变换之前。
背景:我使用了 RHW 设置为 1 的自定义矢量,所以我得到了我应该看到的正交视图,我还得到了索引缓冲区。从那以后发生的变化是添加了矩阵,如 Drunken Hyena and DirectXTutorial.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,其他所有内容都是正确的,包括缓冲区大小。
欢迎任何帮助或想法,在此先感谢!
yRes
和 xRes
是否声明为 int
?
如果是这样的话,除法 y/x
可能是 0
。尝试将其中一个变量转换为 float
.
此外,我注意到您正在使用 yRes/xRes
计算纵横比。
如果您对高度使用 yRes
,对宽度使用 xRes
,则必须将分隔更改为 xRes/(double)yRes
。
D3DXMatrixPerspectiveFovLH
预期的宽高比是 width by height 而不是相反。