【问题标题】:How does windows gdi work in compare to directX/openGL?与 directX/openGL 相比,windows gdi 如何工作?
【发布时间】:2017-07-12 17:07:14
【问题描述】:

我知道 DirectX 和 OpenGL 都内置在显卡中,您可以在需要时访问它们,因此所有渲染都将基于硬件加速。

我找不到任何关于 GDI 的信息,但我确定它不是基于显卡的加速。 这些技术有何不同?我在这里缺少什么?

【问题讨论】:

  • 在早期,您可以使用 DirectX/OpenGL 渲染 SDK/API 创建应用程序,而无需任何实际的硬件加速(并使用有限的功能)。例如,MESA 驱动程序实现将完全在 CPU 上管理 opengl 渲染调用,这是 linux 人多年来一直坚持的事情。 WARP10 试图为 DX7 提供同样的东西。硬件“依赖性”主要源于使用高级渲染功能(如着色器)的应用程序。

标签: opengl graphics directx rendering gdi


【解决方案1】:

GDI 库可以追溯到 90 年代初和 Windows 的第一个版本。它支持硬件加速光栅操作和软件矢量图形绘图的混合。它主要用于为 GUI 绘制“演示”图形和文本。 GDI+ 是 GDI 的基于 C++ 类的包装器,但基本上是相同的技术。现代版本的 Windows 仍然支持传统的 GDI API,但现代显卡不实现旧的固定功能“光栅操作”硬件加速路径——即使是指 90 年代早期的“GPU”显卡也不是很准确。

OpenGL 和 Direct3D 是围绕像素、线条和带纹理的三角形构建的图形 API。两者的现代版本都使用可编程着色器阶段而不是固定功能硬件来实现变换和照明、纹理混合等。这些支持 3D 硬件加速,但它们本身不支持经典的“光栅操作”或基于矢量的绘图,如 styled/宽线、实心椭圆等。Direct2D 是一个矢量图形库,它在 Direct3D 之上执行这些旧的“GDI 样式”操作,并混合了软件和硬件加速路径,并且是现代 Windows GUI 在与实现高质量文本渲染的 DirectWrite 结合使用。

请参阅Graphics APIs in WindowsVector graphicsRaster graphics

简而言之,对于现代 Windows 编程,您应该将 Direct2D/DirectWrite 用于“演示图形”,可能通过 Win2D 之类的包装器,将 Direct3D 用于 2D 光栅“sprite”图形或 3D 图形渲染(请参阅 DirectX Tool Kit)。

【讨论】:

    【解决方案2】:

    GDI 是纯 2D 图像访问和渲染(如果未禁用,则光栅级别的加速非常有限)。 所以在 GDI 中没有:

    • 纹理
    • 着色器
    • 缓冲区
    • 深度/模板缓冲区
    • 变换矩阵
    • gfx 管道

    区别在于:

    • 透明度是由特定颜色值而不是 Alpha 通道完成的
    • 只能在每个通道的添加、异或、复制模式下进行混合
    • 您可以直接访问像素
    • 获得 Windows 字体访问和文本功能支持
    • 与窗口相关的 GDI 调用应仅从其主线程调用 (WndProc)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-28
      • 2021-07-02
      • 2012-02-28
      • 2011-04-04
      • 1970-01-01
      • 2015-04-08
      • 2016-07-29
      • 2010-09-29
      相关资源
      最近更新 更多