OpenGL ES 2.0 和 3.0區別

来源:https://www.cnblogs.com/shuopython/archive/2022/09/14/16694957.html
-Advertisement-
Play Games

目錄 一.嵌入式設備的 OpenGL ES 版本 二.相容性 三.著色器腳本 1.OpenGL ES shader 2.0 2.OpenGL ES shader 3.0 3.版本聲明 4. 預設精度修飾符 precision 4.輸入輸出 5.變數賦值 四.關於頂點緩衝區對象 VBO 與頂點數組對象 ...


目錄

零基礎 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 300

uniform 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 名詞解釋(二)

本文由博客 - 猿說編程 猿說編程 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 終於,在漫長的等待下,容器查詢(CSS Container Queries)將在 Chrome 105 版本得到正式的支持! 而目前,我們也能在 Chrome Canary 版本中,或者在 Chrome 93~104 通過開啟 Enable CSS Container Queries 特性搶先體驗。 ...
  • 基於全屏iframe的微前端框架--擎天,解決了iframe UI不同步、URL不同步、數據不共用的難題,並充分發揮了iframe作為頁面容器的優勢,實現了父子應用非同步載入、子應用瞬間切換的能力,從而將微前端項目達到單體應用的體驗。 ...
  • 不知不覺,掘金關註者人數已經超過 1000 人,因此特地做了這個頁面紀念一下,感謝大家關註 🙇‍ ,希望博客園的粉絲也漲漲。後續也將繼續努力,持續輸出一些有價值的文章。本文內容涉及的技術棧為 React + Three.js + Stulus,本文中主要包含的知識點包括:圓錐幾何體 ConeGeo... ...
  • 一、系統架構的演變 1、技術架構發展歷史時間軸 ①單機垂直拆分:應用間進行瞭解耦,系統容錯提高了,也解決了獨立應用發佈的問題,存在單機計算能力瓶頸。 ②集群化負載均衡可有效解決單機情況下併發量不足瓶頸。 ③服務改造架構 雖然系統經過了垂直拆分,但是拆分之後發現有重覆的功能,比如,用戶註冊、發郵件等等 ...
  • 外觀模式(Facade Pattern)隱藏系統的複雜性,並向客戶端提供了一個客戶端可以訪問系統的介面。這種類型的設計模式屬於結構型模式,它向現有的系統添加一個介面,來隱藏系統的複雜性。 ...
  • 什麼是統一建模語言,來看看百科中的介紹統一建模語言(Unified Modeling Language,UML)是一種為面向對象系統的產品進行說明、可視化和編製文檔的一種標準語言,是非專利的第三代建模和規約語言。UML是面向對象設計的建模工具,獨立於任何具體程式設計語言。簡單來說UML就是脫離於具體 ...
  • 在日常生產生活中,我們常說,“安全第一”、“安全無小事”。圍繞著安全問題,在各行各業都有對各類常見安全問題的解決方案和突發安全問題的應急預案。在互聯網、軟體開發領域,我們日常工作中對各類常見的安全問題又有哪些常見的解決方案呢?在此,結合經典架構圖做一個梳理。 ...
  • Django_render 模板語法 模板引擎是一種可以讓開發者把服務端數據填充到html網頁中完成渲染效果的技術。它實現了把前端代碼和服務端代碼分離的作用,讓項目中的業務邏輯代碼和數據表現代碼分離,讓前端開發者和服務端開發者可以更好的完成協同開發。 靜態網頁:頁面上的數據都是寫死的,萬年不變 動態 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...