关于OpenGL 3.0/4.0

关于OpenGL 3.0/4.0

SIGGRAPH2007过去了。BOF放出来一些ppt也有段时间了。只是最近一直在玩游戏.没来的及琢磨些什么.
难得晚上不知从哪里来的雅兴.又想罗嗦几句了。
以下据说是会支持的东西:
1.API风格向DX10靠拢了。意味着需要切换的习惯和风格小了。需要区分的也少了。
2:各种渲染状态据说也跟D10一样分成多个StateObject了。还区分Mutable和非matable的了。
3:VBO更好用了。准确说是没有VBO了。统一了VertexBuffer标准了。
4:加入了glFX.据说是NVIDIA提交的CgFX.
5:Shader统一了格式.似乎更好看了。
6:GS啊.Multi-RenderTarget(Array?)啊,ConstantBuffer啊都可以用了。
7:没想好.

好处:
1.等到9月底Spec出来,大概Driver也就快有盼头了.
2.能在XP系统体会D10硬件了。
3:写个GLbased的渲染器更容易了。
4:跟D10的区别小了.支持双API更简单了。
坏处:
代码要重写了。
OpenGL似乎变成CloseGL了。或者说CloseNGL.

OpenGL ES 3.0 英文版 第1章——OpenGL ES 3.0简介   第1章简单介绍OpenGL ES,概述了OpenGL ES 3.0图形管线,讨论了OpenGL ES 3.0的设计理念和限制,最后介绍了OpenGL ES 3.0中使用的一些约定和类型。   第2章——你好,三角形:一个OpenGL ES 3.0示例   第2章介绍绘制三角形的一个简单OpenGL ES 3.0示例。我们的目的是说明OpenGL ES 3.0程序的样子,向读者介绍一些API概念,并说明如何构建和运行OpenGL ES 3.0示例程序。   第3章——EGL简介   第3章介绍EGL——为OpenGL ES 3.0创建表面和渲染上下文的API。我们说明与原生窗口系统通信、选择配置和创建EGL渲染上下文及表面的方法,传授足够多的EGL知识,你可以了解到启动OpenGL ES 3.0进行渲染所需的所有知识。   第4章——着色器和程序   着色器对象和程序对象是OpenGL ES 3.0中最基本的对象。第4章介绍创建着色器对象、编译着色器和检查编译错误的方法。这一章还说明如何创建程序对象、将着色器对象连接到程序对象以及链接最终程序对象的方法。我们讨论如何查询程序对象的信息以及加载统一变量(uniform)的方法。此外,你将学习有关源着色器和程序二进制代码之间的差别以及它们的使用方法。   第5章——OpenGL ES着色语言   第5章介绍编写着色器所需的着色语言的基础知识。这些着色语言基础知识包括变量和类型、构造器、结构、数组、统一变量、统一变量块(uniform block)和输入/输变量。该章还描述着色语言的某些更细微的部分,例如精度限定符和不变性。   第6章——顶点属性、顶点数组和缓冲区对象   从第6章开始(到第11章为止),我们将详细介绍管线,教授设置和编程图形管线各个部分的方法。这一旅程从介绍几何形状输入图形管线的方法开始,包含了对顶点属性、顶点数组和缓冲区对象的讨论。   第7章——图元装配和光栅化   在前一章讨论几何形状输入图形管线的方法之后,第7章将讨论几何形状如何装配成图元,介绍OpenGL ES 3.0中所有可用的图元类型,包括点精灵、直线、三角形、三角形条带和三角扇形。此外,我们还说明了在顶点上进行坐标变换的方法,并简单介绍了OpenGL ES 3.0管线的光栅化阶段。   第8章——顶点着色器   我们所介绍的管线的下一部分是顶点着色器。第8章概述了顶点着色器如何融入管线以及OpenGL ES 着色语言中可用于顶点着色器的特殊变量,介绍了多个顶点着色器的示例,包括逐像素照明和蒙皮(skinning)。我们还给了用顶点着色器实现OpenGL ES 1.0(和1.1)固定功能管线的示例。   第9章——纹理   第9章开始介绍片段着色器,描述OpenGL ES 3.0中所有可用的纹理功能。该章提供了创建纹理、加载纹理数据以及纹理渲染的细节,描述了纹理包装模式、纹理过滤、纹理格式、压缩纹理、采样器对象、不可变纹理、像素解包缓冲区对象和Mip贴图。该章介绍了OpenGL ES 3.0支持的所有纹理类型:2D纹理、立方图、2D纹理数组和3D纹理。   第10章——片段着色器   第9章的重点是如何在片段着色器中使用纹理,第10章介绍编写片段着色器所需知道的其他知识。该章概述了片段着色器和所有可用的特殊内建变量,还演示了用片段着色器实现OpenGL ES 1.1中所有固定功能技术的方法。多重纹理、雾化、Alpha测试和用户裁剪平面的例子都使用片段着色器实现。   第11章——片段操作   第11章讨论可以适用于整个帧缓冲区或者在OpenGL ES 3.0片段管线中执行片段着色器后适用于单个片段的操作。这些操作包括剪裁测试、模板测试、深度测试、多重采样、混合和抖动。本章介绍OpenGL ES 3.0图形管线的最后阶段。   第12章——帧缓冲区对象   第12章讨论使用帧缓冲区对象渲染屏幕外表面。帧缓冲区对象有多种用法,最常见的是渲染到一个纹理。本章提供API帧缓冲区对象部分的完整概述。理解帧缓冲区对象对于实现许多高级特效(如反射、阴影贴图和后处理)至关重要。   第13章——同步对象和栅栏   第13章概述同步对象和栅栏,它们是在OpenGL ES 3.0主机应用和GPU执行中同步的有效图元。我们讨论同步对象和栅栏的使用方法,并以一个示例作为结束。   第14章——OpenGL ES 3.0高级编程   第14章是核心章节,将本书介绍的许多主题串联在一起。我们已经选择了高级渲染技术的一个样本,并展示了实现这些功能的示例。该章包含使用法线贴图的逐像素照明、环境贴图、粒子系统、图像后处理、程序纹理、阴影贴图、地形渲染
<think>我们正在比较OpenGL ES 3.0OpenGL 3.x(这里我们以OpenGL 3.3为例,因为3.x系列中3.3是较有代表性的版本)之间的区别。OpenGL ES是OpenGL的子集,专为嵌入式设备(如手机、平板)设计,而OpenGL 3.x是桌面版。 主要区别: 1. 目标平台:OpenGL ES 3.0用于移动设备,OpenGL 3.x用于桌面。 2. 功能集:OpenGL ES是OpenGL的简化版本,去掉了一些复杂功能以适应移动设备的性能限制。 3. 可编程管线:两者都支持可编程管线(顶点着色器和片段着色器),但支持的GLSL版本和特性不同。 具体功能差异: 一、核心功能差异 - **OpenGL ES 3.0**: - 基于OpenGL 3.3的简化,但移除了许多非必要特性。 - 支持GLSL ES 3.00(类似于GLSL 3.30的精简版)。 - 引入新特性:实例渲染(instanced rendering)、多个渲染目标(MRT)、统一变量缓冲区(UBO)、变换反馈(transform feedback)等[^1][^2]。 - 纹理支持:支持ETC2/EAC纹理压缩(移动设备常用),支持3D纹理和浮点纹理(部分支持)[^1]。 - **OpenGL 3.x**(以3.3为例): - 支持完整的GLSL 3.30。 - 包含更多高级特性:几何着色器(geometry shader)、纹理数组(texture arrays)、帧缓冲对象(FBO)的完整功能、查询对象(query objects)等。 - 支持固定管线兼容模式(在兼容性配置文件中),而OpenGL ES 3.0完全移除了固定管线。 二、渲染管线差异 - **顶点处理**: - OpenGL ES 3.0:顶点着色器必须使用GLSL ES 3.00,不支持几何着色器和曲面细分着色器。 - OpenGL 3.3:支持几何着色器(可选),但不支持曲面细分(曲面细分在OpenGL 4.0引入)[^4]。 - **片段处理**: - OpenGL ES 3.0:片段着色器支持MRT(多渲染目标),但不支持显式的深度缓冲区写入控制(如gl_FragDepth的写入在部分设备上有限制)。 - OpenGL 3.3:片段着色器功能更强大,支持深度值的自由写入。 三、内存与缓冲区 - **OpenGL ES 3.0**: - 引入统一变量缓冲区(UBO)来高效传递着色器参数,支持像素缓冲对象(PBO)用于异步数据传输[^1]。 - 缓冲区映射:支持`glMapBufferRange`,但功能有限(例如,可能不支持持久映射)。 - **OpenGL 3.3**: - 支持更灵活的缓冲区映射(如`glMapBuffer`和`glMapBufferRange`),并支持纹理缓冲区对象(TBO)。 四、纹理与帧缓冲 - **OpenGL ES 3.0**: - 帧缓冲:支持多个颜色附件(MRT),但不支持分层渲染(layered rendering)和多重采样渲染缓冲(部分支持)[^1]。 - 纹理:支持2D纹理、立方体贴图、2D纹理数组,但不支持3D纹理的完整功能(部分设备可能支持)。 - **OpenGL 3.3**: - 帧缓冲:支持完整的FBO功能,包括多重采样和自定义附件(如整数纹理)。 - 纹理:支持1D、2D、3D纹理,纹理数组,并支持更多的内部格式。 五、其他差异 - **精度处理**: - OpenGL ES 3.0:要求显式指定着色器变量的精度(如`highp`, `mediump`, `lowp`),以适应移动GPU的架构[^3]。 - OpenGL 3.3:没有精度限定符,默认使用32位浮点。 - **扩展机制**: - OpenGL ES 3.0:依赖扩展来提供额外功能(如ASTC纹理压缩)。 - OpenGL 3.3:有更丰富的扩展,但核心功能已经较强。 六、性能与优化 - OpenGL ES 3.0:针对移动设备优化,功耗和性能平衡,但功能受限。 - OpenGL 3.3:面向桌面,功能强大,但驱动开销可能较大。 总结表: | 特性 | OpenGL ES 3.0 | OpenGL 3.3 (桌面) | |---------------------|-----------------------------------|----------------------------------| | **目标平台** | 移动设备 | 桌面设备 | | **GLSL版本** | GLSL ES 3.00 | GLSL 3.30 | | **着色器阶段** | 顶点、片段 | 顶点、几何、片段(无曲面细分) | | **固定管线支持** | 完全移除 | 兼容性配置文件支持 | | **纹理压缩** | ETC2/EAC(必需) | 无强制压缩格式 | | **实例渲染** | 支持 | 支持 | | **变换反馈** | 支持(ES 3.0可选) | 支持 | | **统一变量缓冲区** | 支持(UBO) | 支持 | | **多渲染目标** | 支持(最大4) | 支持(数量更多) | | **精度限定符** | 必需(highp/mediump/lowp) | 不需要 | 注意:OpenGL ES 3.0OpenGL 3.3是同时代的技术(都发布于2008-2010年),但设计目标不同。OpenGL ES 3.0在移动设备上广泛应用,而OpenGL 3.3是桌面游戏的主流版本之一。 相关问题: 1. OpenGL ES 3.0在移动设备上的性能优化有哪些关键点? 2. 如何将桌面OpenGL 3.3的代码移植到OpenGL ES 3.03. OpenGL ES 3.0与Vulkan在移动设备上的性能对比如何?</think>### OpenGL ES 3.0OpenGL 3.x 功能差异比较 OpenGL ES(嵌入式系统版)是 OpenGL 的移动设备优化版本,两者在架构设计、功能特性和适用场景上存在显著差异。以下是 OpenGL ES 3.0OpenGL 3.x(以代表性的 3.3 版本为例)的核心对比: --- #### 1. **架构与目标平台** | **特性** | **OpenGL ES 3.0** | **OpenGL 3.3** | |-------------------|-----------------------------------------------|---------------------------------------------| | **目标设备** | 移动端/嵌入式设备(Android, iOS) | 桌面端(PC, 工作站) | | **管线设计** | 精简的可编程管线,移除固定功能管线[^2] | 保留兼容模式(支持固定管线),但核心模式强制可编程化 | | **驱动开销** | 针对移动 GPU 优化,功耗敏感型设计[^1] | 面向高性能桌面 GPU,允许更高驱动开销 | | **标准制定** | Khronos Group 专为移动设备定制 | Khronos Group 桌面标准 | --- #### 2. **关键功能差异** ##### (1) **着色器与 GLSL** - **OpenGL ES 3.0**: - GLSL ES 3.00 语言(OpenGL 3.3 GLSL 的子集) - **强制精度限定符**:必须声明变量精度(`highp`, `mediump`, `lowp`),例如: ```glsl uniform mediump sampler2D u_Texture; // 纹理采样精度声明 ``` - 不支持几何着色器(Geometry Shader)和曲面细分[^4] - **OpenGL 3.3**: - GLSL 3.30 语言,无强制精度要求 - 支持几何着色器(可生成新几何体) - 完整表达式支持,例如矩阵变换: $$ \mathbf{M} = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix} \cdot \mathbf{v} $$ ##### (2) **缓冲区与内存管理** | **功能** | **OpenGL ES 3.0** | **OpenGL 3.3** | |-------------------------|-----------------------------------------------|---------------------------------------------| | **统一缓冲区 (UBO)** | 支持,优化着色器参数传递[^1] | 支持 | | **变换反馈** | 支持(捕获着色器输) | 支持 | | **实例渲染** | 支持(`gl_InstanceID`) | 支持 | | **像素缓冲对象 (PBO)** | 支持,异步数据传输[^1] | 支持 | | **纹理缓冲区对象 (TBO)**| ❌ 不支持 | ✅ 支持 | ##### (3) **纹理与渲染** - **OpenGL ES 3.0**: - 强制支持 ETC2/EAC 纹理压缩(移动端省内存方案) - 多渲染目标(MRT)支持最多 4 个颜色附件 - 遮挡查询(Occlusion Query)简化版 - **OpenGL 3.3**: - 支持更丰富的纹理格式(如 1D/3D 纹理数组) - 帧缓冲对象(FBO)功能更完整(如分层渲染) - 完整的查询对象(Query Objects)支持性能分析 --- #### 3. **渲染管线对比 ```mermaid graph LR A[顶点数据] --> B[顶点着色器] B --> C[图元装配] C --> D{OpenGL ES 3.0} D --> E[片段着色器] D --> F[变换反馈] C --> G{OpenGL 3.3} G --> H[几何着色器] G --> I[曲面细分控制] H --> E I --> E E --> J[帧缓冲输] ``` > *说明:OpenGL 3.3 支持几何着色器和曲面细分(虚线部分),而 ES 3.0 仅保留基础管线[^2][^4]* --- #### 4. **性能与开发差异** | **维度** | **OpenGL ES 3.0** | **OpenGL 3.3** | |------------------|-----------------------------------------------|---------------------------------------------| | **开发复杂度** | 更简单,API 精简(约 300 个函数) | 较复杂(约 500+ 函数),兼容遗留功能 | | **内存效率** | 优化移动端内存带宽(如 PBO 减少拷贝)[^1] | 面向大显存设备,允许更高内存占用 | | **典型应用** | 移动游戏(如 Unity/Unreal 移动渲染路径) | 桌面游戏(如《Minecraft》Java 版) | --- #### 5. **总结** - **OpenGL ES 3.0** 是移动端专属的**精简高效版本**,强调: - 强制精度控制适应移动 GPU 架构 - 纹理压缩降低内存占用 - 移除几何着色器等桌面特性 - **OpenGL 3.3** 是桌面端**功能更完整的版本**,提供: - 几何着色器/纹理数组等高级特性 - 无精度限制的 GLSL - 更灵活的帧缓冲操作 > 迁移提示:从 OpenGL 3.3 移植到 ES 3.0 需注意**移除几何着色器**、**添加精度限定符**、**替换纹理格式**(如 ETC2 替代 S3TC)[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值