OpenGL 入門4

原帖地址:
http://ogldev.atspace.co.uk/www/tutorial05/tutorial05.html
http://blog.csdn.net/cordova/article/details/52504118

Uniform variables

Uniform variable和之前gl_Position等內置變量是略有不同的。每次有shader調用的時候,內置變量的數據是從頂點緩存中取得的,而uniform variable的數據一般是來自程序中的變量。uniform variable的作用很多,一般我們可以用它來存儲光源位置,光源方向,變換矩陣或者貼圖對象句柄等。

API

glutIdleFunc(RenderSceneCB);

之前設定的glutDisplayFunc()中的回調函數,也就是渲染圖像的回調函數在opengl中並不會一直被調用。通常會在第一次創建完窗口之後調用一次,之後每改變窗口的大小、位置或者是發生窗口覆蓋事件時會調用一次。爲了實現動畫,我們必須要讓這個渲染回調不停的調用,這是就要使用上面的函數。以上函數的作用是在沒有收到任何窗口消息時,不停的調用RenderSceneCB函數,我們可以把這個函數設置成glutDisplayFunc()中的渲染回調函數,那麼窗口就會不停的繪製了。

gScaleLocation = glGetUniformLocation(ShaderProgram, "gScale");
assert(gScaleLocation != 0xFFFFFFFF);

當我們在編譯GLSL程序的時候,GLSL編譯器會給每個uniform variable一個索引。我們可以使用glGetUniformLocation來獲取到這個索引。如果沒有獲取到這個索引,那麼返回值gScaleLocation就會是-1。造成返回值爲-1的情況通常有兩種,第一種情況是我們在shader中聲明的那個uniform ariable沒有被使用,那麼GLSL編譯器就會在優化的過程中把它丟掉,第二種情況是輸入的uniform variable的名字錯誤,和shader中的名字不相同。

static float Scale = 0.0f;
Scale += 0.001f;
glUniform1f(gScaleLocation, sinf(Scale));

我們聲明瞭一個float型的Scale,每一次draw call我們把他的值增加0.001,並且用glUniform1f函數將這個浮點數的餘弦值傳給gScaleLocation。這裏glUniform1f中的1f代表傳入的是一個浮點數。還有其他類似的後綴,比如:3i,3f,2i等等。

uniform float gScale;

在shader程序裏,我們聲明瞭一個uniform variable,叫做gScale。這個和glGetUniformLocation()中的名字是一樣的。我們從c/c++傳入的數據就存在gScale裏面。

gl_Position = vec4(gScale * Position.x, gScale * Position.y, Position.z, 1.0);

我們將傳入的gScale乘上頂點的x,y座標,讓所渲染圖形的x,y座標呈現週期行的變化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章