目錄
創(chuàng)新互聯(lián)專注于察隅網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供察隅營銷型網(wǎng)站建設(shè),察隅網(wǎng)站制作、察隅網(wǎng)頁設(shè)計(jì)、察隅網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造察隅網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供察隅網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
零基礎(chǔ) OpenGL ES 學(xué)習(xí)路線推薦 : OpenGL ES 學(xué)習(xí)目錄 >> OpenGL ES 基礎(chǔ)
零基礎(chǔ) OpenGL ES 學(xué)習(xí)路線推薦 : OpenGL ES 學(xué)習(xí)目錄 >> OpenGL ES 特效
零基礎(chǔ) OpenGL ES 學(xué)習(xí)路線推薦 : OpenGL ES 學(xué)習(xí)目錄 >> OpenGL ES 轉(zhuǎn)場
零基礎(chǔ) OpenGL ES 學(xué)習(xí)路線推薦 : OpenGL ES 學(xué)習(xí)目錄 >> OpenGL ES 函數(shù)
零基礎(chǔ) OpenGL ES 學(xué)習(xí)路線推薦 : OpenGL ES 學(xué)習(xí)目錄 >> OpenGL ES GPUImage 使用
零基礎(chǔ) OpenGL ES 學(xué)習(xí)路線推薦 : OpenGL ES 學(xué)習(xí)目錄 >> OpenGL ES GLSL 編程
OpenGL ES 1.x 支持 初代 iPhone 和 Android;
OpenGL ES 2.0 支持 Android 2.2 以后的平臺,支持 iPad , iPhone3GS 和后續(xù)版本,以及 iPodTouch3 代和后續(xù)版本。
OpenGL ES 3.0 支持 Android 4.3 以后的平臺。支持 iPhone 5s ,iPad Air ,iPad mini 2 及后續(xù)版本。
OpenGL ES 3.0 是向下兼容 OpenGL ES 2.0 的。也就是說使用 2.0 編寫的應(yīng)用程序是可以在 3.0 中繼續(xù)使用的。
//頂點(diǎn)著色器
attribute vec4 aPosition; // 應(yīng)用程序傳入頂點(diǎn)著色器的頂點(diǎn)位置
attribute vec2 aTextureCoord; // 應(yīng)用程序傳入頂點(diǎn)著色器的頂點(diǎn)紋理坐標(biāo)
varying vec2 vTextureCoord; // 用于傳遞給片元著色器的頂點(diǎn)紋理數(shù)據(jù)
void main()
{
gl_Position = aPosition; // 此次繪制此頂點(diǎn)位置
vTextureCoord = aTextureCoord; // 將接收的紋理坐標(biāo)傳遞給片元著色器
}
//片元著色器
precision mediump float; // 設(shè)置工作精度
varying vec2 vTextureCoord; // 接收從頂點(diǎn)著色器過來的紋理坐標(biāo)
uniform sampler2D sTexture; // 紋理采樣器,代表一幅紋理
void main()
{
gl_FragColor = texture2D(sTexture, vTextureCoord);// 進(jìn)行紋理采樣
}
//頂點(diǎn)著色器
#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);
}
在 OpenGL ES 3.0 中,頂點(diǎn)著色器和片段著色器的第一行必須聲明著色器版本,否則編譯報(bào)錯:
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 中,可以不用聲明著色器版本,默認(rèn)為:
#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 默認(rèn)為OpenGL2.0)
在頂點(diǎn)語言中有如下預(yù)定義的全局默認(rèn)精度語句:
precision highp float;
precision highp int;
precision lowp sampler2D;
precision lowp samplerCube;
在片元語言中有如下預(yù)定義的全局默認(rèn)精度語句:
precision mediump int;
precision lowp sampler2D;
precision lowp samplerCube;
片元語言沒有默認(rèn)的浮點(diǎn)數(shù)精度修飾符。因此,對于浮點(diǎn)數(shù),浮點(diǎn)數(shù)向量和矩陣變量聲明,要么聲明必須包含一個精度修飾符,要不默認(rèn)的精度修飾符在之前已經(jīng)被聲明過了
precision highp float;
OpenGL ES 3.0 中新增了** in,out,inout **關(guān)鍵字,用來取代 **attribute 和 varying **關(guān)鍵字。
同時 gl_FragColor 和 gl_FragData 也刪除了,片段著色器可以使用 out 聲明字段輸出。
OpenGL ES 3.0 中可以直接使用 layout 對指定位置的變量賦值。例如:
shader腳本中
layout (location = 1) uniform float a;
代碼中,直接寫上對應(yīng)的 layout 的值就可以賦值
GLES30.glUniform1f(1, 1f);
而 OpenGL ES 2.0 中必須使用如下形式賦值:
GLES20.glUniform1f(GLES20.glGetAttribLocation(program, "a"), 1f)
VAO (頂點(diǎn)數(shù)組對象:Vertex Array Object)是指頂點(diǎn)數(shù)組對象,主要用于管理 VBO 或 EBO ,減少 glBindBuffer 、glEnableVertexAttribArray、 glVertexAttribPointer 這些調(diào)用操作,高效地實(shí)現(xiàn)在頂點(diǎn)數(shù)組配置之間切換。
**VBO(頂點(diǎn)緩沖區(qū)對象: Vertex Buffer Object)是指把頂點(diǎn)數(shù)據(jù)保存在顯存中,繪制時直接從顯存中取數(shù)據(jù),減少了數(shù)據(jù)傳輸?shù)拈_銷,**因?yàn)轫旤c(diǎn)數(shù)據(jù)多了,就是坐標(biāo)的數(shù)據(jù)多了很多的很多組,切換的時候很麻煩,就出現(xiàn)了這個 VAO,綁定對應(yīng)的頂點(diǎn)數(shù)據(jù)
OpenGL 2.0 有 VBO,沒有 VAO,VAO 是 OpenGL 3.0 才開始支持的,并且在 OpenGL 3.0 中,強(qiáng)制要求綁定一個 VAO 才能開始繪制。
例如:在 OpenGL 3.0 中,不使用 VAO ,調(diào)用完 glVertexAttribPointer, glGetError 報(bào)錯 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 中,強(qiáng)制要求綁定一個 VAO 才能開始繪制。因此,需要在程序初始化的時候,創(chuàng)建并綁定一個 VAO
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
此外,OpenGL 3.0 中也不允許在 glVertexAttribPointer 直接傳數(shù)組了,因此要把頂點(diǎn)先傳入 vbo 中
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(kVertices), kVertices, GL_STATIC_DRAW);
綁定 VBO 之后,glVertexAttribPointer 后面的 pointer 參數(shù)就要填 0 了。
glVertexAttribPointer(pos_location, 2, GL_FLOAT, GL_FALSE, 0, 0);
OpenGL 2.0 不支持 PBO ,3.0 支持 PBO , PBO 設(shè)計(jì)的目的就是快速地向顯卡傳輸數(shù)據(jù),或者從顯卡讀取數(shù)據(jù),我們可以使用它更加高效的讀取屏幕數(shù)據(jù)。
單個 PBO 讀取屏幕數(shù)據(jù)效率大概和 glReadPixels 差不多,雙 PBO 交換讀取效率會很高。
原因是使用 PBO 時,屏幕上的數(shù)據(jù)不是讀取到內(nèi)存,而是從顯卡讀到 PBO 中,或者如果內(nèi)部機(jī)制是讀取到內(nèi)存中,但這也是由 DMA 控制器來完成的,而不是 cpu 指令來做的,再加上兩個 PBO 交換使用,所以讀取效率很高。
PBO 快速地從內(nèi)存 CPU 向顯卡 GPU 傳輸數(shù)據(jù) —> GL_PIXEL_PACK_BUFFER
**PBO 快速地從顯卡 GPU 讀取數(shù)據(jù)到內(nèi)存 CPU** —> GL_PIXEL_UNPACK_BUFFER
本文由博客 - 猿說編程 猿說編程 發(fā)布!
網(wǎng)頁題目:OpenGL ES 2.0 和 3.0區(qū)別
路徑分享:http://chinadenli.net/article42/dsoiehc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站制作、虛擬主機(jī)、網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)