「音視訊直播技術」OpenGL渲染之著色器
前言
本文介紹一下OpenGL的基本概念。在OpenGL中,只能畫三種圖元,點、線、三角型。在OpenGLES2.0之後,引用也GLSL(OpenGL Shader Languge),它類似於C語言的語法。
著色器型別
有兩種常用著色器,分別是頂點著色器(Vertex Shader)和片元著色器(Fragment Shader)。
片元著色器是在頂點著色器之後被呼叫的。
頂點著色器,每個頂點執行一次,確定生成頂點最終的位置。一但確定了位置,OpenGL將利用這些點生成 點、線、三角形。
片元著色器,每個片元執行一次,它用於確定每個片元的點、線、三角形的最終顏色。片元是一個單一顏色的小矩形區域,類似於計算機螢幕上的畫素。
載入著色器
載入著色器需要按下面的步驟進行載入:
- 根據著色器型別,他建一個著色器。GLES20.glCreateShader(shaderType); 著色器型別包括 GLES20.GL_VERTEX_SHADER(頂點著色器)和 GLES20.GL_FRAGMENT_SHADER(片元著色器)。
- 將著色器程式程式碼與上面建立的著色器繫結在一起。GLES20.glShaderSource(shader, source);。
- 編譯著色器程式。GLES20.glCompileShader(shader);可以通過 GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0); 函式獲取編譯結果。
- 建立程式物件。GLES20.glCreateProgram();
- 將編譯好的著色器與上面建立的程式物件繫結到一起。如GLES20.glAttachShader(program, vertexShader);和 GLES20.glAttachShader(program, fragmentShader);
- 最後將這們連結到一起。GLES20.glLinkProgram(program);可以通過 GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);獲取連結的狀態。
獲得著Uniform和Attribute位置
著色器中的Uniform和Attribute變數是可以在外面賦值的。在賦值之前,我們首先獲取變數的位置。可以通過下面的方法來獲取:
- 獲取 Uniform 位置, GLES20.glGetUniformLocation(mProgramHandle, “uMVPMatrix”); uMVPMatrix就是著色器中的 Uniform 變數。
- 獲取 Attribute 位置, GLES20.glGetAttribLocation(mProgramHandle, “aPosition”); aPosition就是著色器中的 Attribute 變數。
將頂點資料與Attribute關聯
取得 Attribute 變數位置後,還需要將頂點陣列中的資料與 Attribute 變數關聯。
- 先使 Attribute 變數可用。GLES20.glEnableVertexAttribArray(maPositionLoc);
關聯資料。GLES20.glVertexAttribPointer(maPositionLoc, coordsPerVertex, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer);
maPositionLoc: Attribute 變數位置。
coordsPerVertex: 第個頂點座標佔用的數量。如x,y代表2
vertexStride: 每個頂點資料的寬度。
vertexBuffer: 陣列
著色器的資料型別
著色器分為 標量,向量,距陣,取樣器,結構體,陣列幾種型別。
標量:布林型(bool)、整形(int)和浮點型(float)等。
向量:
向量型別 | 說明 |
---|---|
vec2 | 包含了2個浮點數的向量 |
ivec2 | 包含了2個整數的向量 |
bvec2 | 包含了2個布林數的向量 |
vec3 | 包含了3個浮點數的向量 |
ivec3 | 包含了3個整數的向量 |
bvec3 | 包含了3個布林數的向量 |
vec4 | 包含了4個浮點數的向量 |
ivec4 | 包含了4個整數的向量 |
bvec4 | 包含了4個布林數的向量 |
距陣:
矩陣型別 | 說明 |
---|---|
mat2 | 2x2浮點數矩陣 |
mat3 | 3x3浮點數矩陣 |
mat4 | 4x4浮點數矩陣 |
取樣:
一般情況下,一個取樣器變數代表一幅或一套紋理貼圖
取樣器 | 說明 |
---|---|
sampler2D | 用於訪問二維紋理 |
smapler3D | 用於訪問三維紋理 |
samplerCube | 用於訪問立方貼圖紋理 |
變數限定符
著色器一般包括下在幾種變理限定符:
限定符 | 說明 |
---|---|
attribute | 一般用於每個頂點都各不相同的量,如頂點位置、顏色等。 |
uniform | 一般用於對同一組頂點組成的單個3D物體中所有頂點都相同的量,如當前光源的位置。 |
varying | 用於從頂點著色器傳遞到片元著色器的量 |
const | 用於宣告常量 |