1. 程式人生 > >「音視訊直播技術」OpenGL渲染之著色器

「音視訊直播技術」OpenGL渲染之著色器

opengl.png

前言

本文介紹一下OpenGL的基本概念。在OpenGL中,只能畫三種圖元,點、線、三角型。在OpenGLES2.0之後,引用也GLSL(OpenGL Shader Languge),它類似於C語言的語法。

著色器型別

有兩種常用著色器,分別是頂點著色器(Vertex Shader)和片元著色器(Fragment Shader)。

片元著色器是在頂點著色器之後被呼叫的。

頂點著色器,每個頂點執行一次,確定生成頂點最終的位置。一但確定了位置,OpenGL將利用這些點生成 點、線、三角形。

片元著色器,每個片元執行一次,它用於確定每個片元的點、線、三角形的最終顏色。片元是一個單一顏色的小矩形區域,類似於計算機螢幕上的畫素。

載入著色器

載入著色器需要按下面的步驟進行載入:

  1. 根據著色器型別,他建一個著色器。GLES20.glCreateShader(shaderType); 著色器型別包括 GLES20.GL_VERTEX_SHADER(頂點著色器)和 GLES20.GL_FRAGMENT_SHADER(片元著色器)。
  2. 將著色器程式程式碼與上面建立的著色器繫結在一起。GLES20.glShaderSource(shader, source);。
  3. 編譯著色器程式。GLES20.glCompileShader(shader);可以通過 GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0); 函式獲取編譯結果。
  4. 建立程式物件。GLES20.glCreateProgram();
  5. 將編譯好的著色器與上面建立的程式物件繫結到一起。如GLES20.glAttachShader(program, vertexShader);和 GLES20.glAttachShader(program, fragmentShader);
  6. 最後將這們連結到一起。GLES20.glLinkProgram(program);可以通過 GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);獲取連結的狀態。

獲得著Uniform和Attribute位置

著色器中的Uniform和Attribute變數是可以在外面賦值的。在賦值之前,我們首先獲取變數的位置。可以通過下面的方法來獲取:

  1. 獲取 Uniform 位置, GLES20.glGetUniformLocation(mProgramHandle, “uMVPMatrix”); uMVPMatrix就是著色器中的 Uniform 變數。
  2. 獲取 Attribute 位置, GLES20.glGetAttribLocation(mProgramHandle, “aPosition”); aPosition就是著色器中的 Attribute 變數。

將頂點資料與Attribute關聯

取得 Attribute 變數位置後,還需要將頂點陣列中的資料與 Attribute 變數關聯。

  1. 先使 Attribute 變數可用。GLES20.glEnableVertexAttribArray(maPositionLoc);
  2. 關聯資料。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 用於宣告常量