2012年5月25日 星期五

OpenGL: Starting with the Shading Language-2

since: 2012/05/25
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

      3. Vertex Shaders:
         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:

      6. Vertex Shader Inputs & Outputs:

      7. Fragment Shader Inputs & Outputs:

      8. Type Qualifiers: (變數型別的修飾語)
          => 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;
}

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。