update: 2012/05/25
reference:
1. Tutorial - Getting Started with the OpenGL Shading Language (GLSL)
2. OpenGL: Starting with the Shading Language-0
3. OpenGL: Starting with the Shading Language-1
4. IMGD 4000 (D 09) - Technical Game Development II
=> GPU/Shaders
5. CS 354 (Kilgard, Spring 2012): Programmable Shading
Vertex Shader
A. 說明:
1. GPU Shaders = programmability + access to GPU internals
(可程式化, 並可對 GPU 的內部作存取)
2. Programmable Graphics Pipeline
a. Input: Application geometry(幾何) & per vertex attributes
b. Transform input in a meaningful way
c. 任務:
(1). 頂點轉換.
(2). 法線轉換, 正規化.
(3). 光源設置.
(4). 產生貼圖座標與轉換.
4. Fragment Shaders:
a. Input: Perspective Correct Attributes (interpolated: 內插法)
b. Transform input into color or discard
c. 任務:
(1). 貼圖存取.
(2). 霧氣(fog)
(3). 將 Fragment 丟棄.
5. Rendering Pipeline:
=> Used to management the input and output of shaders.
a. attribute: // 從應用程式 input 到 Vertex shader
Communicate frequently changing variables from the application
to a vertex shader.
b. uniform: // 可視為常數
Communicate infrequently changing variables from the application
to any shader.
c. varying: // Vertex 與 fragment shader 的變數傳遞界面
Communicate interpolated variables from a vertex shader
to a fragment shader
9. Qualifiers in pipeline:
-----------------------------------------------------------------------------------
B. 開啓 shader.vp 檔案:
// 常數: 定義光源的數量
const int NUM_LIGHTS = 3;
// uniform 變數:
//
// 包含了從 OpenGL 應用程式傳送到 shaders 的資訊.
// 在此處為: 觀察者的相機位置以及包含了每個光源位置的陣列.
//
// 在開始使用 program object 來繪製之前, 必須先在 OpenGL 應用程式設定
// Uniform 變數的值.
//
// vec3 型別: 代表有 3 個元素的向量.
uniform vec3 cameraPosition;
uniform vec3 lightPosition[NUM_LIGHTS];
// varying 變數:
//
// 這些變數的值經由 vertex shader 設定, 並且傳送給 fragment shader 來使用.
//
// 這些值將在繪製表面時被內插處理, 並且會於 fragment shader 執行
// 光源計算時使用到.
varying vec3 fragmentNormal;
varying vec3 cameraVector;
varying vec3 lightVector[NUM_LIGHTS];
// shader 的 main 函式:
//
// 包含了實際的 shader 程式碼, 將會對所有傳入的頂點都進行處理.
void
main()
{
// set the normal for the fragment shader and
// the vector from the vertex to the camera
//
// vertex shader 將頂點法線(vertex normal)藉由 varying 變數: fragmentNormal
// , 傳送給 fragment shader.
//
// 由於是 varying 變數, 所以它的值在繪製表面的過程中會被作內插處理.
//
// 內建的變數: gl_Normal , 可以讓 vertex shaders 取得頂點的法線.
fragmentNormal = gl_Normal;
// 內建的變數: gl_Vertex, 包含了目前頂點未轉換之前的位置.
//
// varying 變數: cameraVector, 被設定為從目前的頂點指向攝影機位置的向量.
cameraVector = cameraPosition - gl_Vertex.xyz;
// set the vectors from the vertex to each light
//
// varying 變數: lightVector, 被設定為從目前的頂點指向每個光源的向量.
for(int i = 0; i < NUM_LIGHTS; ++i)
lightVector[i] = lightPosition[i] - gl_Vertex.xyz;
// output the transformed vertex
//
// 設定內建的變數: gl_Position, 它包含了頂點轉換之後應該被繪製的位置.
//
// 藉由內建的矩陣 gl_ModelViewProjectionMatrix (目前的投影與 model view 矩陣
// 之乘積)矩陣, 我們轉換了gl_Vertex.
//
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。