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
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...