著色器
在OpenGL中,我們需要至少定義一個(gè)頂點(diǎn)著色器和一個(gè)片段著色器。
頂點(diǎn)著色器
下面是一個(gè)最基礎(chǔ)的頂點(diǎn)著色器的寫法:

每個(gè)著色器都起始于一個(gè)版本聲明。
in關(guān)鍵字用來(lái)聲明輸入變量,即著色器接收從應(yīng)用程序傳遞過(guò)來(lái)的數(shù)據(jù),這些數(shù)據(jù)通常是頂點(diǎn)屬性,例如頂點(diǎn)位置、法線、紋理坐標(biāo)等。
layout關(guān)鍵字配合location限定符,用于指定變量在內(nèi)存中的布局或者在著色器中的位置。
vec是GLSL中的向量數(shù)據(jù)類型,其中vec2表示包含兩個(gè)分量的二維向量,vec3表示包含三個(gè)分量的三維向量,vec4表示包含四個(gè)分量的四維向量。
在上面的代碼中,我們輸入了一個(gè)vec3類型的變量position,它包含了頂點(diǎn)的坐標(biāo)信息,之后我們?cè)谥骱瘮?shù)中將其轉(zhuǎn)換為GLSL內(nèi)置的輸出變量gl_Position。
gl_Position是一個(gè)四維向量(x,y,z,w),表示變換后的頂點(diǎn)位置,其中(x,y,z)表示變換后的頂點(diǎn)坐標(biāo),而w用于透視除法。透視除法是將齊次坐標(biāo)(Homogeneous Coordinates)轉(zhuǎn)換為三維坐標(biāo)的過(guò)程。
——————————————————————————————————————
齊次坐標(biāo)是一種將N維空間中的點(diǎn)表示為N+1維向量的方法。在三維空間中,齊次坐標(biāo)通常用四維向量表示。一個(gè)點(diǎn)的三維坐標(biāo)(x, y, z)可以表示為(x', y', z', w),其中:
x' = x * w,y' = y * w,z' = z * w
這里的w是齊次坐標(biāo)的第四個(gè)分量,通常稱為“權(quán)重”。通過(guò)引入權(quán)重,我們可以使用除法來(lái)實(shí)現(xiàn)透視效果。透視除法是將齊次坐標(biāo)轉(zhuǎn)換為三維坐標(biāo)的過(guò)程,即(x/w, y/w, z/w)。
齊次坐標(biāo)有一些有用的性質(zhì),例如平移、旋轉(zhuǎn)和縮放變換可以統(tǒng)一地表示為矩陣乘法。這極大地方便了圖形渲染中的變換操作。
——————————————————————————————————————
片段著色器
片段著色器所做的是計(jì)算像素最后的顏色輸出。
顏色是一個(gè)四維向量,它的四個(gè)分量分別是紅、綠、藍(lán)和透明度,一般縮寫為RGBA,其中每個(gè)分量的強(qiáng)度都設(shè)置在0.0到1.0之間。
下面是一個(gè)最基礎(chǔ)的片段著色器的寫法:

編譯著色器
編譯一個(gè)著色器需要三個(gè)步驟:創(chuàng)建著色器—綁定源碼—編譯著色器。
glCreateShader()用于創(chuàng)建一個(gè)著色器對(duì)象,并返回一個(gè)標(biāo)識(shí)符。

glShaderSource()用于將著色器源代碼與著色器對(duì)象進(jìn)行關(guān)聯(lián)。

shader是要關(guān)聯(lián)源代碼的著色器對(duì)象的標(biāo)識(shí)符。
count是源代碼字符串?dāng)?shù)組的大小,即源代碼的行數(shù)。
string是指向源代碼字符串?dāng)?shù)組的指針,可以是一個(gè)或多個(gè)源代碼字符串。
length是指向一個(gè)整數(shù)數(shù)組的指針,用于指定每個(gè)源代碼字符串的長(zhǎng)度,如果為 NULL,則表示每個(gè)字符串都以 NULL 結(jié)尾。
glCompileShader()用于編譯著色器。

著色器程序
著色器程序?qū)ο?Shader Program Object)是多個(gè)著色器合并之后并最終鏈接完成的版本。使用一個(gè)著色器程序有以下幾個(gè)步驟:創(chuàng)建著色器程序—添加著色器—鏈接著色器—激活著色器程序。
glCreateProgram()用于創(chuàng)建著色器程序?qū)ο?,并返回?duì)象的標(biāo)識(shí)符。

glAttachShader()用于把之前編譯過(guò)的著色器附加到程序?qū)ο笊稀?/span>

glLinkProgram()把相關(guān)的著色器鏈接到程序?qū)ο?,組合為一個(gè)可執(zhí)行程序。

glUseProgram()用于激活著色器程序?qū)ο蟆?/p>
此外,在把著色器對(duì)象鏈接到程序?qū)ο笠院?,著色器?duì)象就失去了用處。記得刪除著色器對(duì)象,釋放資源。
