-
Android N(7.0) Vulkan替代OpenGL,图形学
2019-04-24 19:05:55旨在替代OpenGL,提高图形性能。 基于OpenGL的图形引擎,其渲染过程粗略可分为 主机端资源准备,设备端数据交互与管线准备 及 每帧循环的渲染 三个部分。 Vulkan的最大任务不是竞争DirectX,而是取代OpenGL,所以...Vulkan是一个跨平台的2D和3D绘图应用程序接口(API),最早由科纳斯(Khronos)组织在2015年游戏开发者大会(GDC)上发表。旨在替代OpenGL,提高图形性能。
基于OpenGL的图形引擎,其渲染过程粗略可分为 主机端资源准备,设备端数据交互与管线准备 及 每帧循环的渲染 三个部分。 Vulkan的最大任务不是竞争DirectX,而是取代OpenGL,所以重点要看和后者的对比。
Vulkan在很大程度上汲取了AMD Mantle的灵感,但是进行了大幅度的扩展和增强,构成了一个完善的开发体系,功能和性能都十分丰富,拥有最新图形技术、通用目的计算、预编译着色器、多核心多线程高效率、底层驱动过载、横跨桌面/移动/主机/嵌入式、底层GPU硬件控制、精炼API。Vulkan 是完全从零开始设计,以最小化驱动器中的 CPU 开销,并能让您的应用更直接地控制 GPU 操作。Vulkan 还允许多个线程同时执行工作,如命令缓冲区构建,以获得更好的并行化。
Vulkan支持的操作系统包括:Linux, Windows XP to Windows 10, android等。Vulkan还可以支持主流的GPU,包括:AMD, NVIDIA, Adreno, PowerVR, Mali等桌面GPU和移动GPU。
Vulkan的shading language环境: Vulkan不再使用GLSL作为shading language的输入,而是使用一个统一的中间代码(SPIR)作为输入。OpenGL/OpenGL ES或者游戏引擎使用的GLSL都会被一个SPIR-V解释器翻译成SPIR表示。未来其它的shading language或者通用计算的语言也会被翻译成SPIR作为Vulkan的输入。这可以使Vulkan驱动专注于shader的后端优化,而不是前端的语法解析,语义分析等。对于GLSL转SPIR,Khronos正在考虑实现一个编译器前端来帮助应用程序转换。The Khronos Group ,vulkan 开源集- https://github.com/KhronosGroup
关于Vulkan的详细使用参考这个Demo- https://github.com/SaschaWillems/Vulkan
Vulkan标准参考Khronos官网- https://www.khronos.org/registry/vulkan/specs/1.0/refguide/Vulkan-1.0-web.pdf
OpenGL的替代者 Vulkan- https://blog.csdn.net/coloriy/article/details/79908631OpenGL还算是对初学者比较友好的API,但到了Vulkan,由于严格把pipeline、descriptor、buffer分开,初学者上手难度变大了,App开发者直接调用图形API的情况将会减少,更多地会依赖于图形引擎。因此,Vulkan标准的渐渐普及会加速开发者的层级分划,使用Vulkan的人将是专业研究图形引擎或作GPGPU算法引擎的人。
对于有志于研究图形的初学者,可以直接学习Vulkan,不用去学习OpenGL了,Vulkan标准与GPU工作原理更为贴近,学习 Vulkan更有利于掌握图形显示的知识。 -
OpenGLES中有什么方法可以替代OpenGL的gluOrtho2D方法
2018-08-11 00:06:27opengl中有一行代码: gluOrtho2D(0, windowWidth, 0, windowHeight); 现要移植到android, 通过NDK实现, 好像找不到gluOrtho2D这个API, 据说是GLES上没有这个API, 有什么其它方式替代呢? -
OpenGLES中替代OpenGL的函数
2011-02-26 20:31:00#define KPI 3.1415926 void Perspective(GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); double xmin, xmax, ymin, ymax;... xmi -
OpenGL的替代者——Vulkan
2016-12-20 15:45:30旨在替代OpenGL,提高图形性能。基于OpenGL的图形引擎性能瓶颈基于OpenGL的图形引擎,其渲染过程粗略可分为 主机端资源准备,设备端数据交互与管线准备 及 每帧循环的渲染 三个部分。 资源加载这一过程跟GPU没有OpenGL的替代者——Vulkan
Vulkan是一个跨平台的2D和3D绘图应用程序接口(API),最早由科纳斯(Khronos)组织在2015年游戏开发者大会(GDC)上发表。旨在替代OpenGL,提高图形性能。
基于OpenGL的图形引擎性能瓶颈
基于OpenGL的图形引擎,其渲染过程粗略可分为 主机端资源准备,设备端数据交互与管线准备 及 每帧循环的渲染 三个部分。
资源加载
这一过程跟GPU没有太大关系,主要是为了进行显示之前的图片解码、字体解析、3D模型解析等等。一般可以放到其他线程中执行,避免影响显示。
数据交互与管线准备
这一过程主要是将必要的数据传到GPU可以读到内存中去,以及准备GPU的指令。
1、纹理上传
2、Shader的编译与Program的链接
3、VBO的数据上传每帧的图形渲染
1、数据交互耗时。
这里主要需要设常量区的数据。我们绝大部分情况都是在绘制变化的物体,而变化相关的属性主要体现在常量区,因此每帧渲染都需要重新设一遍常量数据。
2、调用Drawcall耗时。
DrawCall指真正执行绘制任务的图形API,如glDrawArrays, glDrawElements。调用这些API时,GPU驱动需要产生GPU硬件所能识别的任务,并发送到内核,等待调度执行。Vulkan编程
关于Vulkan的详细使用参考这个Demo:
https://github.com/SaschaWillems/VulkanVulkan标准参考Khronos官网:
https://www.khronos.org/registry/vulkan/specs/1.0/refguide/Vulkan-1.0-web.pdf编程流程
基本的Vulkan编程流程:
这个流程和OpenCL的使用流程很像,就是找到设备——创建上下文——创建命令队列——准备任务——发送执行。Vulkan的窗口系统(WSI)(与EGL标准类似):
注意到,在移动设备上使用OpenGL时,我们必须通过egl的API先准备好Surface和Context,而在Vulkan标准里面,WSI只是为Command Buffer 提供了 VkFrameBuffer,这个是图形渲染的输出。Pipeline
创建Command Buffer 的三个重要元素分别为 VkDescriptorSet(纹理和常量)、VkPipeline(着色器和状态)和VkBuffer(顶点数组)。
官网上对Pipeline由下图描述:
以前的GLProgram现在对应于一个VkPipeline,但VkPipeline除了Program之外,还覆盖了 blend,cull face 等状态:
Vulkan中的Shader只支持spv的标准二进制格式,我们所写的glsl都必须通过官方的一个转换器转换为二进制格式。这样做就不需要GPU驱动去做语法解析等编译前端工作了。以前在OpenGL中用的Texture 现在由VkImage描述:
Command Buffer
一个用于图形渲染的 VkCommandBuffer 制作过程如下图:
如图所示,Command Buffer 里面设定了图形渲染所需要的视口、裁剪、管线(各种状态配置和着色器)、顶点数组、描述(纹理、程序常量等)这些属性,之后再发送到命令队列(VkQueue)中就可以执行。Vulkan的优势
效率上的提升
Vulkan在效率上的提升主要是它天然支持多线程:
异步数据交互
使用OpenGL时,如果把数据交互放到另一个独立线程中完成,将会引起冲突,这个原因是上传资源和进行绘制时都需要改变上下文:
用Vulkan则没有这个问题:
并行绘制
由于绘制时要改变上下文,OpenGL的并行绘制无疑也不可能了:
Vulkan可以并行创建Command Buffer,但由于Command Buffer 提交后就都是GPU驱动怎么执行的事了,执行的过程没必要也没可能用多线程加速。
复用Command Buffer
OpenGL 每帧绘制时,都需要在驱动层重新建一个Command Buffer 传递下去,而 Vulkan 是在应用层建好 Command Buffer,每帧绘制时Sub上去。
便于模块化
虽然初看上去Vulkan比OpenGL复杂了许多,需要多写不少代码,但真正到软件开发时,由于Vulkan、OpenGL大部分情况都是用来写引擎,中间件的,维护代码的时间会远大于开发代码的时间,多写那几行代码根本不算啥。
Vulkan更容易封装,各子模块之间互不影响,软件架构设计会轻松不少,开发维护起来更为方便。
而基于OpenGL开发的各子模块之间总有各种各样因为状态机的缘故引发的Bug,比如:
1、A模块用了VBO,B模块没有用,集成在一起时由于B模块没有把GL_ARRAY_BUFFER 重新绑定为0,出现段错误。
2、A模块内部使用了FBO,使用FBO时重新设置了裁剪区域和视口大小,使用完成后没有恢复,导致集成之后,后续的模块绘制出现问题。
如果基于Vulkan开发,上述的状态不一致的问题将会少很多。当然,基于Vulkan开发的引擎一般会用多线程加速,这个也会有不少坑,但为了更好的性能,也是值得的。
Vulkan对开发者的影响
OpenGL还算是对初学者比较友好的API,但到了Vulkan,由于严格把pipeline、descriptor、buffer分开,初学者上手难度变大了,App开发者直接调用图形API的情况将会减少,更多地会依赖于图形引擎。因此,Vulkan标准的渐渐普及会加速开发者的层级分划,使用Vulkan的人将是专业研究图形引擎或作GPGPU算法引擎的人。
对于有志于研究图形的初学者,可以直接学习Vulkan,不用去学习OpenGL了,Vulkan标准与GPU工作原理更为贴近,学习 Vulkan更有利于掌握图形显示的知识。
-
OpenGL
2016-08-13 10:15:36GLUT用于窗口设计,90年代已停止更新,替代品有freeGULT,但是听说freeGULT bug很多,后来出现新的替代品GLFW。 GLUT GLUT(OpenGL Utility Toolkit)封装OpenGL,用于窗口设计。 头文件:#incldue 编译:cc -o ...GLUT用于窗口设计(窗口显示,事件处理),90年代已停止更新,替代品有freeGULT,但是听说freeGULT bug很多,后来出现新的替代品GLFW。
GLEW
GLEW的功能是为程序在运行时动态加载OpenGL API,相当于一个加载工具。
它提供了一种机制,让程序在运行时决定支持哪一种OpenGL扩展。
http://glew.sourceforge.net/
GLX
GLX用来将OpenGL与X Window系统对接。
GLU
GLU(OpenGL Utility Library)封装OpenGL,用于绘图。
GLUT
GLUT(OpenGL Utility Toolkit)封装OpenGL,用于窗口设计。
头文件:#incldue <GL/glut.h>
编译:cc -o foo foo.c -lglut -lGLU -lGL -lXmu -lXi -lXext -lX11 -lm
API:glutXxx,V3大约有90+个API函数。
GLFW
GLFW是GLUT的替代品。
DRI
OpenGL API
设置几何图元:在glBegin()和glEnd()之间调用下面函数。
glVertex*() // 设置顶点坐标
glColor*() // 设置RGBA颜色
glIndex*() // 设置颜色索引
glSecondaryColor*() // 设置纹理应用后的辅助颜色
glNormal*() // 设置发现向量坐标
glMaterial*() // 设置材料属性
glFogCoord*() // 设置雾坐标
glTexCoord*() // 设置纹理坐标
glMultiTexCoord*() // 为多重纹理设置纹理坐标
glVertexAttrib*() // 设置通用的顶点属性
glEdgeFlag*() // 控制边界的绘制
glArrayElement() // 提取顶点数组数据
glEvalCoord*(), glEvalPoint*() // 生成坐标
glCallList(), glCallLists() // 执行显示列表
Capability
glEnable() // 打开指定的Capability
glDisable() // 关闭指定的Capability
glIsEnabled() // 查询Capability是否打开
查询参数
glGetBooleanv() // 查询布尔型变量
glGetIntegerv() // 查询整型变量
glGetFloatv() // 查询单精度浮点型变量
glGetDoublev() // 查询双精度浮点型变量
glGetPointerv() // 查询指针类型状态变量
-
OpenGL中gluLookAt函数的替代矩阵计算
2018-08-01 15:24:24gluLookAt函数原理是生成一个modelview矩阵,之后作用于图形的坐标上,所以可以推导出其等价的矩阵,将此矩阵与当前的modelview矩阵相乘,从而达到替代gluLookAt函数的效果。 参考文章1:... -
gluPerspective and gluLookAt 在OpenGL-ES中的替代
2010-08-16 10:16:00gluPerspective and gluLookAt 在OpenGL-ES中的替代 -
Android Opengl共享context的替代方案(创建多个eglsurface,通过makecurrent进行切换)
2020-11-19 20:16:47在应用的开发过程中,我们避免不了要使用Opengl共享context的技术。比如我们需要在预览的同时还要将预览的画面传递给MediaCodec进行编码。有的朋友会说Camera2可以设置多个surface,这样就可以把预览的surface和... -
开源通用型渲染工具-SwiftShader--OpenGL的替代者
2018-05-31 10:56:00SwiftShader 实现 Chrome 和 Android 使用的相同的 OpenGL ES 图形 API。SwiftShader 开放源码将促使其他浏览器供应商普遍支持 3D 内容,从而使网站平台作为一个整体向前发展。具体而言,无条件的 WebGL 支持将允许... -
OpenGL上的纹理状态跟着纹理ID走
2016-12-17 15:01:45引擎每次设置纹理状态时,都会检查一下状态是否已经是当前值,这样就会减少不必要的api调用.... 发现出了一个叫Vulkan的图形API,替代opengl es的.概念向d3d12看齐,与时俱进的东西.花一些时间学习下. -
OpenGL 2.0
2011-05-09 21:44:59功能性 功能性 新API里的一些特色包括有: ...1.3固定式的替代功能。新的着色器可自动纪录现有的OpenGL状态(例如进行一个简单的光源转换而无须覆写参数管理)。它以C为架构,... -
opengl的坑
2018-11-22 15:32:47opengl窗口、鼠标事件等扩展的发展历程(疑惑于glfw与glut的关系,后面的都可以当做前面的替代品):aux->glut->freeglut->glfw 现代OpenGL已经弃用(从OpenGL 3.0开始)经典管线功能... -
学习opengl(一)opengl 超级宝典 第5版 vs2013+opengl配置
2016-09-30 14:31:06学习资料:opengl 超级宝典 第5版 环境:vs2013 准备:1、freeglut库 http://freeglut.sourceforge.net/index.php#download freeglut用来替代glut的,虽然现在好像glfw更好,但是因为跟着书来所以还是先使用... -
VC6.0配置OpenGL
2015-05-11 20:12:30OpenGL 官网:http://www.opengl.org 个人环境配置: VC6.0 + GLUT3.7 注明:GLUT GLUT是OpenGL应用工具包,英文全称为...作为AUX库的功能更强大的替代品,用于隐藏不同窗口系统API的复杂性。 是一个 -
OpenGL环境搭建2-Windows
2019-08-05 23:21:24freegult -- GLUT的一个完全开源替代库 GLEW -- OpenGL扩展库是个简单的工具,用于帮助C/C++开发者初始化扩展(OpenGL扩展功能)并书写可移植的应用程序。GLEW当前支持各种各样的操作系统,包含Windows,Linux,... -
bindbc-opengl:与OpenGL库兼容的可配置动态D绑定,与-betterC,@ noGC和nothrow兼容-源码
2021-03-06 17:05:01此软件包旨在替代 ,后者不提供相同级别的兼容性。 请注意, bindbc-gl当前不支持不推荐使用的OpenGL功能。 将bindbc-opengl添加到您的项目 默认情况下, bindbc-opengl配置为在禁用-betterC兼容性的情况下进行... -
VS2010配置opengl
2013-03-05 20:13:00OpenGL 官网:http://www.opengl.org 个人环境配置: VS2010+ GLUT3.7 注明:GLUT GLUT是OpenGL应用工具包,英文全称为...作为AUX库的功能更强大的替代品,用于隐藏不同窗口系统API的复杂性。 是一个学习Op -
GLUT(OpenGL工具包)
2017-10-31 18:34:53GLUT代表OpenGL应用工具包,英文全称为OpenGL Utility Toolkit,是一个和窗口系统无关的软件包,它由Mark Kilgard在SGI时写的。作为AUX库的功能更强大的替代品,用于隐藏不同窗口系统API的复杂性。 -
【OpenGL基础篇】——使用面向对象方法封装OpenGL函数(一)
2015-03-20 01:11:33OpenGL是一个开源的图形库,既可开发二维图形软件,也可开发三维图形软件。许多知名应用就是基于OpenGL开发出来,如著名的Artoolkit和Unity3D。...作为AUX库的功能更强大的替代品,用于隐藏不同窗口系统API的复杂 -
OpenGl 中的基本数据类型
2015-12-22 11:01:00如OpenGL也定义 GLvoid类型,如果用C语言编写,可以用它替代void类型。不同的C编译器或环境对各种C变量的大小和内存分布都有自己的规则。使用 OpenGL定义的数据类型就可以隔离开这些不同。 下表列出了W... -
OpenGlDome:OpenGl的使用练习(安卓Java opengl3.0)-源码
2021-03-22 17:24:36要注意纹理单元和纹理的概念,纹理替代绑定纹理单元0 6,影子文件 阴影贴图 两步渲染:1,使用帧长度延伸深度纹理,通过光的角度,取代一遍物体2,画阴影平面,通过光的角度,利用上一次深度纹理,对比平面上点的... -
OpenGL程序 转为Opengl ES 的一点建议glDrawArray和glDrawElements
2008-12-18 10:46:00花了四天的时间, 把一款FPS游戏引擎Fly3D 转到OpenGL ES上, 众所周知, ES是面向移动设备的, 所以,为了效率, 它对OpenGL进行了很多的筛减, 把一些没有效率的函数如(glBegin)全部扔掉了, 一些绘制的类型如GL_POLYGON也... -
VS2013搭建OPENGL环境
2016-12-07 23:00:46它作为AUX库的功能更强的替代品,用于隐藏不同窗口系统API的复杂性。 GLUT的子程序的前缀使用”glut”。 在Windows下安装glut库: 所以首先要下载glut库,可从OpenGL的官网上下载:http://www.op -
OpenGL纹理过滤以及纹理Wrapping mode
2016-05-28 00:02:40为了避免产生抖动或者闪烁,OpenGL必须对纹理图像进行过滤,适当的对它进行缩小,是它在映射到无替代 表面时,不会产生令人不快的人工视觉效果。为了避免这种效果,我们可以指定一系列预先过滤的分辨率递减的问题... -
OpenGL(1)入门简介
2020-06-12 00:53:56OpenGL(一)入门简介 什么是OpenGL OpenGL(Open Graphics Library, 开放式图形库)。我们常用的平时使用的库包括: gl:核心库;...glut: (OpenGL Utility Toolkit)实用工具库,替代(aux);基本的窗口