GLSL教程 (四)shder的簡單示例

2021-08-21 10:21:38 字數 2028 閱讀 3366

vtrans = projection * modelview *incomingvertex

uniform mat4 gl_modelviewmatrix;

uniform mat4 gl_projectionmatrix;

接下來需要得到輸入的頂點。通過預先定義的屬性變數,所有的頂點將可以乙個個傳入頂點shader中。

attribute vec4 gl_vertex;

void

main

()

上面**中變換每個頂點時,投影矩陣都將乘上模型檢視矩陣,這顯然非常浪費時間,因為這些矩陣不是隨每個頂點變化的。注意這些矩陣是一致變數。

void

main

()

上面的操作能夠獲得和固定功能流水線相同的結果嗎?理論上是如此,但實際上對頂點變換操作的順序可能會不同。頂點變換通常在顯示卡中是高度優化的任務,所以有乙個利用了這種優化的特定函式用來處理這個任務。這個神奇的函式如下:

vec4 ftransform

(void)

;

void

main

()

void

main

()

可以在此獲得本節例子的原始碼:

attribute vec4 gl_color;

varying vec4 gl_frontcolor;

// writable onthe vertex shader

varying vec4 gl_backcolor;

// writable onthe vertex shader

varying vec4 gl_color;

// readable on thefragment shader

變數使用思想如下:

void

main

()

void

main

()

基於glew的源**:

void

main

(void)

我們先將gl_vertex變數複製到乙個區域性變數v中。gl_vertex是乙個glsl提供的屬性變數,所以在頂點shader中它是唯讀的。

void

main

(void)

最後我們需要加入一些頂點動畫效果。為了達到這個目的我們需要增加乙個變數記錄變化的時間,或者幀數。乙個頂點shader是無法記錄不同頂點值的,更不用 說記錄不同的幀了。所以我們需要在opengl程式中定義這個變數,然後作為一致變數傳遞給shader。假設在opengl程式中有乙個名為time的 幀計數器,在shader中有個同名的一致變數。

uniform

float time;

void

main

(void)

在有關一致變數的小節講過,在opengl程式中需要兩個步驟:

loc =glgetuniformlocation(p,"time");

void

renderscene

(void)

函式中的變數time在程式一開始初始化,然後每幀都會進行自增運算。

GLSL教程 (四)shder的簡單示例

glsl的hello world 這一節中包含乙個最基本的shader,它提供如下功能 頂點變換然後使用單一的顏色渲染圖元。頂點shader 前面已經說過,頂點shader負責完成頂點變換。這裡將按照固定功能的方程完成頂點變換。固定功能流水線中乙個頂點通過模型檢視矩陣以及投影矩陣進行變換,使用如下公...

GLSL教程 (四)shder的簡單示例

glsl的hello world 這一節中包含乙個最基本的shader,它提供如下功能 頂點變換然後使用單一的顏色渲染圖元。頂點shader 前面已經說過,頂點shader負責完成頂點變換。這裡將按照固定功能的方程完成頂點變換。固定功能流水線中乙個頂點通過模型檢視矩陣以及投影矩陣進行變換,使用如下公...

GLSL的簡單範例

這個例子在 windows下 採用 vc6.0 開發 首先確定你已經安裝並可以正常使用 glew 和 glut 擴充套件庫 第一步,建立頂點著色器和片元著色器檔案 minimal.vert 和 minimal.frag 並匯入到專案中。檔案原始碼如下 頂點著色器 void main 這個頂點著色器非...