penGL ES 2.0 和 3.0区别

目录

  • 一.嵌入式设备的 OpenGL ES 版本
  • 二.兼容性
  • 三.着色器脚本
    • 1.OpenGL ES shader 2.0
    • 2.OpenGL ES shader 3.0
    • 3.版本声明
    • 4. 默认精度修饰符 precision
    • 4.输入输出
    • 5.变量赋值
  • 四.关于顶点缓冲区对象 VBO 与顶点数组对象 VAO
  • 五.PBO
  • 六.猜你喜欢

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 转场

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 函数

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES GPUImage 使用

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES GLSL 编程

一.嵌入式设备的 OpenGL ES 版本

OpenGL ES 1.x 支持 初代 iPhone 和 Android;

OpenGL ES 2.0 支持 Android 2.2 以后的平台,支持 iPad , iPhone3GS 和后续版本,以及 iPodTouch3 代和后续版本。

OpenGL ES 3.0 支持 Android 4.3 以后的平台。支持 iPhone 5s ,iPad Air ,iPad mini 2 及后续版本。

二.兼容性

OpenGL ES 3.0 是向下兼容 OpenGL ES 2.0 的。也就是说使用 2.0 编写的应用程序是可以在 3.0 中继续使用的。

三.着色器脚本

1.OpenGL ES shader 2.0

//顶点着色器
attribute vec4 aPosition;                            // 应用程序传入顶点着色器的顶点位置
attribute vec2 aTextureCoord;                        // 应用程序传入顶点着色器的顶点纹理坐标varying vec2 vTextureCoord;                          // 用于传递给片元着色器的顶点纹理数据
void main()
{gl_Position = aPosition;                         // 此次绘制此顶点位置vTextureCoord = aTextureCoord;                   // 将接收的纹理坐标传递给片元着色器
}//片元着色器
precision mediump float;                           // 设置工作精度varying vec2 vTextureCoord;                        // 接收从顶点着色器过来的纹理坐标
uniform sampler2D sTexture;                        // 纹理采样器,代表一幅纹理
void main()
{gl_FragColor = texture2D(sTexture, vTextureCoord);// 进行纹理采样
}

2.OpenGL ES shader 3.0

//顶点着色器
#version es 300uniform mat4 u_matViewProj;
layout(location = 0) in vec4 a_position;
layout(location = 1) in vec3 a_color;
out vec3 v_color;void main() {gl_Position = u_matViewProj * a_position;v_color = a_color;
}//片元着色器
#version es 300
precision mediump float;in vec3 v_color; // input form vertex shader
layout(location = 0) out vec4 o_fragColor;void main() {o_fragColor = vec4(v_color, 1.0);
}

3.版本声明

在 OpenGL ES 3.0 中,顶点着色器和片段着色器的第一行必须声明着色器版本,否则编译报错:

ERROR: 0:1: '' : syntax error: #version directive must occur in a shader before anything

在 OpenGL ES 3.0 中,可以必须声明着色器版本:

#version es 300

在 OpenGL ES 2.0 中,可以不用声明着色器版本,默认为:

#version es 100

备注: 以往 2.0 刚刚出来可编程的图形管线,所以版本声明为 #version 100 es ,后来为了使版本号相匹配,OpenGL ES 3.0 的 shader 版本直接从 1.0 跳到了 3.0 。

#version 300 es 指定使用OpenGL3.0
#version 100 es 指定使用OpenGL2.0 (不指定version 默认为OpenGL2.0)

4. 默认精度修饰符 precision

在顶点语言中有如下预定义的全局默认精度语句:

precision highp float;
precision highp int;
precision lowp sampler2D;
precision lowp samplerCube;

在片元语言中有如下预定义的全局默认精度语句:

precision mediump int;
precision lowp sampler2D;
precision lowp samplerCube;

**片元语言没有默认的浮点数精度修饰符。**因此,对于浮点数,浮点数向量和矩阵变量声明,要么声明必须包含一个精度修饰符,要不默认的精度修饰符在之前已经被声明过了

precision highp float;

4.输入输出

OpenGL ES 3.0 中新增了** in,out,inout **关键字,用来取代 **attribute 和 varying **关键字。

同时 gl_FragColorgl_FragData 也删除了,片段着色器可以使用 out 声明字段输出。

5.变量赋值

OpenGL ES 3.0 中可以直接使用 layout 对指定位置的变量赋值。例如:

shader脚本中
layout (location = 1) uniform float a;

代码中,直接写上对应的 layout 的值就可以赋值

GLES30.glUniform1f(1, 1f);

而 OpenGL ES 2.0 中必须使用如下形式赋值:

GLES20.glUniform1f(GLES20.glGetAttribLocation(program, "a"), 1f)

四.关于顶点缓冲区对象 VBO 与顶点数组对象 VAO

VAO (顶点数组对象:Vertex Array Object)是指顶点数组对象,主要用于管理 VBO 或 EBO ,减少 glBindBuffer 、glEnableVertexAttribArray、 glVertexAttribPointer 这些调用操作,高效地实现在顶点数组配置之间切换。

**VBO(顶点缓冲区对象: Vertex Buffer Object)是指把顶点数据保存在显存中,绘制时直接从显存中取数据,减少了数据传输的开销,**因为顶点数据多了,就是坐标的数据多了很多的很多组,切换的时候很麻烦,就出现了这个 VAO,绑定对应的顶点数据

OpenGL 2.0 有 VBO,没有 VAO,VAO 是 OpenGL 3.0 才开始支持的,并且在 OpenGL 3.0 中,强制要求绑定一个 VAO 才能开始绘制。

例如:在 OpenGL 3.0 中,不使用 VAO ,调用完 glVertexAttribPointer, glGetError 报错 GL_INVALID_OPERATION。

int pos_location = glGetAttribLocation(ProgramId, "position");
glVertexAttribPointer(pos_location, 2, GL_FLOAT, GL_FALSE, 0, kVertices);

查看 OpenGL 官方文档 http://docs.gl/gl3/glVertexAttribPointer

GL_INVALID_OPERATION is generated in the core context if there is no Vertex Array Object bound

在 OpenGL 3.0 中,强制要求绑定一个 VAO 才能开始绘制。因此,需要在程序初始化的时候,创建并绑定一个 VAO

GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

此外,OpenGL 3.0 中也不允许在 glVertexAttribPointer 直接传数组了,因此要把顶点先传入 vbo 中

GLuint vbo;
glGenBuffers(1, &vbo);glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(kVertices), kVertices, GL_STATIC_DRAW);

绑定 VBO 之后,glVertexAttribPointer 后面的 pointer 参数就要填 0 了。

glVertexAttribPointer(pos_location, 2, GL_FLOAT, GL_FALSE, 0, 0);

五.PBO

OpenGL 2.0 不支持 PBO ,3.0 支持 PBO , PBO 设计的目的就是快速地向显卡传输数据,或者从显卡读取数据,我们可以使用它更加高效的读取屏幕数据。

单个 PBO 读取屏幕数据效率大概和 glReadPixels 差不多,双 PBO 交换读取效率会很高。

原因是使用 PBO 时,屏幕上的数据不是读取到内存,而是从显卡读到 PBO 中,或者如果内部机制是读取到内存中,但这也是由 DMA 控制器来完成的,而不是 cpu 指令来做的,再加上两个 PBO 交换使用,所以读取效率很高。

PBO 快速地从内存 CPU 向显卡 GPU 传输数据 —> GL_PIXEL_PACK_BUFFER

**PBO 快速地从显卡 GPU 读取数据到内存 CPU** —> GL_PIXEL_UNPACK_BUFFER

六.猜你喜欢

  1. OpenGL ES 简介
  2. OpenGL ES 版本介绍
  3. OpenGL ES 2.0 和 3.0 区别
  4. OpenGL ES 名词解释(一)
  5. OpenGL ES 名词解释(二)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/524232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

setGeometry: Unable to set geometry 493x379+674+326 (frame: 517x443+662+274) on QWidgetWindow/“Dialo

qt编译的过程中出现问题:setGeometry: Unable to set geometry 493x379674326 (frame: 517x443662274) on QWidgetWindow/“DialogWindow” on “\.\DISPLAY1”. Resulting geometry: 555x452674326 (frame: 579x516662274) margins: 12, 52, 12, 12 minimum size: …

使用thymeleaf的时候报元素类型“meta“必须由匹配的结束标记

使用thymeleaf的时候报元素类型"meta"必须由匹配的结束标记""终止> 解决方案有二种&#xff1a; 第一种&#xff1a; 让html的标记严格严谨的语法&#xff1a; 加上结束标签第一种&#xff1a;&#xff1a;修改thymeleaf版本 <thymeleaf.version…

漫话:如何给女朋友解释什么是系统可用性? | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;转自&#xff1a;漫话编程在一个阳光明媚的周二下午&#xff0c;我正在公司里面看着即…

基于websocket的简单通信

首次接触websocket通信协议&#xff0c;不足之处希望指出一起进步。 简述 websocket是基于tcp协议的一种网络通信协议&#xff0c;分为客户端和服务端&#xff0c;可以实现客户端与服务端的双向通信。 与tcp的不同之处是&#xff1a; 1.客户端与服务端只需要一次握手协议&…

第七篇:Spring Boot整合Thymeleaf_入门试炼02

Thymeleaf 语法详解&#xff1a; 变量输出与字符串操作 变量输出与字符串操作th:text在页面中输出值 变量输出与字符串操作th:value可以将一个值放入到input标签的value中 判断内容是否为空 thymeleaf内置对象 注意语法&#xff1a; 1.调用内置对象要用#2.大部分的内置对…

OpenGL ES 名词解释(一)

目录 一.前言二.OpenGL ES 上下文三.OpenGL ES 状态机四.缓存五.渲染六.纹理七.光栅化 Rasterization八.片元着色器九.顶点着色器十.着⾊语言 GLSL十一.着色器使用流程十二.着色器的渲染流程十三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenG…

大龄程序员失业后,看他们是如何破局突围的? | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;逆流的鱼yuiop转自&#xff1a;何俊林王小波在《黄金时代》里写道&am…

qt日志

在程序的运行过程中&#xff0c;debug版的可以调试&#xff0c;查看输出信息&#xff0c;release版的程序在运行过程中一旦出现崩溃等问题&#xff0c;使得无法查看问题发生的点&#xff0c;于是在项目中添加日志&#xff0c;变得极为重要。 此日志可以在程序debug版的时候&…

分布式架构系列: 负载均衡技术详解 | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;ITFLY8转自&#xff1a;架构师技术联盟面对大量用户访问、高并发请求…

第七篇:Spring Boot整合Thymeleaf_入门试炼03

基本语法实战案例01 在ThymeleafController中添加此方法 RequestMapping("/show5")public String showInfo5(Model model) {model.addAttribute("msg", "Thymeleaf 第一个案例");model.addAttribute("key", new Date());return &quo…

Qt下自适应分辨率

qt下自适应分辨率应该有两种方法&#xff1a;通过栅格布局&#xff1b;通过缩放比。 本人采用的是缩放比来适应不同的分辨率。首先定义一个类实现屏幕分辨率和长宽缩放比的获取&#xff0c;由于该类可能被多个ui界面使用&#xff0c;所以定义为一个单例模式。代码如下&#xff…

OpenGL ES EGL 简介

目录 一.EGL 简介二.EGL 跨平台之 ANGLE 1.ANGLE 支持跨平台2.ANGLE 支持渲染器3.ANGLE 下载地址 三.EGL 坐标系四.EGL 绘图步骤五.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录…

第八篇:Spring Boot整合Thymeleaf_入门试炼04

继承parent父工程&#xff0c;新建一个子项目&#xff0c;名称为spring-boot-chapter-8 1、引入 thymeleaf 模板依赖 <!-- 引入 thymeleaf 模板依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…

华为发布基于第二代英特尔®至强®可扩展处理器家族的新一代服务器

2019年4月4日&#xff0c;在主题为“智能&#xff0c;计算进化”的发布会上&#xff0c;华为正式发布了基于第二代英特尔 至强 可扩展处理器以及支持英特尔傲腾 ™ 数据中心级持久内存的新一代FusionServerPro智能服务器&#xff0c;包括2路、4路机架式服务器&#xff0c;高密X…

qt样式表中背景图片的使用

使用样式表的设置背景的时候需要注意&#xff1a; background-image:url(); 设置的背景图片不会缩放拉伸&#xff0c;图片多大就展示多大&#xff0c;若控件比图片大&#xff0c;再没有设置图片填充方式的情况下则会出现重复添加图片&#xff0c;即用多个同样的图片来填充控件。…

java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä'

java.sql.SQLException: The server time zone value ‘’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you w…

qt使用样式表来设置不规则按钮

参考代码如下&#xff1a; pixmap.load(":/new/prefix1/淳中切图/未选中-3.png");pixmap pixmap.scaled(QSize(125 / m_percentW,30 / m_percentH),Qt::KeepAspectRatio);m_sceneBtnGroup->setFixedSize(pixmap.size());bit pixmap.mask();m_sceneBtnGroup->…

第九篇:Spring Boot整合Spring Data JPA_入门试炼01

Spring Data JPA:介绍&#xff1a; Spring Data就是spring提供操作数据库的框架&#xff0c;而Spring Data JPA只是Spring Data框架下的一个基于JPA标准操作数据库的模块。 Spring Data JPA&#xff1a;基于JPA的标准对数据进行操作。简化持久层的代码&#xff0c;只需要写接口…

华为智能计算发布FusionServer Pro智能服务器

【中国&#xff0c;北京&#xff0c;2019年4月3日】华为智能计算业务部在北京召开了主题为“智能&#xff0c;计算进化”的发布会&#xff0c;正式发布FusionServer Pro智能服务器。将从“智能加速、智能管理、智能数据中心”三个层次助力数据中心智能化升级。 世界正从数字化…

qt场景中视图QGraphicsView的缩放

继承QGraphicsView自定义视图,重写wheelevent&#xff08;)事件&#xff0c;在滚轮事件中实现视图的放大和缩小。 放大缩小的主要代码&#xff1a; void GraphicsView::wheelEvent(QWheelEvent *e) {if(!m_isScroll){return ;}if (e->modifiers() & Qt::ControlModifie…