D3D11:如何将 GDI 文本绘制到 GXDI 表面? (无 D2D)

2023-11-25

我需要一些帮助来使用 GDI 和 D3D11 将文本绘制到纹理。我尝试使用 D2D/DirectWrite,但它仅支持 D3D10,而不支持我需要的 D3D11。到目前为止我尝试的一切都失败了...... 现在我想使用GDI方法来写入纹理。 所以我用这个参数创建了一个纹理:

Usage = D3D11_USAGE_DEFAULT;
Format = DXGI_FORMAT_B8G8R8A8_UNORM;
BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
CPUAccessFlags = 0;
MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE

然后我从这个纹理创建了一个普通的 RenderTargetView,正如微软在这里所说的:http://msdn.microsoft.com/en-us/library/ff476203%28v=vs.85%29.aspx

下一步:获取 DXGI 接口:

m_pTexFSText->QueryInterface(__uuidof(IDXGISurface1), (void **)(&m_pDXGISurface));

在渲染函数上我这样做:

m_pDeviceContext->OMSetRenderTargets(1,&m_pTextRenderTarget,NULL);

HDC hDc = NULL;
if(FAILED(m_pDXGISurface->GetDC(TRUE,&hDc)))
    return E_FAIL;

COLORREF bla = SetPixel(hDc,1,1,RGB(255,255,255));
bool hmm = TextOutA(hDc, 10, 10, "LALALA!", 7);

if(FAILED(m_pDXGISurface->ReleaseDC(NULL)))
    return E_FAIL;

问题是,GDI 绘制后纹理仍然是空的(也用 PIX 进行了测试)。 一切正常,没有错误消息。

我希望任何人都可以解释它是如何工作的。

谢谢,斯特凡

编辑:也尝试过GetDC(FALSE,&hDc)(根据文档):相同的结果 -> 什么也没有。


实际上,上周我经常与这个问题作斗争 - 但我已经全部解决了!以下是您应该了解/执行的事项列表,以使其一切正常:

  • 检查 GetDC 方法在此处工作的表面要求:http://msdn.microsoft.com/en-us/library/windows/desktop/ff471345(v=vs.85).aspx

使用此方法时请记住以下几点:

•您必须通过对表面使用D3D11_RESOURCE_MISC_GDI_COMPATIBLE 标志或对交换链使用DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE 标志来创建表面,否则此方法将失败。

•在发出任何新的Direct3D 命令之前,必须释放设备并调用IDXGISurface1::ReleaseDC 方法。

• 如果已通过此方法创建了未完成的 DC,则此方法将失败。

•表面或交换链的格式必须是DXGI_FORMAT_B8G8R8A8_UNORM_SRGB 或DXGI_FORMAT_B8G8R8A8_UNORM。

•在GetDC 上,Direct3D 管道的输出合并中的渲染目标与表面解除绑定。在 GDI 渲染之后进行 Direct3D 渲染之前,您必须在设备上调用 ID3D11DeviceContext::OMSetRenderTargets 方法。

• 在调整缓冲区大小之前,您必须释放所有未完成的DC。

  • 如果您要在后台缓冲区中使用它,请记住重新绑定渲染目标after您已致电 ReleaseDC。在调用 GetDC 之前无需手动取消绑定 RT,因为此方法可以为您完成此操作。

  • 你不能使用any当表面被 GDI 的 DXGI 专门锁定时,在 GetDC() 和 ReleaseDC() 调用之间进行 Direct3D 绘图。但是,您可以混合 GDI 和 D3D 渲染,前提是每次需要使用 GDI 时调用 GetDC()/ReleaseDC(),然后再转向 D3D。

  • 最后一点可能听起来很简单,但您会惊讶地发现有多少开发人员陷入了这个问题 - 当您在后台缓冲区上使用 GDI 进行绘制时,请记住这是backbuffer,而不是帧缓冲区,所以为了真正看到你绘制的内容,你必须将 RT 重新绑定到 OM 并调用 swapChain->Present() 方法,这样后备缓冲区将变成帧缓冲区,其内容将显示在屏幕。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D3D11:如何将 GDI 文本绘制到 GXDI 表面? (无 D2D) 的相关文章

随机推荐

  • 哪个 gem 破坏了 Rails application.css.scss 参数数量错误 3 为 2

    好的 这是gem更新引起的新问题 调用 Bundle update 会破坏我的 Rails 应用程序 以下是更改的宝石 Gemfile lock compass 0 12 7 compass 0 12 2 sass gt 3 2 19 sa
  • 在 Windows 8 桌面应用程序上使用 MediaCapture

    在 Windows 8 桌面应用程序上 我需要使用 C 4 5 中的相机拍照 我尝试使用 CameraCaptureUI 类 但它在桌面应用程序上不可用 所以我尝试使用 MediaCapture 类 它可用于 Metro 应用程序或桌面应用
  • 朱利安方法来执行Python的yield(以及yield from)

    朱利安的收益率 以及收益率 方法是什么就像蟒蛇一样 编辑 我将尝试在 python 中添加小示例 想想 4x4 棋盘 找出国际象棋王可以走的每N步长路径 不要浪费内存 gt 为每条路径生成生成器 如果我们用数字签署每个位置 0 1 2 3
  • 在实现中重新包含标头

    假设我有一个标题foo h像这样 ifndef FOO H define FOO H include
  • Spinner 无法加载整数数组?

    我有一个应用程序 其中有一个微调器 我想用一些数字 4 8 12 16 填充它 我使用上述项目在 strings xml 中创建了一个整数数组对象 将 Spinner 的条目设置为整数数组 当我运行应用程序时 我得到 04 19 23 38
  • Vnext 参数 1:无法从“string”转换为“System.IO.Stream”

    我正在尝试创建一个Next 项目中的通用序列化器当我调用 StreamWriter 的构造函数时 它会抛出此编译器错误 错误 CS1503 参数 1 无法从 字符串 转换为 System IO Stream Test ASP NET Cor
  • 从 Javascript 更改 CSS 规则集

    是否可以动态更改 CSS 规则集 即 当用户单击小部件时 某些 JS 会更改 CSS 规则集 这个特定的 CSS 规则集应用于页面上的许多元素 通过类选择器 我想在用户单击小部件时对其进行修改 以便所有具有class change 可以 但
  • 使用 Asp.net 路由的 IRouteHandler.GetHttpHandler 中的会话为 null

    我试图在 IRouteHandler 类的 GettHttpHandler 方法中启用会话 但会话始终为空 有人可以告诉我我做错了什么吗 在 global asax 我有 RouteTable Routes Add All new Rout
  • 多次加载 DLL?

    我正在使用LoadLibrary在 Windows 中加载 DLL 的函数 我的问题是 如果我对同一个 DLL 多次调用此方法 我是否会获得该 DLL 的不同实例的句柄 或者它们都引用同一个实例 此外 这种行为与 Linux SO 文件有何
  • 有什么解决方案可以将验证码添加到 Django-allauth 吗?

    有没有将验证码与 django allauth 一起使用的解决方案 我想在注册表上使用验证码进行标准电子邮件 密码注册 我也需要用 django allauth 来做到这一点 并发现实现django recaptcha封装起来比较简单 配置
  • Node.js (ES6 / Babel) 中 import X 和 import * as X 的区别?

    我有一个 Node js 库lib用 ES6 编写 编译为Babel 其中我导出以下子模块 use strict import as config from config import as db from db import as sto
  • 编译时按架构排除go源文件

    我正在为 Windows 编写一个 Go 程序 其中包含多个包 其中一个包是使用 CGo 调用一些 h 和 c 文件中定义的一些函数 这些 c 文件依赖于 windows h 由于在 Windows 平台上开发非常繁琐 我想制作这个文件中的
  • 防止递归函数中出现 StackOverFlow

    我有一个递归函数BaseClass这依赖于一个protected virtual函数的返回条件 子类可能会错误地覆盖此函数并导致StackOverFlow例外 最糟糕的是有一些缓慢的网络调用 并且异常不会很快发生 许多资源浪费了很长一段时间
  • Swift DateFormatter 可选毫秒[重复]

    这个问题在这里已经有答案了 我有以下代码来解析 ISO8601 日期 let dateFormatter DateFormatter dateFormatter dateFormat yyyy MM dd T HH mm ss SSSZZZ
  • Jsoup.parse() 与 Jsoup.parse() - 或者 Jsoup 中的 URL 检测如何工作?

    Jsoup 有 2htmlparse 方法 解析 字符串 html 由于没有指定基本 URI 因此是绝对 URL 检测依赖于包含标签的 HTML 解析 字符串 html 字符串 baseUri HTML 所在的 URL 被检索自 用于将相对
  • 如何在 Mac OS X 中实现全局键盘挂钩?

    我知道这可以在 Windows 上完成XGrabKeyX11可以用 但是Mac OS X呢 我想创建一个类 允许设置即使应用程序窗口处于非活动状态也可以调用的快捷键 Cocoa 中 还没有 不支持这一点 您仍然可以使用旧的 Carbon 库
  • 在 IPython Notebook 中同时使用 Python 2.x 和 Python 3.x

    我使用 IPython 笔记本 并且希望能够选择在 IPython 中创建 2 x 或 3 x python 笔记本 我最初有Anaconda 使用 Anaconda 时 必须更改全局环境变量以选择所需的 Python 版本 然后才能启动
  • Mysql 错误 1452 - 无法添加或更新子行:外键约束失败

    我遇到了一个奇怪的问题 我正在尝试向引用另一个表的一个表添加外键 但由于某种原因失败了 由于我对 MySQL 的了解有限 唯一可能怀疑的是另一张表上有一个外键引用了我试图引用的表 我做了一个SHOW CREATE TABLE对两个表进行查询
  • 如何使用copy_from_user的正确方法?

    我正在尝试使用以下函数将值从用户空间复制到内核空间 static ssize t device write struct file filp const char buff size t len loff t off unsigned lo
  • D3D11:如何将 GDI 文本绘制到 GXDI 表面? (无 D2D)

    我需要一些帮助来使用 GDI 和 D3D11 将文本绘制到纹理 我尝试使用 D2D DirectWrite 但它仅支持 D3D10 而不支持我需要的 D3D11 到目前为止我尝试的一切都失败了 现在我想使用GDI方法来写入纹理 所以我用这个