音視頻開發(fā)之旅(八)GLSL及Shader的渲染流程

目錄

  1. GLSl是什么?
  2. GLSL特有語法
  3. Shader的渲染流程
  4. EGL上下文環(huán)境
  5. 參考
  6. 收獲

一、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é)

  1. 創(chuàng)建program :glCreateProgram
  2. attachShader: 創(chuàng)建頂點和片元著色器、設(shè)置source、編譯,attach到program
  3. 鏈接: glLinkProgram
  4. 使用: 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ǔ)語法介紹]

六、收獲

  1. 了解GLSL的概念和語法
  2. 了解Shader渲染架構(gòu)和程序的執(zhí)行流程
  3. 了解EGL

感謝你的閱讀。

最近這兩篇都是OpenGL的基本概念和語法流程,這些知識和概念是非常重要的,要把這些基礎(chǔ)知識吸收內(nèi)化,下一篇我們來開啟實戰(zhàn)篇“OpenGL ES 繪制平面圖形” 歡迎關(guān)注公眾號“音視頻開發(fā)之旅”,一起學(xué)習(xí)成長。

歡迎交流

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容