openGL、D3D、vulkan区别简介

时间:2024-04-02 22:06:20

跨平台之王——OpenGL

OpenGL发展至今,已经有20余年,作为一个成熟并久负盛名的跨平台计算机图形应用程序接口规范,它被广泛使用在游戏、影视、军事、航空航天、地理、医学、机械设计,以及各类科学数据可视化等领域,也演变出各种版本不过都是基于opengl的比如嵌入式中的OpenGL ES,又基于OpenGL ES发展而来的web端也是H5现在最重要的WebGL,WebGL又是为H5 提供了画布功能,同样的都是基于js的框架 WebGl都有three.js cesium badylon.js等等框架应用场景也都不一样,他们的介绍在我博客中有介绍three.js cesium badylon.js 以及webgl区别
OpenGL可以用来做什么?视频、图形、图片处理 ,2D/3D游戏引擎开发,科学可视化,医学软件开发,CAD(计算机辅助技术),虚拟实境(AR,VR),AI(人工智能);
OpenGL是一种图形应用程序编程接口(Application Programming Interface,API)。它是一种可以对图形硬件设备特性进行访问的软件库,OpenGL被设计为一个现代化的、硬件无关的接口,因此我们可以在不考虑计算机操作系统或窗口系统的前提下,在多种不同的图形硬件系统上,完全通过软件的方式实现OpenGL的接口。
OpenGL还提供了:
openGL、D3D、vulkan区别简介

基于Windows平台开发者——D3D

Direct3D(简称:D3D)与DirectX的关系DirectX,由微软创建的多媒体编程接口,是由很多API组成,按照性质分类,分为:显示部分、声音部分、输入部分和网络部分,其中显示部分担任图像处理关键,其中D3D就是其中的一部分。
D3D主要负责3D效果的显示,例如CS中的场景和人物就使用了DirectX的D3D,它与OpenGL同为电脑绘图软件和电脑游戏最常用的两套绘图编程接口之一。,最重要的版本是D9、D11\D12是很大的不同版本;以下是D3D的官网
Microsoft的D3D组件、其他Microsoft DirectX、操作系统和系统硬件之间的关系:
HAL(硬件抽象层)提供设备独立;HAL是由设备制造商提供的设备指定接口,D3D直接使用显示硬件来工作。程序才能不需要和HAL交互。应用程序使用D3D暴露的一系列接口和方法而不是HAL提供的机制来使用显示设备。 3D程序和GDI程序一样都通过显示卡的设备驱动来访问图形硬件。与GDI不同的是,D3D可以在选择一个HAL设备的时候利用硬件特性,HAL设备提供了基于显示卡支持的硬件加速
openGL、D3D、vulkan区别简介

这里特别强调:说道D3D就不得不说GDI,同样是微软的亲儿子有什么不同?
都是用的显卡加速,区别最大的是D3D支持显存位图,GDI中位图只能是内存,而且D#D处理方式更加贴近硬件解析更快,GDI已经丧失了加速!

OpenGL的替代者——VulkanVulkan是Khronos组织制定的“下一代”开放的图形显示API,是与DirectX12可以匹敌的GPU API标准。Vulkan是基于AMD的Mantle API演化而来,目前Vulkan 1.0标准已经完成并正式发布。Vulkan是一个跨平台的2D和3D绘图应用程序接口(API),最早由科纳斯(Khronos)组织在2015年游戏开发者大会(GDC)上发表。旨在替代OpenGL,提高图形性能。
相对于OpenGLVulkan的优势:

  • 更简单的显示驱动( Vulkan提供了能直接控制和访问底层GPU的显示驱动抽象层,
    显示驱动只是对硬件薄薄的封装,这样能够显著提升操作GPU硬件的效率和性能。之前OpenGL的驱动层对开发者隐藏的很多细节,现在都暴露出来。Vulkan甚至不包含运行期的错误检查层。驱动层干的事情少了,隐藏的bug也就少了)
  • 支持多线程(
    Vulkan不再使用OpenGL的状态机设计,内部也不保存全局状态变量。显示资源完全由应用层负责管理,包括内存管理、线程管理、多线程绘制命令产生、渲染队列提交等。应用程序可以充分利用CPU的多核多线程的计算资源,减少CPU等待,降低延迟。
    带来的问题是,线程间的同步问题也由应用程序负责,从而对开发人员的要求也更高)
  • 预编译shader(这个非常强!驱动层不提供前端shader编译器,只支持标准可移植中间表示二进制代码(SPIR-V)。即提高了执行Shaders的效率又增加了将来着色语言的灵活性。所以目前的GLSL/HLSL可以直接通过工具转换为SPIR-V,在Vulkan中使用。这样就可以使用离线的shader编译。另外,SPIR-V还支持OpenCL!)

个人建议:
*

如果是一个新手的话,不建议直接学习vulkan,vulkan的使用门槛很高,需要对硬件驱动框架有一个比较综合的认识,并且vulkan的环境很难搭建,极容易让新人产生挫败感,从而兴趣。opengl的入门相对容易,对新人很友好,由于是学习阶段,因此也不用太关心opengl的性能/多线程问题,在使用的过程中可以加深去底层驱动及硬件架构的认识,在有了一些的基础之后再入手vulkan会更加容易

*。