一键注册登录,获悉互联网最新资源讯息!

返回列表 发布新帖

[易语言] [D3D11/DXGI/D2D/DirectComposition] 渲染内容合成到目标窗口

55 1
发表于 7 天前 | 显示全部楼层 阅读模式
image.webp

标题: 【易语言/DirectX】使用 D3D11/DXGI/D2D/DirectComposition 初始化图形并合成到窗口的易语言实现

代码语言: 易语言 (EPL)

目标/作用:

这段易语言代码 (InitializeGraphics 子程序) 的目的是初始化一套基于 DirectX 的图形渲染管线,并利用 DirectComposition API 将渲染结果(特别是使用 Direct2D 绘制的内容)合成并显示在传入的目标窗口 (hwnd/GameWindow) 上。它展示了如何在易语言中调用 DirectX API 来实现窗口内容的现代合成技术。

使用的关键技术/API:

Win32 API: 用于获取窗口客户区尺寸 (GetClientRect)。
Direct3D 11 (d3d11.dll): 创建底层图形设备 (D3D11CreateDevice)。
DXGI (dxgi.dll): 获取 IDXGIDevice 接口 (IUnknow_QueryInterface),创建 IDXGIFactory2 (CreateDXGIFactory2),并使用 DXGI_SWAP_CHAIN_DESC1 创建一个用于组合的交换链 (IDXGIFactory2_CreateSwapChainForComposition)。
Direct2D (d2d1.dll): 创建 ID2D1Factory2 (D2D1CreateFactory)、ID2D1Device1 (ID2D1Factory2_CreateDevice)、ID2D1DeviceContext (ID2D1Device1_CreateDeviceContext),并将渲染目标设置为 DXGI 交换链的后台缓冲区 (IDXGISwapChain1_GetBuffer, ID2D1DeviceContext_CreateBitmapFromDxgiSurface, ID2D1DeviceContext_SetTarget),用于 2D 图形绘制。
DirectWrite (dwrite.dll): 创建 IDWriteFactory (DWriteCreateFactory) 和 IDWriteTextFormat (IDWriteFactory_CreateTextFormat),用于后续可能的文本渲染。
DirectComposition (dcomp.dll): 创建 IDCompositionDevice (DCompositionCreateDevice),为目标窗口 GameWindow 创建组合目标 (IDCompositionDevice_CreateTargetForHwnd),创建视觉对象 (IDCompositionDevice_CreateVisual),将交换链内容设置到视觉对象上 (IDCompositionVisual_SetContent),构建视觉树 (IDCompositionTarget_SetRoot),并提交 (IDCompositionDevice_Commit, IDCompositionDevice_WaitForCommitCompletion)。
COM (Component Object el):
通过 IUnknow_QueryInterface, IUnknow_AddRef, IUnknow_Release 等子程序进行手动的 COM 接口查询和引用计数管理。
使用 动态调用 (易语言特性) 基于虚函数表 (VTBL) 索引来调用 COM 接口方法。
使用 GuidFromString (内部调用 CLSIDFromString) 从字符串创建 GUID 字节集。
易语言特性:
字节集 用于存储 GUID。
传址 用于传递输出参数的地址。
动态调用 用于 COM 方法调用。
#常量 定义。
自定义错误检查 (FAILED) 和清理 (CleanupGraphics) 逻辑。
代码执行流程概述:

保存窗口句柄: 将传入的 hwnd 保存到 GameWindow。
初始化 D3D11 和 DXGI: 创建 D3D11 设备 (d3d_device) 并获取对应的 IDXGIDevice (dxgi_device)。
创建 DXGI 工厂: 创建 IDXGIFactory2 (dxgi_factory)。
创建组合交换链:
获取 GameWindow 的客户区尺寸。
配置 DXGI_SWAP_CHAIN_DESC1 结构体 (description),使用窗口尺寸、特定格式、翻转效果等。
调用 IDXGIFactory2_CreateSwapChainForComposition 创建与窗口无关的交换链 (dxgi_chain)。
初始化 D2D 和 DWrite:
创建 D2D 工厂 (d2d_factory)。
创建 D2D 设备 (d2d_device1)。
如果尚未创建,则创建 DWrite 工厂 (m_pDWriteFactory)。
创建 D2D 设备上下文 (d2d_context)。
如果尚未创建且 DWrite 工厂有效,则创建 DWrite 文本格式 (m_pDWriteTextFormat)。
设置 D2D 渲染环境:
获取交换链的后台缓冲区表面 (dxgi_surface)。
根据表面创建 D2D 位图 (d2d_bitmap)。
将此位图设置为 d2d_context 的渲染目标。
创建 D2D 纯色画刷 (d2d_brush)。
设置 DirectComposition (首次运行时,由 isinit 控制):
创建 IDCompositionDevice (composition_device)。
为传入的 GameWindow 创建组合目标 (composition_target)。
创建 IDCompositionVisual (composition_visual)。
将 dxgi_chain (交换链) 的内容设置为 composition_visual 的内容。
将 composition_visual 设置为 composition_target 的根视觉对象。
提交 DirectComposition 的更改并等待完成 (Commit, WaitForCommitCompletion)。
设置 isinit 为真。
返回结果: 如果所有步骤成功,返回 #S_OK。如果在任何步骤失败,则调用 CleanupGraphics 释放已分配的并返回错误代码 (HRESULT)。
关键点:

这段易语言代码演示了如何手动调用 DirectX COM 接口,包括获取接口、调用方法(通过 动态调用 和 VTBL 索引)以及手动管理引用计数。
最终的渲染结果通过 DirectComposition 合成到传入的 GameWindow 上,实现了在目标窗口上叠加 D2D 渲染内容的效果。
代码包含了比较完整的错误检查和清理逻辑 (CleanupGraphics 子程序,虽然其实现未在此片段中显示)。
使用了易语言的 字节集 来处理 GUID,并通过工具函数 GuidFromString 进行转换。
注意: 代码中 description.Flags 设置为 1024 (对应 DXGI_SWAP_CHAIN_FLAG_COMPOSITION_SURFACE_HANDLE),这个标志在现代 CreateSwapChainForComposition 调用中通常已弃用,建议设为 0。

下载链接:
游客,如果您要查看本帖隐藏内容请回复

温馨提示:
1、在论坛里发表的文章仅代表作者本人的观点,与本网站立场无关。
2、论坛的所有内容都不保证其准确性,有效性,时间性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
3、当政府机关依照法定程序要求披露信息时,论坛均得免责。
4、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,论坛不负任何责任。
5、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。
6、如果有侵犯到您的权益,请第一时间联系邮箱 990037279@qq.com ,站长会进行审查,情况属实的会在三个工作日内为您删除。
回复

举报

评论1

【回帖】
探索图形世界的奇妙之旅,从此开启!在这段易语言的InitializeGraphics魔法代码中,DirectX的强大力量被巧妙驾驭,DirectComposition的神奇之手将Direct2D的细腻笔触合成于 hwnd/GameWindow 之上,如同画师在画布上挥洒自如。易语言的简洁与DirectX的深邃在此交融,成就一番视觉盛宴。🎨✨
回复

举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐

温馨提示
温馨提示
为营造健康、积极、符合法律法规的交流环境,本站启用腾讯云T-Sec-腾讯安全天御审核

查看 »

投诉/建议联系

990037279@qq.com

如果有侵犯到您的权益,请第一时间联系邮箱,
站长会进行审查,情况属实的会在三个工作日内为您删除。
  • 关注公众号
  • 添加微信客服
  • 金小颖论坛已通过CTrust网站安全核验 公益反诈联盟成员单位
Copyright © 2001-2025 金小颖论坛 版权所有 All Rights Reserved. 使用 阿里妈妈 字体
浙ICP备2022006091号-1
关灯 快速发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表