我很难在基于Direct3D9的游戏上编码。一切顺利,我遇到了一个大问题。我创建了一个类,它包装了从.x文件加载网格的过程。我成功地加载了一个只有一张脸可见的立方体。理论上,这张脸应该看起来像一个正方形,但它实际上是一个矩形。我确信D3DPRESENT_PARAMETERS结构有问题。下面是我的应用程序初始化过程中最重要的一行。
要创建的第一部分是焦点窗口:
HWND hWnd = CreateWindowEx(0UL, L"NewFrontiers3DWindowClass", Title.c_str(), WS_POPUP | WS_EX_TOPMOST, 0, 0, 1280, 1024, nullptr, (HMENU)false, hInstance, nullptr);然后我填写D3DPRESENT_PARAMETERS结构。
D3DDISPLAYMODE D3DMM;
SecureZeroMemory(&D3DMM, sizeof(D3DDISPLAYMODE));
if(FAILED(hr = Direct3D9->GetAdapterDisplayMode(Adapter, &D3DMM)))
{
// Error is processed here
}
PresP.BackBufferWidth = D3DMM.Width;
PresP.BackBufferHeight = D3DMM.Height;
PresP.BackBufferFormat = BackBufferFormat;
PresP.BackBufferCount = 1U;
PresP.MultiSampleType = D3DMULTISAMPLE_NONE;
PresP.MultiSampleQuality = 0UL;
PresP.SwapEffect = D3DSWAPEFFECT_DISCARD;
PresP.hDeviceWindow = hWnd;
PresP.Windowed = false;
PresP.EnableAutoDepthStencil = EnableAutoDepthStencil;
PresP.AutoDepthStencilFormat = AutoDepthStencilFormat;
PresP.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;
PresP.FullScreen_RefreshRateInHz = D3DMM.RefreshRate;
PresP.PresentationInterval = PresentationInterval;然后创建Direct3D9设备,然后是SetRenderState函数。
接下来,分配视图端口。
D3DVIEWPORT9 D3D9Viewport;
SecureZeroMemory(&D3D9Viewport, sizeof(D3DVIEWPORT9));
D3D9Viewport.X = 0UL;
D3D9Viewport.Y = 0UL;
D3D9Viewport.Width = (DWORD)D3DMM.Width;
D3D9Viewport.Height = (DWORD)D3DMM.Height;
D3D9Viewport.MinZ = 0.0f;
D3D9Viewport.MaxZ = 1.0f;
if(FAILED(Direct3D9Device->SetViewport(&D3D9Viewport)))
{
// Error is processed here
}在这个初始化之后,我全局声明一些以后将使用的参数。
D3DXVECTOR3 EyePt(0.0f, 0.0f, -5.0f), Up(0.0f, 1.0f, 0.0f), LookAt(0.0f, 0.0f, 0.0f);
D3DXMATRIX View, Proj, World;更新函数如下所示:
Mesh.Render(Direct3D9Device);
D3DXMatrixLookAtLH(&View, &EyePt, &LookAt, &Up);
Direct3D9Device->SetTransform(D3DTS_VIEW, &View);
D3DXMatrixPerspectiveFovLH(&Proj, D3DX_PI/4, 1.0f, 1.0f, 1000.f);
Direct3D9Device->SetTransform(D3DTS_PROJECTION, &Proj);
D3DXMatrixTranslation(&World, 0.0f, 0.0f, 0.0f);
Direct3D9Device->SetTransform(D3DTS_WORLD, &World);设备不是空指针。
最近,我意识到声明和设置视图端口与不这样做没有区别。
如果有人能帮我找到正确的答案,请帮我解决这个烦人的问题。
发布于 2014-08-23 15:04:56
如果您没有设置任何转换矩阵,那么恒等变换将应用到您的网格中,那么立方体的表面将被拉伸到与视口相同的形状。如果你的视口不是方形的(如。它与屏幕大小相同),那么你的立方体的脸也不会是方形的。
您可以使用正方形视图来解决这个问题,但这将限制您的渲染仅限于屏幕上的那个方块。如果你想渲染到整个屏幕,你需要设置一个合适的投影矩阵。您可以使用D3DXMatrixPerspectiveFovLH计算普通透视图矩阵。如果您想要一个正交透视图,其中所有的东西都是相同的大小,而不管距离相机的距离,那么使用D3DXMatrixOrthoLH来计算透视矩阵。请注意,如果在后面的函数中使用视图的宽度和高度,它将缩小多维数据集。一个单位大小的立方体将呈现为屏幕上的单个像素。您可以使用一个世界或视图转换来再次扩展它,或者使用像width/height和1这样的东西作为D3DXMatrixOrthoLH的宽度和高度参数。
如果你使用D3DXMatrixPerspectiveFovLH,那么你想要这样的东西:
D3DXMatrixPerspectiveFovLH(&Proj, D3DX_PI/4, (double) D3DMM.Width / D3DMM.Height,
1.0f, 1000.f);发布于 2014-08-22 20:57:24
我认为您的问题不是在D3DPP参数中,而是在投影矩阵中。如果使用D3DXMatrixPerspectiveFovLH,请检查高宽比为1280 / 1024 =1.3333 f
https://stackoverflow.com/questions/25452743
复制相似问题