1. 程式人生 > >Learn OpenGL(四)——片段著色器(Fragment Shader)

Learn OpenGL(四)——片段著色器(Fragment Shader)

片段著色器(Fragment Shader)

       片段著色器是第二個也是最終我們打算建立的用於渲染三角形的著色器。 片段著色器的全部, 都是用來計算你的畫素的最後顏色輸出。 為了讓事情比較簡單, 我們的片段著色器只輸出橘黃色。
 

注:
在計算機圖形中顏色被表示為有4個元素的陣列: 紅色、 綠色、 藍色和alpha(透明度)元素, 通常縮寫為RGBA。

#version 330 core
out vec4 color;
void main()
{
color = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}


片段著色器只需要一個輸出變數, 這個變數是一個4元素表示的最終輸出顏色的向量, 我們可以自己計算出來。 我們可以用 out 關鍵字宣告輸出變數, 這裡我們命名為 color 。 下面, 我們簡單的把一個帶有alpha值為1.0(1.0代表完全不透明)的橘黃的 vec4 賦值給 color 作為輸出。
編譯片段著色器的過程與頂點著色器相似, 儘管這次我們使用 GL_FRAGMENT_SHADER

作為著色
器型別:

GLuint fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, null);
glCompileShader(fragmentShader);


每個著色器現在都編譯了, 剩下的事情是把兩個著色器物件連結到一個著色器程式中(ShaderProgram), 它是用來渲染的。


著色器程式


著色器程式物件(Shader Program Object)是多個著色器最後連結的版本。 如果要使用剛才編譯的著色器我們必須把它們連結為一個著色器程式物件, 然後當渲染物體的時候啟用這個著色器程式。 激活了的著色器程式的著色器, 在呼叫渲染函式時才可用。
把著色器連結為一個程式就等於把每個著色器的輸出連結到下一個著色器的輸入。 如果你的輸出和輸入不匹配那麼就會得到一個連結錯誤。建立一個程式物件很簡單:

GLuint shaderProgram;
shaderProgram = glCreateProgram();



glCreateProgram 函式建立一個程式, 返回新建立的程式物件的ID引用。 現在我們需要把前面編譯的著色器附加到程式物件上, 然後用 glLinkProgram 連結它們:

glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);


程式碼不言自明, 我們把著色器附加到程式上, 然後用 glLinkProgram 連結。

注:
就像著色器的編譯一樣, 我們也可以檢驗連結著色器程式是否失敗, 獲得相應的日誌。 與glGetShaderiv和glGetShaderInfoLog不同
 

glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if(!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
...
}


我們可以呼叫 glUseProgram 函式, 用新建立的程式物件作為它的引數, 這樣就能啟用這個程式物件:

glUseProgram(shaderProgram);


現在在 glUseProgram 函式呼叫之後的每個著色器和渲染函式都會用到這個程式物件(當然還有
這些連結的著色器)了。
在我們把著色器物件連結到程式物件以後, 不要忘記刪除著色器物件; 我們不再需要它們
了:

glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);


現在, 我們把輸入頂點資料傳送給GPU, 指示GPU如何在頂點和片段著色器中處理它。 還沒結束, OpenGL還不知道如何解釋記憶體中的頂點資料, 以及怎樣把頂點資料鏈接到頂點著色器的屬性上。 見下文(*╹▽╹*)