OpenGL和OpenGL ES区别

OpenGL(Open Graphics Library)和OpenGL ES(OpenGL for Embedded Systems)都是用于图形渲染的API,但它们的目标平台和设计定位有所不同。

1. 目标平台

  • OpenGL
    主要用于桌面平台(如Windows、macOS、Linux),支持高性能的2D/3D图形渲染,功能全面,适合PC和工作站。

  • OpenGL ES
    专为嵌入式系统和移动设备(如智能手机、平板、游戏主机)设计,是OpenGL的简化版本,注重能效和硬件兼容性。

2. 功能复杂度

  • OpenGL
    支持完整的图形管线功能,包括高级特性(如几何着色器、曲面细分、计算着色器等),适合复杂渲染需求。

  • OpenGL ES
    移除了部分高阶功能(如固定管线、兼容性特性),保留了核心的现代可编程管线(如顶点/片段着色器),更轻量级。

3. API 差异

  • OpenGL
    包含立即模式(已弃用的固定管线)和可编程管线(Shader-based),支持较旧的兼容性上下文。

  • OpenGL ES
    仅支持可编程管线(必须使用着色器),删除了立即模式(如glBegin/glEnd),API更简洁。

立即模式可编程管线
立即模式(Immediate Mode)

特点

  • 固定功能管线:渲染流程由OpenGL内部固定实现,开发者无法自定义渲染细节(如光照、顶点变换等)。

  • 即时提交数据:通过glBegin()glEnd()等函数逐帧提交顶点数据(如位置、颜色、纹理坐标),数据直接传递给GPU,不保留在显存中。

  • 简单易用:适合快速原型开发或初学者。

代码示例

// OpenGL 1.x 的立即模式绘制三角形
glBegin(GL_TRIANGLES);glColor3f(1.0f, 0.0f, 0.0f); // 设置顶点颜色(红色)glVertex3f(0.0f, 1.0f, 0.0f); // 顶点1glColor3f(0.0f, 1.0f, 0.0f); // 绿色glVertex3f(-1.0f, -1.0f, 0.0f); // 顶点2glColor3f(0.0f, 0.0f, 1.0f); // 蓝色glVertex3f(1.0f, -1.0f, 0.0f); // 顶点3
glEnd();

缺点

  1. 性能低下:每帧需重复提交数据,CPU-GPU通信开销大。

  2. 灵活性差:无法自定义着色器,效果受限(如无法实现动态光照、复杂材质)。

  3. 已淘汰:从OpenGL 3.0+和OpenGL ES 2.0开始被移除,仅保留在兼容性上下文中。

可编程管线(Programmable Pipeline)

特点

  • 自定义着色器:开发者需编写顶点着色器(Vertex Shader)和片段着色器(Fragment Shader),完全控制渲染流程。

  • 显存数据缓存:通过顶点缓冲对象(VBO)等机制预存数据到GPU显存,减少数据传输。

  • 高性能:适合复杂场景和移动设备(如OpenGL ES的核心模式)。

代码示例(OpenGL ES 2.0+ / OpenGL 3.0+)

// 1. 创建并绑定VBO(顶点数据预存到GPU)
float vertices[] = { /* 顶点数据 */ };
GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 2. 使用着色器程序
GLuint shaderProgram = createShaderProgram(); // 自定义函数,加载顶点/片段着色器
glUseProgram(shaderProgram);// 3. 设置顶点属性指针
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);// 4. 绘制
glDrawArrays(GL_TRIANGLES, 0, 3);

优势

  1. 高性能:数据预存显存,减少CPU-GPU通信。

  2. 灵活性强:可通过着色器实现复杂效果(如法线贴图、粒子系统)。

  3. 现代标准:OpenGL ES 2.0+和OpenGL 3.0+的强制要求。

关键区别对比
特性立即模式可编程管线
数据提交方式逐帧提交(glBegin/glEnd预存到VBO/VAO
渲染控制固定管线(不可编程)自定义着色器(完全可控)
性能低(CPU频繁干预)高(GPU高效处理)
OpenGL版本支持OpenGL 1.x(兼容性上下文)OpenGL 3.0+ / OpenGL ES 2.0+
移动端支持仅OpenGL ES 1.x(已淘汰)OpenGL ES 2.0+(主流)

4. 着色器用法区别

4.1 语法差异
  • 数据类型

    • OpenGL ES 可能不支持某些高级类型(如 double),而桌面版 GLSL 可能支持。

    • ES 中需要显式指定精度(如 highpmediumplowp),桌面版 GLSL 通常忽略精度修饰符。

  • 内置变量

    • 例如,OpenGL ES 2.0 的片段着色器必须写入 gl_FragColor,而桌面版 OpenGL 可能使用用户定义的输出变量。

    • ES 3.0+ 移除了 gl_FragColor,改用 out 声明自定义输出。

  • 纹理访问

    • OpenGL ES 2.0 不支持非 2D 纹理(如 3D 纹理、立方体贴图需扩展)。

    • 桌面版 OpenGL 支持更复杂的纹理操作(如 textureLod)。

4.2 着色器阶段支持
  • OpenGL

    • 支持全部着色器阶段:顶点、片段、几何、曲面细分、计算着色器。

  • OpenGL ES

    • ES 2.0/3.0:仅支持顶点和片段着色器。

    • ES 3.1+:支持计算着色器(类似 Vulkan 的简化计算管线)。

    • 几何和曲面细分着色器通常不支持(移动 GPU 硬件限制)。

4.3 示例代码对比
顶点着色器(桌面 OpenGL)

glsl

#version 330 core
layout(location = 0) in vec3 aPos;
out vec4 vColor;void main() {gl_Position = vec4(aPos, 1.0);vColor = vec4(aPos, 1.0); // 自由传递自定义变量
}
顶点着色器(OpenGL ES 2.0)

glsl

#version 100 es
attribute vec3 aPos;
varying vec4 vColor;void main() {gl_Position = vec4(aPos, 1.0);vColor = vec4(aPos, 1.0); // 使用 varying 而非 out
}

5. 版本演进

  • OpenGL
    最新版本为OpenGL 4.6(截至2023年),功能持续扩展,但部分功能在移动硬件上不可行。

  • OpenGL ES
    最新版本为OpenGL ES 3.2,专注于移动端优化。常见版本:

    • ES 1.x:固定管线(已淘汰)。

    • ES 2.0:基础可编程管线(无几何着色器)。

    • ES 3.0+:引入计算着色器、实例化渲染等高级特性。

6. 应用场景

  • OpenGL
    桌面游戏、CAD建模、科学可视化等高性能场景。

  • OpenGL ES
    移动端应用(如Android/iOS游戏)、车载系统、嵌入式UI(如智能家居界面)。

 7. 示例(绘制一个三角形

OpenGL(桌面版,使用可编程管线)

现代 OpenGL(3.0+)必须使用 着色器(Shader) + VBO(顶点缓冲对象)

// 顶点数据
float vertices[] = {-0.5f, -0.5f, 0.0f, // 左下0.5f, -0.5f, 0.0f, // 右下0.0f,  0.5f, 0.0f  // 顶部
};// 1. 创建VBO并上传数据
GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 2. 编译着色器(顶点+片段)
const char* vertexShaderSource = "#version 330 core\n""layout (location = 0) in vec3 aPos;\n""void main() { gl_Position = vec4(aPos, 1.0); }";const char* fragmentShaderSource = "#version 330 core\n""out vec4 FragColor;\n""void main() { FragColor = vec4(1.0, 0.5, 0.2, 1.0); }";GLuint shaderProgram = compileShaders(vertexShaderSource, fragmentShaderSource);// 3. 绘制
glUseProgram(shaderProgram);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 3);
OpenGL ES(移动端,ES 2.0+)

OpenGL ES 必须使用着色器,且语法略有不同(如精度修饰符):

// 顶点数据
float vertices[] = {-0.5f, -0.5f, 0.0f, // 左下0.5f, -0.5f, 0.0f, // 右下0.0f,  0.5f, 0.0f  // 顶部
};// 1. 创建VBO(代码与OpenGL相同)
GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 2. 着色器代码(GLSL ES 1.0,需声明精度)
const char* vertexShaderSource = "attribute vec3 aPos;\n""void main() { gl_Position = vec4(aPos, 1.0); }";const char* fragmentShaderSource = "precision mediump float;\n" // OpenGL ES 必须声明精度"void main() { gl_FragColor = vec4(1.0, 0.5, 0.2, 1.0); }";GLuint shaderProgram = compileShaders(vertexShaderSource, fragmentShaderSource);// 3. 绘制(与OpenGL相同)
glUseProgram(shaderProgram);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 3);
关键区别对比
特性OpenGL(桌面)OpenGL ES(移动/嵌入式)
着色器版本#version 330 core(支持高级特性)GLSL ES 1.0/3.0(精简,需声明精度)
顶点属性绑定layout(location=0) in vec3 aPos;attribute vec3 aPos;(ES 2.0)
片段输出out vec4 FragColor;gl_FragColor(ES 2.0)
上下文管理通过glfwCreateWindow等库需要EGL(如Android的EGLSurface
扩展支持支持更多扩展(如几何着色器)仅支持移动硬件相关扩展(如GL_OES_...

8. 兼容性与驱动

  • OpenGL ES是OpenGL的子集,但两者不完全兼容。
    例如:OpenGL ES的着色器语法更严格,部分函数名称不同(如glClearColorf vs glClearColor)。

9. 衍生标准

  • OpenGL ES常与其他API结合使用,如:

    • EGL:用于管理OpenGL ES上下文与原生窗口系统的接口。

    • Vulkan:新一代跨平台API,逐步替代OpenGL/OpenGL ES。

总结

  • OpenGL:功能强大,适合桌面端复杂渲染。

  • OpenGL ES:移动端优化,精简高效,适合资源受限设备。

如果需要开发跨平台应用,可通过工具(如ANGLE)将OpenGL ES代码转换为OpenGL/Direct3D,或在移动端直接使用OpenGL ES。

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

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

相关文章

PyTorch 入门之官方文档学习笔记(一)

目录 1 张量 1)张量的初始化和属性 2)张量操作 3)使用 NumPy 进行桥接 2 torch.autograd 1)背景 2)在 PyTorch 中的使用 3)Autograd 的微分机制 4)计算图原理 5)从计算图中…

King’s LIMS 系统引领汽车检测实验室数字化转型

随着汽车保有量的持续攀升和车龄的增长,消费者对汽车的需求已悄然转变,从最初对外观和性能的追求,逐渐深化为对安全性、可靠性、耐久性、性能与舒适性以及智能化功能的全方位关注。这无疑让汽车检测行业在保障车辆质量、满足市场需求方面肩负…

Neo4j常见语句-merge

merge用法&#xff1a;MERGE 是 Neo4j 中一个强大的操作符&#xff0c;用于确保图中存在特定的节点或关系。它的核心逻辑是&#xff1a;如果目标存在则匹配&#xff0c;不存在则创建 基本语法与逻辑&#xff1a; MERGE <pattern> [ON CREATE <create_clause>] //…

Mem0多级记忆实现机制详解

在人工智能交互场景中,记忆能力是实现个性化服务与智能决策的关键。Mem0 通过设计分层记忆架构,实现了对用户、会话和智能体状态的多级管理。各层级记忆既相互独立存储,又通过精密的关联机制协同运作,确保在不同场景下都能提供精准的上下文支持,显著提升 AI 交互的智能性与…

Python 爬虫入门 Day 5 - 使用 XPath 进行网页解析(lxml + XPath)

Python 第二阶段 - 爬虫入门 &#x1f3af; 今日目标 掌握 XPath 的基本语法使用 lxml.etree 解析 HTML&#xff0c;提取数据与 BeautifulSoup 比较&#xff1a;谁更强&#xff1f; &#x1f4d8; 学习内容详解 ✅ 安装依赖 pip install lxml&#x1f9e9; XPath 简介 XPa…

变幻莫测:CoreData 中 Transformable 类型面面俱到(六)

概述 各位似秃似不秃小码农们都知道&#xff0c;在苹果众多开发平台中 CoreData 无疑是那个最简洁、拥有“官方认证”且最具兼容性的数据库框架。使用它可以让我们非常方便的搭建出 App 所需要的持久存储体系。 不过&#xff0c;大家是否知道在 CoreData 中还存在一个 Transfo…

Vuex(一) —— 集中式的状态管理仓库

目录 Vue组件间通信方式回顾 组件内的状态管理流程组件间通信方式 父组件给子组件传值 (最简单的一种方式)子组件给父组件传值不相关组件之间传值其他常见方式($ref) 简易的状态管理方案 上面组件间通信方式的问题集中式的状态管理方案 Vuex 什么是Vuex?什么情况下使用Vuex?…

操作系统---内存管理上

文章目录 1. 内存的基础知识1.1 什么是内存&#xff0c;有何作用1.2 进程运行的基本原理1.2.1 指令的工作原理1.2.2 逻辑地址 VS 物理地址 1.3 如何实现地址转换&#xff08;逻辑 -> 物理&#xff09;1.3.1 绝对装入1.3.2 可重定位装入&#xff08;静态重定位&#xff09;1.…

医学图像处理期末复习

目录 考试范围第1章 绪论1.1 数字图像处理的概念1.2 数字图像处理的应用领域1、医学领域2、其他领域 1.3 数字图像处理基础1.4 数字图像基础运算 第2章 医学图像灰度变换与空间滤波2.1 医学图像灰度变换线性灰度变换非线性灰度变换 2.2 直方图均衡化√2.3 空间平滑滤波线性空间…

类图:软件世界的“建筑蓝图”

本文来自「大千AI助手」技术实战系列&#xff0c;专注用真话讲技术&#xff0c;拒绝过度包装。 类图&#xff08;Class Diagram&#xff09;&#xff1a;软件世界的“建筑蓝图” 类图&#xff08;Class Diagram&#xff09;是统一建模语言&#xff08;UML&#xff09; 中最重要…

利用DevEco Studio对RK3588的HiHopesOS-4.1.110(OpenHarmony)进行Qt程序编写

文章目录 热身准备添加Qt库运行qml程序 热身 可以先看我这篇文章【DevEco Studio中使用Qt&#xff0c;编写HarmonyOS程序】 准备 板子的主要信息 目前由于系统版本&#xff08;API 11&#xff09;及其他原因&#xff0c;只能用4.1版本的DevEcoStudio来编写&#xff0c;更高…

设计模式精讲 Day 5:原型模式(Prototype Pattern)

【设计模式精讲 Day 5】原型模式&#xff08;Prototype Pattern&#xff09; 文章内容 在“设计模式精讲”系列的第5天&#xff0c;我们将深入讲解原型模式&#xff08;Prototype Pattern&#xff09;。作为创建型设计模式之一&#xff0c;原型模式通过复制已有对象来创建新对…

深度学习——第2章习题2-1分析为什么平方损失函数不适用于分类问题

深度学习——第2章习题2-1 《神经网络与深度学习》——邱锡鹏 2-1 分析为什么平方损失函数不适用于分类问题。 平方损失函数&#xff08;Quadratic Loss Function&#xff09;经常用在预测标签y为实数值的任务中&#xff0c;定义为 L ( y , f ( x ; θ ) ) 1 2 ( y − f (…

【Linux】运行脚本后打屏同时保存到本地

命令&#xff1a; sh run.sh 2>&1 | tee output.log sh run.sh 2>&1 | tee output_$(date "%Y%m%d%H%M").log作用&#xff1a;运行脚本&#xff0c;并同时将输出&#xff08;包括标准输出和错误输出&#xff09;显示到终端&#xff0c;并保存到文件中…

Spark 在小众日常场景中的实战应用:从小店数据到社区活动

Spark 在小众日常场景中的实战应用&#xff1a;从小店数据到社区活动​ 提起 Spark&#xff0c;大家往往会联想到大型互联网公司的数据处理、金融行业的复杂分析。但实际上&#xff0c;Spark 在许多小众、贴近生活的场景中也能大显身手。结合学习与实践&#xff0c;我探索了 S…

mysql 执行计划 explain命令 详解

explain id &#xff1a;select查询的序列号&#xff0c;包含一组数字&#xff0c;表示查询中执行select子句或操作表的顺序select_type&#xff1a;查询类型 或者是 其他操作类型table &#xff1a;正在访问哪个表partitions &#xff1a;匹配的分区type &#xff1a;访问的类…

让大模型“更懂人话”:对齐训练(RLHF DPO)全流程实战解析

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

GO 原子操作面试题及参考答案

Go 的 sync/atomic 包和 sync.Mutex 的根本区别是什么&#xff1f; Go 语言中的 sync/atomic 包和 sync.Mutex 都用于处理并发编程中的同步问题&#xff0c;但它们的实现机制、应用场景和性能特性存在根本差异。理解这些差异对于编写高效、安全的并发代码至关重要。 sync/atomi…

MATLAB 山脊图绘制全解析:从数据生成到可视化进阶

一、引言&#xff1a;当数据分布拥有「层次感」—— 山脊图的魅力​ 在数据可视化的世界里&#xff0c;我们常常需要同时展示多个分布的形态差异。传统的重叠密度图虽然能呈现整体趋势&#xff0c;但当分布数量较多时&#xff0c;曲线交叠会让画面变得杂乱。这时候&#xff0c…

跨境电商每周资讯—6.16-6.20

1. Instagram 在亚太地区逐渐超越 TikTok 在整个亚太地区&#xff0c;Instagram用户数量正逐渐超过TikTok。预计2025年日本Instagram用户数量将增至4440万&#xff0c;印度今年用户数量将增长10%&#xff0c;领跑亚太。与之形成对比的是&#xff0c;TikTok在一些国家增长速度放…