开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 692|回复: 24
收起左侧

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

[复制链接]
结帖率:86% (44/51)
发表于 3 天前 | 显示全部楼层 |阅读模式   湖南省长沙市
分享源码
界面截图:
是否带模块: -
备注说明: -
本帖最后由 〞剑舞长空 于 2025-3-28 08:08 编辑

纯AI写的,我是懒得写啥内容了。

实际就是翻译C++代码,连着备注都是AI整的



好的,这是一份适合在论坛或文档中描述这段易语言代码作用的格式化文本。


标题: 【易语言/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 Model):
    • 通过 IUnknow_QueryInterface, IUnknow_AddRef, IUnknow_Release 等子程序进行手动的 COM 接口查询和引用计数管理。
    • 使用 动态调用 (易语言特性) 基于虚函数表 (VTBL) 索引来调用 COM 接口方法。
    • 使用 GuidFromString (内部调用 CLSIDFromString) 从字符串创建 GUID 字节集。
  • 易语言特性:
    • 字节集 用于存储 GUID。
    • 传址 用于传递输出参数的地址。
    • 动态调用 用于 COM 方法调用。
    • #常量 定义。
    • 自定义错误检查 (FAILED) 和清理 (CleanupGraphics) 逻辑。

代码执行流程概述:

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

将以上内容复制粘贴到论坛编辑器即可。

bu.e

53.89 KB, 下载次数: 26, 下载积分: 精币 -2 枚

售价: 2 枚 精币  [记录]

VX截图_20250328080339.png

评分

参与人数 1精币 +1 收起 理由
kyo9766 + 1 感谢分享,很给力!~

查看全部评分


签到天数: 25 天

发表于 昨天 09:38 | 显示全部楼层   浙江省宁波市
感谢分享,支持开源!!!
回复 支持 反对

使用道具 举报

结帖率:98% (108/110)

签到天数: 25 天

发表于 昨天 07:22 | 显示全部楼层   山东省青岛市
全都是大佬~
回复 支持 反对

使用道具 举报

结帖率:100% (53/53)

签到天数: 28 天

发表于 昨天 07:17 | 显示全部楼层   山东省青岛市
已经顶贴,感谢您对论坛的支持!
回复 支持 反对

使用道具 举报

结帖率:74% (23/31)

签到天数: 26 天

发表于 前天 12:23 | 显示全部楼层   辽宁省丹东市
这个是不是可以游戏黑屏优化呢
回复 支持 反对

使用道具 举报

签到天数: 9 天

发表于 前天 09:48 | 显示全部楼层   山东省潍坊市
感谢分享,支持开源!!!
回复 支持 反对

使用道具 举报

签到天数: 25 天

发表于 前天 09:36 | 显示全部楼层   浙江省宁波市
感谢分享,支持开源!!!
回复 支持 反对

使用道具 举报

结帖率:98% (108/110)

签到天数: 25 天

发表于 前天 07:12 | 显示全部楼层   山东省青岛市
感谢您对论坛的支持!
回复 支持 反对

使用道具 举报

结帖率:100% (53/53)

签到天数: 28 天

发表于 前天 07:08 | 显示全部楼层   山东省青岛市
已经顶贴,感谢您对论坛的支持!
回复 支持 反对

使用道具 举报

签到天数: 15 天

发表于 3 天前 | 显示全部楼层   江苏省连云港市

谢谢分享
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表