添加变换后 DirectX 9 不渲染
DirectX 9 not rendering after adding transforms
到目前为止,我得到了一个没有任何变换的立方体渲染(因此它是在正交透视中渲染的),我正在处理以前的代码以将其放入透视图中,其中涉及所有矩阵。我更改了灵活的顶点格式以便没有 RHW(因此只有 XYZ 坐标和颜色,尝试了 ARGB 和 XRGB 但我认为这不重要),并且我添加了一个设置所有矩阵的函数。
调试
表明矩阵创建正确,函数 return 正确(据我所知),没有崩溃(DirectX 永远不会抱怨,如果出现问题,它只是不渲染)并且一般来说,逐步-步调试显示没有异常现象 activity.
现有项目(我修改并最终阻止工作):
在我前进的过程中,我还编写了各种教程,这样我就可以回去看看我上次做了什么来让它工作,这次我保留了版本,这样你就可以获得代码 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);
}
当然请注意,有些元素可能不需要,放在那儿只是为了以防万一,这是我目前拥有的代码,因此我们有一个共同的参考。
提前感谢您的回答and/or 尝试回答。
在您的代码(已下载)中,xRes
和 yRes
是整数。由于整数除法,yRes/xRes
将为零,因为 xRes > yRes。您将其作为纵横比传递给 D3DXMatrixPerspextiveFovLH
函数,这将产生无效矩阵。相反,先将它们转换为浮点数,然后再进行除法,然后将结果传入。
到目前为止,我得到了一个没有任何变换的立方体渲染(因此它是在正交透视中渲染的),我正在处理以前的代码以将其放入透视图中,其中涉及所有矩阵。我更改了灵活的顶点格式以便没有 RHW(因此只有 XYZ 坐标和颜色,尝试了 ARGB 和 XRGB 但我认为这不重要),并且我添加了一个设置所有矩阵的函数。
调试
表明矩阵创建正确,函数 return 正确(据我所知),没有崩溃(DirectX 永远不会抱怨,如果出现问题,它只是不渲染)并且一般来说,逐步-步调试显示没有异常现象 activity.
现有项目(我修改并最终阻止工作):
在我前进的过程中,我还编写了各种教程,这样我就可以回去看看我上次做了什么来让它工作,这次我保留了版本,这样你就可以获得代码 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);
}
当然请注意,有些元素可能不需要,放在那儿只是为了以防万一,这是我目前拥有的代码,因此我们有一个共同的参考。
提前感谢您的回答and/or 尝试回答。
在您的代码(已下载)中,xRes
和 yRes
是整数。由于整数除法,yRes/xRes
将为零,因为 xRes > yRes。您将其作为纵横比传递给 D3DXMatrixPerspextiveFovLH
函数,这将产生无效矩阵。相反,先将它们转换为浮点数,然后再进行除法,然后将结果传入。