【问题标题】:C++ - DirectX11 covers direct2d textureC++ - DirectX11 涵盖了 direct2d 纹理
【发布时间】:2014-12-22 19:51:26
【问题描述】:

这是我在这个论坛上的第一篇文章。大约 3 个月前,我开始学习 DirectX 11(使用 C++)。我正在尝试基于 Directx 11 编写自己的引擎,当我在 DirectX11 内容之上绘制 Direct2D 内容时,我发现了一些小缺点。我明白它为什么会发生,但我不知道如何解决它。我认为问题在于我直接绘制二维内容的四边形矩阵变换。我从 www.braynzarsoft.net 学习。上课:Tutorial 14: DirectX 11 Simple Font

i.stack.imgur.com/Ok4Nl.png

i.stack.imgur.com/mR7UH.png

矩阵变换和我在directx 11内容的“顶部”上绘制四边形的方式:

XMFLOAT4X4 WVP;
xmset(WVP, XMMatrixIdentity());
xmset(device->m_PerObject.m_wvp, XMMatrixTranspose(XMFloat4X4ToXMMatrix(WVP)));
xmset(device->m_PerObject.m_world, XMMatrixTranspose(XMFloat4X4ToXMMatrix(WVP)));
device->getDeviceContext()->UpdateSubresource(device->getPerObjectInfo()->getBuffer(), 0, NULL, &(device->m_PerObject), 0, 0);
device->getDeviceContext()->VSSetConstantBuffers(0, 1, device->getPerObjectInfo()->getBufferPtr() );
device->getDeviceContext()->PSSetShaderResources(0, 1, &m_d2dTexture);
device->getDeviceContext()->PSSetSamplers(0, 1, &sampState);
device->getDeviceContext()->DrawIndexed(6, 0, 0);

我编写了函数“xmset”来将第二个参数分配给第一个参数(使用 XMFLOAT4X4 或 XMFLOAT3 来防止由于 tu 16 对齐而导致的崩溃)。 就像教程说我已经将 XMMatrixIdentity() 分配给 WVP(世界视图投影),然后将其传递给常量缓冲区。如何始终在 DirectX 11 内容之上绘制?

【问题讨论】:

  • 请注意,对于 DirectXMath 的这种使用模式,您可能应该只在 DirectX Tool Kit 中使用 SimpleMath,它为 XMFLOAT4<->XMVECTORXMFLOAT4X4<->XMMATRIX 提供隐式转换运算符。
  • 问题可能不是变换矩阵,而是深度顺序或深度状态。请注意,本教程假设您使用的是 DirectX 11.0 系统。使用安装了 DirectX 11.1 运行时的系统时,无需使用 DXGI 表面共享和多个设备在 Direct3D 11 设备上渲染 Direct2D。
  • 我在 DirectX 11.0 中编写引擎那么我可以用谷歌搜索什么答案?

标签: directx


【解决方案1】:

我已经解决了这个问题。就像 Chuck Walbourn 所说的那样,问题处于深度状态。我必须为direct2d (DepthEnable = false) 和direct3d (DepthEnable = true) 创建两个深度状态。如果有人有同样的问题,你只需要两个 ID3D11DepthStencilState。非常感谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多