目錄
- GLSl是什么?
- GLSL特有語法
- Shader的渲染流程
- EGL上下文環(huán)境
- 參考
- 收獲
一、GLSL是什么?
GLSL(OpenGL Shading Language),是用來在OpenGL中編寫著色器(頂點著色器和片元著色器)程序的語言,該程序會在GPU(Graphic Processor Unit)上執(zhí)行,使得渲染管線具有可編程行。
二、GLSL的特有語法
GLSL和C非常相似,基本類型、函數(shù)、結(jié)構(gòu)體(stuct、對應(yīng)java的class)比較常用,流程控制等。沒有指針,但增加了不少著色器特有的基本類型。
學(xué)習(xí)一門語言首先看它的數(shù)據(jù)類型的表示,再學(xué)習(xí)具體的運行流程,由于運行流程上和C、Java等語言基本一致。所以我們來重點看看GLSL特有的數(shù)據(jù)類型的表示,從基本類型、修飾符、內(nèi)置變量、內(nèi)置函數(shù)四個方面說明。
2.1 基本類型
在計算機(jī)圖形中,向量和矩陣是變換的基礎(chǔ),這兩種數(shù)據(jù)類型也是GLSL的核心
vec2 ,vec3 ,vec4:浮點向量
ivec2 ,ivec3 ,ivec4:整數(shù)向量
uvec2 ,uvec3 ,uvec4:無符號整型向量
bvec2 ,bvec3 ,bvec4:boolean向量
mat2,mat3,mat4,mat2x3…: 浮點矩陣
sampler2D : 二維紋理句柄
2.2 修飾符
const: (只讀) 常量變量
attribute: 只能用于頂點著色器,用于經(jīng)常更改的信息
uniform: (始終如一的)用于不經(jīng)常更改的信息,可用于頂點和片元著色器
varying: (易變的)用于修飾從頂點著色器向片元著色器傳遞變量。
2.3 內(nèi)置變量
最常見的是頂點著色器和片元著色器的輸出變量
Vertex Shader的內(nèi)置變量 : gl_position和gl_pointSize
FragmentShader的內(nèi)置變量: gl_FragColor
2. 4 函數(shù)與內(nèi)置函數(shù)
GLSL的函數(shù)和C的函數(shù)使用基本一致,在定義函數(shù)前,必須要先聲明。
不同之處在于GLSL在函數(shù)參數(shù)的傳遞上提供了特殊的限定符(修飾符),和aidl有點類似,具體如下
in : 默認(rèn)模式, 值傳遞的方式,不能修改
inout: 引用傳遞,允許修改,修改后函數(shù)退出后發(fā)生變化
out: 表示改變量的值不被傳入函數(shù),但在函數(shù)返回時將被修改
GLSL語言最強(qiáng)大的功能之一是提供了內(nèi)置函數(shù)
常用的如下:
abs: 絕對值
floor: 向下取整
ceil:向上取整
mod:取模
min:最小
max:最大
clamp:中間值
dot: 計算兩個向量的點積
pow:計算標(biāo)量的冪次
在每個shader中必須有且只能有一個main函數(shù)
三、Shader的渲染流程
了解了GLSL的基本語法,下面我們來學(xué)習(xí)下如何把Shader傳遞給OpenGL的渲染管線。
3.1 OpenGL的渲染架構(gòu)

圖片來源:[OpenGL入門第二課--常用的固定存儲著色器]
從上圖中我們可以看出整個管線分為2部分,Client和Server
Client就是我們編寫的程序代碼以及OpenGL API,這部分運行在CPU上
Server 是真正完成渲染操作的,它運行中GPU上
Client和Server的通信只能通過Attributes屬性、Uniforms和Texture Data紋理數(shù)據(jù)這三種數(shù)據(jù)類型。并且Attributes屬性只能傳給頂點著色器
3.2 如何創(chuàng)建Shader可執(zhí)行程序?

圖片來自《音視頻開發(fā)進(jìn)階指南》
下面看下如何創(chuàng)建創(chuàng)建在GPU可執(zhí)行程序(Program)
我們通過上圖可以看到分為四個環(huán)節(jié)
- 創(chuàng)建program :glCreateProgram
- attachShader: 創(chuàng)建頂點和片元著色器、設(shè)置source、編譯,attach到program
- 鏈接: glLinkProgram
- 使用: glUseProgram
四、EGL環(huán)境
OpenGL 不負(fù)責(zé)窗口和上下文的管理,該職責(zé)有各平臺自己實現(xiàn),比如android平臺的EGL就是擔(dān)當(dāng)這個角色, 它是 OpenGL ES 和 native window system 之間的接口.
EGL采用雙緩沖工作模式,F(xiàn)ront Frame Buffer和Back Frame Buffer,正常繪制操縱的目標(biāo)都在Back Frame Buffer ,操作完畢之后調(diào)用eglSwapBuffer將繪制完畢的FrameBuffer交換到Front Frame Buffer并顯示。
在android中GlSurfaceView實現(xiàn)了EGL環(huán)境和GLThread線程,下一篇我們通過對GlSurfaceView使用來繪制平面圖形。
五、參考
《音視頻開發(fā)進(jìn)階指南》
《OpenGL ES 3.0編程指南》
[GLSL基礎(chǔ)語法介紹]
六、收獲
- 了解GLSL的概念和語法
- 了解Shader渲染架構(gòu)和程序的執(zhí)行流程
- 了解EGL
感謝你的閱讀。
最近這兩篇都是OpenGL的基本概念和語法流程,這些知識和概念是非常重要的,要把這些基礎(chǔ)知識吸收內(nèi)化,下一篇我們來開啟實戰(zhàn)篇“OpenGL ES 繪制平面圖形” 歡迎關(guān)注公眾號“音視頻開發(fā)之旅”,一起學(xué)習(xí)成長。
歡迎交流