寫在前面的廢話:今天俺又來了哈哈,真的好棒棒!
今天的內容:之前我們大概描述了,我們自己定義的頂點座標是如何被載入到gpu之中,並且介紹了頂點緩衝物件vbo用於管理這一塊記憶體。今天開始詳細分析它的具體作用和用法。
首先opengl要求我們必須擁有乙個頂點著色器和乙個片段著色器,這樣才可以進行渲染。當然這兩個是必須經過編輯才能使用,而編輯所用的語言是glsl(opengl shading language),然後編譯這個著色器,這樣我們就可以使用了。
舉個例子像這樣,
這是乙個稍微複雜的頂點著色器的編寫,大家可以先只看layout(location=0) in vec3 position.這一句我一步步向後解釋。但在此之前我們#version 330 core表示的是我們所用的glsl版本號是3.3 這個版本號要與我們之前在程式開頭所用到的opengl的版本一致才可以。
接下來,進入頂點著色器的定義部分,in 在這被xcode 理解成關鍵字,和後面out相對應,這裡有點像hardwaresimulator裡面的in 和out 他們分別表示了頂點著色器輸入和輸出所特定的資料型別。這裡用到的資料型別都是向量型的,比如vec3 表示乙個空間向量(即x,y,z),vec2表示的則是乙個平面向量(x,y)。例如:這裡第一行 in vec3 position 表示這個position這個變數是乙個空間向量並且作為輸入頂點著色器的存在。
layout(location=0)這裡我暫時不解釋,等下能提到。
注意你可能看到了乙個叫vec4 的東西,這個地方插嘴補一句:在glsl中乙個向量有最多4個分量,每個分量值都代表空間中的乙個座標,它們可以通過vec.x
、vec.y
、vec.z
和vec.w
來獲取。注意vec.w
分量不是用作表達空間中的位置的(我們處理的是3d不是4d),而是用在所謂透視劃分(perspective division)上。當然這個還算是比較簡單的,以後會有更為複雜的頂點著色器。
在這之前,提一下由於我這裡已經學到後面獨立檔案裡建立shader,剛入門的朋友們建議暫時把它們放到乙個字串中如下圖。
這樣的目的是接著介紹如何編譯這個著色器,也能讓大家更加了解這一步。
之前我們已經編輯好了著色器的內容,接下來要編譯他們,這樣opengl才能實時動態使用他們。
先看**
首先第一步,我們需要建立乙個著色器物件,這裡按照我的理解,opengl為我們封裝好了很多編譯所需要的東西,我們只需要先建立乙個容器(也就是我們的頂點著色器),然後把我們具體操作放入其中,再編譯即可。
所以這裡引數寫頂點著色器。
而在這之後,就到了向容器(vertexshader)裡面放內容的步驟了。這裡用到glshadersource函式,首先 第乙個引數表示我們容器的名字,第二個引數表示我們所裝入的內容的長度,由於只有乙個字串,所以這裡填1, 第三個引數就是我們之前的字串的頭指標,第四個直接寫null。
gluint success; //這個整形用於表示是否編譯成功
glchar infolog[512]; //這個陣列用於儲存錯誤資訊
glgetshaderiv(vertexshader,gl_compile_status,&success);//通過這個函式可以給success 賦值,如果編譯通過則賦值1 失敗賦值0
接下來判斷success 的值
if(!success)
glgetshaderinfolog(vertexshader,512,null,infolog);
std::cout << "error::shader::vertex::compilation_failed\n" << infolog << std::endl;
ok ,以上就是頂點著色器的編輯和編譯部分。接下來介紹片段著色器。
同樣先創造乙個空的容器.. 其他步驟與頂點著色器一致,**如下。
接下來則是片段著色器的內容了。
#version 330 core out vec4 color; void main()
簡單給定乙個rgba格式的顏色即可。
好的,到目前為止,我們兩個重要的著色器就完成了,接下來讓我們把這兩個單獨的程式連線到一起,從而成為乙個著色器程式物件(shader program object )
正如之前介紹到的,渲染管線其實是乙個階段連著下乙個階段所形組成的,而現在我們所需要的程式物件,它的功能就是把我們之前定義的兩個著色器的in和out鏈結起來,讓他們可以相互完成傳遞。打個比方來說,兩個著色器可以看作兩個流水線上的工人,他們乙個在前乙個在後處理流水線上的東西,當前乙個人交接任務給後乙個人的時候,我們還沒給定這個交接的時候統一介面。(前乙個shader的out 是否作為後乙個shader的in)
和之前建立著色器類似,**如下:
唯一要注意的就是glattachshader()函式的兩個引數,第乙個是目標程式,第二個是著色器。
好的今天暫時到這裡,明天或者後天我將更加詳細的解釋下vbo以及後面的vao。
OpenGL學習記錄
關於opengl opengl 全寫open graphics library 是指定義了乙個跨程式語言 跨平台的程式設計介面規格的專業的圖形程式介面。它用於三維影象 二維的亦可 是乙個功能強大,呼叫方便的底層圖形庫。opengl具有七大功能 建模 opengl圖形庫除了提供基本的點 線 多邊形的繪...
OpenGL入門學習
include 太陽 地球和月亮 假設每個月都是30天 一年12個月,共是360天 static int day 200 day的變化 從0到359 void mydisplay void void myidle void int main int argc,char argv 3 關於垂直同步co...
OpenGL入門學習
說起程式設計作圖,大概還有很多人想起tc的 include 吧?但是各位是否想過,那些畫面絢麗的pc遊戲是如何編寫出來的?就靠tc那可憐的640 480解析度 16色來做嗎?顯然是不行的。本帖的目的是讓大家放棄tc的老舊圖形介面,讓大家接觸一些新事物。opengl作為當前主流的圖形api之一,它在一...