OpenGL12-shader(GLSL)着色語言2-(參數傳遞)(代碼以上傳)


   

  上一篇中介紹了如何使用shader,用來一個最簡單的shader,計算頂點的位置,調用了

OpenGL 頂點着色語言中的內置變量對頂點進行操作,這一例程中,將展示如何將應用層

的數據傳遞到shader中,在shader中完成相應的計算。

  先說下在這一節中,我們要完成的任務,不調用OpenGL的旋轉函數(即glRotate××)

系列函數,不使用矩陣完成對模型的旋轉。要完成這樣的功能,那么我們就只能借住shader

來進行計算,編寫shader更多的情況要求我們對數學知識了解到更多,掌握的更多,寫shader

就是寫一些列的算法,這些算法多數數與數學相關的。今天我們要掌握的知識是:uniform類型

變量的使用。

  看代碼:

    uniform float times;
    void main( void )
    {
        float c = cos(times);
        float s = sin(times);
        vec4  temp = gl_Vertex;
        temp.x = gl_Vertex.x * c - gl_Vertex.y * s;
        temp.y = gl_Vertex.x * s + gl_Vertex.y * c;
        gl_Position = gl_ModelViewProjectionMatrix * temp;
        gl_FrontColor = gl_Color; 
    }

從c/c++語言的角度來看shader,那么times變量就是一個全局變量,在程序中,我們通過使用

這個全局變量,來完成對頂點的旋轉工作,沿着z軸。現在紋理來了,我們在顯卡中生命的變量

如何才可以在c++的訪問。OpenGL擴展api中提供了這樣手段來訪問uniform類型變量的手段。

看代碼:

_times  =   glGetUniformLocationARB( _programObj, "times" );

上面的函數是cpu上執行的函數,_times是一個無符號類型的變量,_programObj也是,在

上一節中已經做過介紹,就是保存程序的句柄或者叫索引。glGetUniformLocationARB函數的

第二個參數就是變量的名稱,通過這個名稱,我們可以得到這個變量對應的句柄(或者叫索引)

后面通過這個索引我們可以訪問shader中的times這個變量了。值得注意到是,這個變量的生存

周期是對全局的。

  通過調用下面的代碼,修改shader中times的值:

static  float xxx = 0;

glUseProgramObjectARB( _programObj );
glUniform1fARB(_times,xxx);

xxx +=  0.01f;
 if (xxx > 3.14f)
{
     xxx =   0;
}

這樣就將times的值修改了。大家可以慢慢體會這個過程,可以想象一下程序執行的過程,下一例程

將給大家展示如何在vertex shader中聲明例外一個類型的變量。

代碼下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM