首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Direct3D9全屏应用程序变形渲染

Direct3D9全屏应用程序变形渲染
EN

Stack Overflow用户
提问于 2014-08-22 17:41:44
回答 2查看 166关注 0票数 0

我很难在基于Direct3D9的游戏上编码。一切顺利,我遇到了一个大问题。我创建了一个类,它包装了从.x文件加载网格的过程。我成功地加载了一个只有一张脸可见的立方体。理论上,这张脸应该看起来像一个正方形,但它实际上是一个矩形。我确信D3DPRESENT_PARAMETERS结构有问题。下面是我的应用程序初始化过程中最重要的一行。

要创建的第一部分是焦点窗口:

代码语言:javascript
复制
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结构。

代码语言:javascript
复制
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函数。

接下来,分配视图端口。

代码语言:javascript
复制
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
}

在这个初始化之后,我全局声明一些以后将使用的参数。

代码语言:javascript
复制
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;

更新函数如下所示:

代码语言:javascript
复制
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);

设备不是空指针。

最近,我意识到声明和设置视图端口与不这样做没有区别。

如果有人能帮我找到正确的答案,请帮我解决这个烦人的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-23 15:04:56

如果您没有设置任何转换矩阵,那么恒等变换将应用到您的网格中,那么立方体的表面将被拉伸到与视口相同的形状。如果你的视口不是方形的(如。它与屏幕大小相同),那么你的立方体的脸也不会是方形的。

您可以使用正方形视图来解决这个问题,但这将限制您的渲染仅限于屏幕上的那个方块。如果你想渲染到整个屏幕,你需要设置一个合适的投影矩阵。您可以使用D3DXMatrixPerspectiveFovLH计算普通透视图矩阵。如果您想要一个正交透视图,其中所有的东西都是相同的大小,而不管距离相机的距离,那么使用D3DXMatrixOrthoLH来计算透视矩阵。请注意,如果在后面的函数中使用视图的宽度和高度,它将缩小多维数据集。一个单位大小的立方体将呈现为屏幕上的单个像素。您可以使用一个世界或视图转换来再次扩展它,或者使用像width/height1这样的东西作为D3DXMatrixOrthoLH的宽度和高度参数。

如果你使用D3DXMatrixPerspectiveFovLH,那么你想要这样的东西:

代码语言:javascript
复制
D3DXMatrixPerspectiveFovLH(&Proj, D3DX_PI/4, (double) D3DMM.Width / D3DMM.Height,
                           1.0f, 1000.f);
票数 0
EN

Stack Overflow用户

发布于 2014-08-22 20:57:24

我认为您的问题不是在D3DPP参数中,而是在投影矩阵中。如果使用D3DXMatrixPerspectiveFovLH,请检查高宽比为1280 / 1024 =1.3333 f

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25452743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档