Opengl是一種跨平台的編程語言。可以對圖形硬件設備訪問的軟件庫,顯卡基本都支持OpenGL,可能有些版本的不同。OpenglES是針對移動設備,手機遊戲機等。OpenglES可以用于繪制3D圖形,提高渲染效率,圖像的處理。
OpenGL ES與OpenGL相比,需要考慮下面幾個因素:
(1)OpenGL API規模龐大且複雜,OpenGL ES工作組的目标是創建适合于受限設備的API,為了實現這一目标,工作組從OpenGL API中删除任何冗餘,在相同操作可以多種方式執行的情況下,采用最實用的方法,将多餘的技術删除,指定幾何形狀就是一個好的例子,在OpenGL中應用程序可以使用立即模式、顯示列表或者頂點數組,在OpenGL ES中,隻存在頂點數組,而删除了立即模式和顯示列表。
(2)删除冗餘是個重要的目标,但是維護與OpenGL的兼容性也很重要,OpenGL ES盡一切可能設計成可以運行用OpenGL功能的嵌入式子集編寫的程序,這是一個重要的目标,因為這使得開發人員可以使用兩套API并開發使用相同功能子集的應用程序和工具。
(3)引入新功能來處理手持和嵌入式設備的特定限制,例如,為了降低電源消耗,提高着色器的性能,在着色語言中引入精度限定符。
(4)OpenGL ES的設計者旨在确保實現圖像質量的最小功能集,在早期的手持式設備中,屏幕尺寸有限,必須盡可能保證在屏幕上繪制的像素質量。
(5)OpenGL ES工作組希望确保任何OpenGL ES實現都能夠滿足圖像質量、正确性和穩定性的某種可接受和公認的标準,這通過開發相關的相容性測試來實現,OpenGL ES實現必須通過這些測試才能被視為兼容。
【相關學習資料推薦,點擊下方鍊接免費報名,先碼住不迷路~】
【免費】FFmpeg/WebRTC/RTMP/NDK/Android音視頻流媒體高級開發-學習視頻教程-騰訊課堂
C 音視頻配套學習資料:點擊莬費領取→音視頻開發(資料文檔 視頻教程 面試題)(FFmpeg WebRTC RTMP RTSP HLS RTP)
二、渲染流程
頂點數據:buffer是放置數據的地方,老外起的名字
頂點着色器:頂點數據傳遞給着色器,着色器通過glsl對頂點進行編輯
頂點變換:頂點數據有時需要矩陣變換
圖元裝配:頂點信息根據畫圖的需要,将一些點連接起來
光栅化:連接頂點的線段上用點拼接起來,三角形填充也用點
片元着色器:将所有的點通過片元着色器填充顔色或紋理圖片
三、着色語言(shader)着色語言是一種類C的編程語言,但不像C語言一樣支持雙精度浮點型(double)、字節型(byte)、短整型(short)、長整型(long),并且取消了C中的聯合體(union)、枚舉類型(enum)、無符号數(unsigned)以及位運算等特性。 着色語言中有許多内建的原生數據類型以及構建數據類型,如:浮點型(float)、布爾型(bool)、整型(int)、矩陣型(matrix)以及向量型(vec2、vec3等)等。總體來說,這些數據類型可以分為标量、向量、矩陣、采樣器、結構體以及數組等。 shader支持下面數據類型:
float bool int 基本數據類型
vec2 包含了2個浮點數的向量
vec3 包含了3個浮點數的向量
vec4 包含了4個浮點數的向量
ivec2 包含了2個整數的向量
ivec3 包含了3個整數的向量
ivec4 包含了4個整數的向量
bvec2 包含了2個布爾數的向量
bvec3 包含了3個布爾數的向量
bvec4 包含了4個布爾數的向量
mat2 2*2維矩陣
mat3 3*3維矩陣
mat4 4*4維矩陣
sampler1D 1D紋理采樣器
sampler2D 2D紋理采樣器
sampler3D 3D紋理采樣器
samplerExternalOES 擴展采樣器
// 把頂點坐标給這個變量, 确定要畫畫的形狀
attribute vec4 vPosition;
//接收紋理坐标,接收采樣器采樣圖片的坐标
attribute vec4 vCoord;
//變換矩陣, 需要将原本的vCoord(01,11,00,10) 與矩陣相乘 才能夠得到 surfacetexure(特殊)的正确的采樣坐标
uniform mat4 vMatrix;
//傳給片元着色器 像素點
varying vec2 aCoord;
void main(){
//内置變量 gl_Position ,我們把頂點數據賦值給這個變量 opengl就知道它要畫什麼形狀了
gl_Position = vPosition;
// 進過測試 和設備有關(有些設備直接就采集不到圖像,有些呢則會鏡像)
aCoord = (vMatrix * vCoord).xy;
}
頂點着色器主要是傳入相應的Attribute變量、Uniforms變量、采樣器以及臨時變量,經過頂點着色器後生成Varying變量。如下圖所示:
頂點着色器
(1)attribute變量(屬性變量)隻能用于頂點着色器中,不能用于片元着色器。 一般用該變量來表示一些頂點數據,如:頂點坐标、紋理坐标、顔色等。
(2)uniforms變量(一緻變量)用來将數據值從應用程其序傳遞到頂點着色器或者片元着色器。 該變量有點類似C語言中的常量(const),即該變量的值不能被shader程序修改。一般用該變量表示變換矩陣、光照參數、紋理采樣器等。
(3)varying變量(易變變量)是從頂點着色器傳遞到片元着色器的數據變量。頂點着色器可以使用易變變量來傳遞需要插值的顔色、法向量、紋理坐标等任意值。 在頂點與片元shader程序間傳遞數據是很容易的,一般在頂點shader中修改varying變量值,然後片元shader中使用該值,當然,該變量在頂點及片元這兩段shader程序中聲明必須是一緻的 。例如:上面代碼中應用程序中由頂點着色器傳入片元着色器中的vColor變量。
(4)gl_Position 為内建變量,表示變換後點的空間位置。 頂點着色器從應用程序中獲得原始的頂點位置數據,這些原始的頂點數據在頂點着色器中經過平移、旋轉、縮放等數學變換後,生成新的頂點位置。新的頂點位置通過在頂點着色器中寫入gl_Position傳遞到渲染管線的後繼階段繼續處理。
【相關學習資料推薦,點擊下方鍊接免費報名,先碼住不迷路~】
【免費】FFmpeg/WebRTC/RTMP/NDK/Android音視頻流媒體高級開發-學習視頻教程-騰訊課堂
C 音視頻配套學習資料:點擊莬費領取→音視頻開發(資料文檔 視頻教程 面試題)(FFmpeg WebRTC RTMP RTSP HLS RTP)
2.片着色器(fragment_shader)
#extension GL_OES_EGL_image_external : require
//SurfaceTexture比較特殊,需要用擴展OES
//float數據是什麼精度的
precision mediump float;
//采樣點的坐标
varying vec2 aCoord;
//使用正常的 sampler2D
uniform samplerExternalOES vTexture;
void main(){
//變量 接收像素值
// texture2D:采樣器 采集 aCoord的像素
//賦值給 gl_FragColor 就可以了
gl_FragColor = texture2D(vTexture, aCoord);
}
此片元着色器的主要功能為根據接收的記錄片元紋理坐标的易變變量中的紋理坐标,調用texture2D内建函數從采樣器中進行紋理采樣,如果是在Android中使用,是調用samplerExternalOES内建函數從采樣器中進行紋理采樣,得到此片元的顔色值。最後,将采樣到的顔色值傳給gl_FragColor内建變量,完成片元的着色。
片元着色器
(1)varying指的是從頂點着色器傳遞到片元着色器的數據變量
(2)gl_FragColor為内置變量,用來保存片元着色器計算完成的片元顔色值,此顔色值将送入渲染管線的後繼階段進行處理。
如果你對音視頻開發感興趣,或者對本文的一些闡述有自己的看法,可以在下方的留言框,一起探讨。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!