可可西

OpenGL与Direct3D

 

 

OpenGL(wiki  chs)/ OpenGL ES(wiki  chs)是跨平台的,OpenGL广泛用于PC平台(windows、Linux、Unix、Mac OS X),OpenGLES则用于移动端平台(Android、iOS),以C的方式提供API

WebGL(wiki  chs)是跨平台3D图形Web标准,被各大web浏览器厂商广泛支持,使用JavaScript语言提供API,不使用插件的情况下在兼容的web浏览器的Canvas上呈现交互式3D图形

Direct3D(wiki  chs)是DirectX(wiki  chs)套装的一部分,只能用于windows相关的平台,用C++实现,并以COM的方式提供API

OpenGL与Direct3D是多年的竞争关系,wiki上有一篇:Comparison of OpenGL and Direct3D

 

固定管线到可编程管线进化版本

3D API 最后只支持固定管线的版本 第一个支持可编程管线版本 第一个只支持可编程管线版本
OpenGL 1.5 2.0 3.1
OpenGL ES 1.1 2.0 2.0
WebGL 1.0 1.0
Direct3D 7.0 8.0 10.0

 

OpenGL、OpenGL ES和WebGL

OpenGL版本 Shader版本 OpenGL ES WebGL
OpenGL 1.1(1997.3.4)      
OpenGL 1.2(1998.3.16)      
OpenGL 1.3(2001.8.14)   OpenGL ES 1.0(2003.7.28)  
OpenGL 1.4(2002.7.24)      
OpenGL 1.5(2003.7.29)  

OpenGL ES 1.1(兼容1.0版本)

 
OpenGL 2.0(2004.9.7) GLSL 1.1 OpenGL ES 2.0(2007.3)  GLSL ES 1.0 WebGL 1.0为GLSL ES 1.0的子集
OpenGL 2.1(2006.7.2) GLSL 1.2    
OpenGL 3.0(2008.8.11) GLSL 1.3    
OpenGL 3.1(2009.3.24) GLSL 1.4    
OpenGL 3.2(2009.8.3) GLSL 1.5(Geometry Shaders)    
OpenGL 3.3(2010.3.11) GLSL 3.30    
OpenGL 4.0(2010.3.11) GLSL 4.00(Tessellation Shaders)    
OpenGL 4.1(2010.7.26) GLSL 4.10    
OpenGL 4.2(2011.8.8) GLSL 4.20    
OpenGL 4.3(2012.8.6) GLSL 4.30(Compute Shaders) OpenGL ES 3.0(2012.8,兼容2.0版本) GLSL ES 3.0 WebGL 2.0   GLSL ES 3.0
OpenGL 4.4(2013.7.22) GLSL 4.40    
    OpenGL ES 3.1(2014.3,向前兼容至2.0版本) GLSL ES 3.1 (Compute Shaders)  
OpenGL 4.5(2014.8.11) GLSL 4.50    
    OpenGL ES 3.2(2015.8,向前兼容至2.0版本)  GLSL ES 3.2  
OpenGL 4.6(2017.7.31) GLSL 4.60    

 

在OpenGL 3.0之前的版本,所有的OpenGL Context(上下文)都是统一的,都是一种兼容之前版本的模式(例如使用OpenGL 1.1编写的代码,在支持OpenGL 2.1的设备上可以正常的运行)。

这些版本的OpenGL API也被称之为固定管线(相比较之后引入shader的可编程管线来说), 固定管线使用的是立即渲染模式(Immediate mode),这个模式下绘制图形很方便,OpenGL的大多数功能都被库隐藏起来。

而开发者迫切希望能有更多的灵活性。随着时间推移,规范越来越灵活,开发者对绘图细节有了更多的掌控。立即渲染模式确实容易使用和理解,但是效率太低。因此从OpenGL 3.0开始有了变化:

(1)OpenGL 3.0 引入了废弃机制(deprecated),标记了许多OpenGL的函数是废弃的(但是3.0并没有真正移除它们,也就是说3.0版本仍然是一个可以向前兼容的Context)

(2)OpenGL 3.1发布删除了之前3.0标记的过时函数(固定管线相关的函数),但是为了之前的OpenGL代码可用, 引入了一个扩展ARB_compatibility,这个扩展可以让OpenGL 3.1支持之前的OpenGL固定管线的内容。

在OpenGL 3.2中正式引入了模式的概念(Profile),分为Core Profile和Compatibility Profile(注:3.2~4.6的OpenGL版本都是按照这种模式来做的):

(1)Core Profile不包含任何标记为deprecated(弃用)的功能,只包含最新的Shader相关的函数,程序必须使用Shader编写

(2)Compatibility Profile可以兼容之前的OpenGL固定管线的内容,也可以使用Core Profile中的内容

 

扩展阅读:History of OpenGL

 

Direct3D

D3D版本 Shader版本 OS版本
Direct3D 7.0(1999.9.22)   Win98
Direct3D 8.0(2000.10.12) PS1.1、VS1.1 Win2000
Direct3D 8.1(2001.10.25) PS1.4、VS1.1 WinXP
Direct3D 9.0(2002.11.19) SM2.0 WinXP
Direct3D 9.0b(2003.8.13) PS2.0b、VS2.0 WinXP

Direct3D 9.0c

2004.10~2010.6(每2月更新一个版本)

DXSDK_Jun10.exe是其最后一个版本

SM3.0 WinXP

Direct3D 9.0L(Direct3D 9Ex)

在Vista上使用WDDM驱动来跑Direct3D 9.0c的程序

SM3.0 Vista Only
Direct3D 10.0(2006.11.30) SM4.0(Geometry Shaders) Vista

Direct3D 10.1(2008.2.4)

SM4.1 Vista SP1

Direct3D 11.0(2009.10.22)

                     (2011.2.16)

SM5.0(Tessellation Shaders、Compute Shaders)

Win7

Win7 SP1

Direct3D 11.1(2012.8.1) SM5.0 Win7 SP1、Win8
Direct3D 11.2(2013.10.18) SM5.0 Win8.1
Direct3D 12.0(2015.7.29) SM6.0 Win10

 

OpenGL与Direct3D对应关系

OpenGL版本 D3D版本 OS版本
OpenGL 2.1 Direct3D 9.0(SM2.0) WinXP

OpenGL 3.0~3.1

Direct3D 9.0c(SM3.0) WinXP

OpenGL 3.2~3.3

Direct3D 10.0(SM4.0)

Vista

OpenGL 4.0~4.6

Direct3D 11.0(SM5.0)

Win7

 

显卡与驱动

显卡支持Direct3D和OpenGL版本由驱动程序决定的,在硬件不支持的情况下,可以由驱动退回到软件执行。GPU并不知道自己执行的是哪个API,以及是什么版本

例如:一些老显卡可通过提供win10新驱动来支持D3D12;驱动可以返回自己支持的feature level,runtime根据这个来确定哪些功能有,那些没有。

扩展阅读:支持dx12的显卡有哪些?目前完整支持DirectX12的显卡列表详解

 

PC平台显卡

桌面显卡性能天梯图:http://www.mydrivers.com/zhuanti/tianti/gpu/index.html

秋刀鱼半藏整理的天梯图:https://pic1.zhimg.com/v2-2f1801c8ba1988962caa7ec865c55601_r.jpg

笔记本显卡性能天梯图:http://www.mydrivers.com/zhuanti/tianti/gpum/index.html

花飞羽落整理的天梯图(含桌面和笔记本):https://tieba.baidu.com/p/5562043942

在PC上可是使用GPU-Z来查看显卡的信息:

  

 

手机平台GPU:

手机gpu性能天梯图:http://12601618.s21i.faiusr.com/4/ABUIABAEGAAgwauaxQUo4o6R_gQw-gg4qxI.png

手机gpu性能天梯图:http://pan.baidu.com/s/1hqKuONq

注:天梯图分为三个版本:α版、β版、γ版

       α版以GFXBench的霸王龙离屏分数为标准, Adreno320@400MHz为基准

       β版以GFXBench的曼哈顿3.0离屏分数为标准,Adreno320@400MHz为基准

       γ版以GFXBench的曼哈顿3.1离屏分数为标准,Adreno405@550MHz为基准

 

Direct3D库、显卡和驱动

在windows系统上,使用dxdiag来查看当前所能支持的Direct3D版本

 

NVIDIA控制面板设置

注1:选择由3D应用程序决定,会使用软件自己设置的图形选项

注2:选择使用“高级3D图像”设置,会使用“管理3D设置”中的图形选项(如果软件配置了程序设置,会拿程序设置里面的覆盖全局设置里面的配置)

 

设置PC机高性能 

 

关闭电脑管家(尤其是小火箭悬浮窗)、关闭iOA

关闭一些产生透明窗体的软件(如:日历、便签)

 

OpenGL库、显卡和驱动

由于Direct3D是竞争关系,OpenGL在windows的集成的库是1.1的版本

在windows系统上,可使用GPU_Caps_Viewer工具查看当前显卡驱动所能支持的OpenGL版本

 

  

 

也可使用OpenGL Extensions Viewer查看当前显卡驱动的OpenGL能力  注:该工具还有Mac OS X、Android和iOS版本

 

OpenGL ES库、显卡和驱动

OpenGL ES版本 Android版本 iOS版本 Android机GPU 苹果机GPU
1.0 Android 1.0(API 1)+      
1.1 Android 1.6(API 4)+      
2.0 Android 2.2(API 8)+ iOS5+(iPad, iPad Mini, iPhone 3GS版本及以上)    
3.0 Android 4.3(API 18)+ iOS7+(iPhone 5S, iPad Air, iPad Mini2版本及以上)

高通:Adreno 300 and 400 series+

ARM:Mali T600 series+

Nvidia:Tegra4

Imagination:PowerVR 6 series+

包括:G6400, G6430, G6200, G6230, G6630

3.1 Android 5.0(API 21)+  

高通:Adreno 400 and 500 series

ARM:Mali T6xx (midgard)+

Imagination:PowerVR 6, 6XE, 6XT, 7XE and 7XT

Nvidia:Tegra K1 and X1

Imagination:PowerVR 6, 6XE, 6XT, 7XE and 7XT

6XE包括:G6050, G6060, G6100, G6110
6XT包括:G6250, G6450, G6650
7XT包括:GT7200, GT7400, GT7600, GT7800, GT7900

3.2 Android 6.0(API 23)+  

高通:Adreno 420 series+

ARM:Mali T760 series+

Imagination:PowerVR 7XT Plus, 8XE, 8XEP, 8XT, 9XE, 9XM...

 

 

几乎所有的Android设备支持OpenGL ES 2.0,大部分的Android设备支持OpenGL ES 3.1。

使用高通GPU的Android机有:小米、oppo、vivo、华为、荣耀    注:soc为高通骁龙Snapdragon          Adreno SDK for OpenGL ES

使用Mali GPU的Android机有:华为、荣耀、oppo、vivo、小米的红米系列   注:华为和荣耀是将Mali GPU集成在麒麟海思的soc上,其他品牌是集成在联发科(MediaTek)的soc上    ARM Mali OpenGL ES SDK for Android

使用PowerVR GPU的Android机有:oppo、vivo中低端机型,华为畅享10e   注:soc为联发科(MediaTek)      powervr-graphics      PowerVR Graphics SDK

Android支持情况占比:https://developer.android.google.cn/about/dashboards/#OpenGL

Android版本与API级别对应关系:https://source.android.com/source/build-numbers#platform-code-names-versions-api-levels-and-ndk-releases

OpenGL ES各版本API说明:https://www.khronos.org/opengles/

 

WebGL

桌面平台浏览器

Chrome:9+版本支持WebGL1.0;56+版本支持WebGL2.0

windows平台下会使用ANGLE(Almost Native Graphics Layer Engine)技术将OpenGL ES转成拥有更好驱动支持的D3D 9.0c或D3D 11(2013.9加入)

可带上–use-gl=desktop参数启动Chrome来关闭ANGLE,强制让其使用OpenGL ES来作为WebGL的渲染器

使用测试页面WebGL Browser Report来看是否已经关闭ANGLE

FireFox:4.0+版本支持WebGL1.0;51+版本支持WebGL2.0

从2013年起,windows平台下也会使用ANGLE(Almost Native Graphics Layer Engine)技术将OpenGL ES转成拥有更好驱动支持的D3D 9.0c或D3D 11

可在about:config页面中将webgl.prefer-native-gl修改为true或webgl.disable-angle设置成false来关闭ANGLE,强制让其使用OpenGL ES来作为WebGL的渲染器t

Safari:6.0+(Mac OS X Lion)、5.1+(Mac OS X Snow Leopard)支持WebGL1.0,8.0之前的版本缺省是关闭的

IE:11支持WebGL1.0,早期的IE版本可使用IEWebGL插件来支持WebGL

Edge:0.95+版本支持WebGL1.0

 

移动平台浏览器

Chrome(Android):25+版本支持WebGL1.0,30之前的版本缺省是关闭的

FireFox(Android):4+版本支持WebGL1.0

Safari(iOS):iOS8下Safari开始支持WebGL1.0

更详细地浏览器支持情况:https://en.wikipedia.org/wiki/WebGL#Support

查询当前浏览器WebGL1.0支持情况:http://webglreport.com/?v=1

查询当前浏览器WebGL2.0支持情况:http://webglreport.com/?v=2

 

webGL示例效果

WebGL Dynamic Cube

Three js

 

参考

跨越OpenGL和D3D的鸿沟(一):开篇

跨越OpenGL和D3D的鸿沟(二):现代OpenGL

跨越opengl和d3d的鸿沟(三):交集?并集?

跨越opengl和d3d的鸿沟(四):完结篇,平台和未来

 

posted on 2020-03-04 23:40  可可西  阅读(3725)  评论(0编辑  收藏  举报

导航