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
英文地址,請注明出處:http://en.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在一些國家增長速度放…