一: 著色器
著色器只是一種把輸入轉化為輸出的程式。著色器也是一種非常獨立的程式,因為它們之間不能相互通訊;它們之間唯一的溝通只有通過輸入和輸出。
在最簡配置下,至少都得有兩個著色器:乙個叫頂點著色器(vertex shader),它將作用於每個頂點上;另乙個叫片段著色器(fragment shader),它將作用於每乙個取樣點。我們採用4倍抗鋸齒,因此每個畫素有四個取樣點。
如果我們打算從乙個著色器向另乙個著色器傳送資料,我們必須在傳送方著色器中宣告乙個輸出,在接收方著色器中宣告乙個類似的輸入。當型別和名字都一樣的時候,opengl就會把兩個變數鏈結到一起,它們之間就能傳送資料了(這是在鏈結程式物件時完成的)。
二: 頂點著色器
頂點著色器應該接收的是一種特殊形式的輸入,否則就會效率低下。頂點著色器的輸入特殊在,它從頂點資料中直接接收輸入。
為了定義頂點資料該如何管理,我們使用location這一元資料指定輸入變數,這樣我們才可以在cpu上配置頂點屬性。比如:layout (location = 0)。頂點著色器需要為它的輸入提供乙個額外的layout標識,這樣我們才能把它鏈結到頂點資料。
為了設定頂點著色器的輸出,我們必須把位置資料賦值給預定義的gl_position變數,它在幕後是vec4型別的。在main函式的最後,我們將gl_position設定的值會成為該頂點著色器的輸出。由於我們的輸入是乙個3分量的向量,我們必須把它轉換為4分量的。我們可以把vec3的資料作為vec4構造器的引數,同時把w分量設定為1.0f(我們會在後面解釋為什麼)來完成這一任務。
將更多的屬性資料如顏色等新增進頂點資料中:
4.1 調整頂點著色器,使它能夠接收顏色值作為乙個頂點屬性輸入。需要注意的是我們用layout識別符號來把acolor屬性的位置值設定為1。
4.2 因為我們新增了另乙個頂點屬性,並且更新了vbo的記憶體,我們就必須重新配置頂點屬性指標。
三: 片段著色器
片段著色器(fragment shader)是第二個也是最後乙個我們打算建立的用於渲染三角形的著色器。片段著色器所做的是計算畫素最後的顏色輸出。
片段著色器需要乙個vec4顏色輸出變數,因為片段著色器需要生成乙個最終輸出的顏色。如果你在片段著色器沒有定義輸出顏色,opengl會把你的物體渲染為黑色(或白色)。
片段著色器中進行的所謂片段插值(fragment interpolation)的結果。當渲染乙個三角形時,光柵化(rasterization)階段通常會造成比原指定頂點更多的片段。光柵會根據每個片段在三角形形狀上所處相對位置決定這些片段的位置。
這也就是為什麼只設定了頂點的顏色,畫出來的三角形都有顏色了。即:我們有3個頂點,和相應的3個顏色,從這個三角形的畫素來看它可能包含50000左右的片段,片段著色器為這些畫素進行插值顏色。如果你仔細看這些顏色就應該能明白了:紅首先變成到紫再變為藍色。片段插值會被應用到片段著色器的所有輸入屬性上。
四: uniform變數
首先,uniform是全域性的(global)。全域性意味著uniform變數必須在每個著色器程式物件中都是獨一無二的,而且它可以被著色器程式的任意著色器在任意階段訪問。
第二,無論你把uniform值設定成什麼,uniform會一直儲存它們的資料,直到它們被重置或更新。
如果你宣告了乙個uniform卻在glsl**中沒用過,編譯器會靜默移除這個變數,導致最後編譯出的版本中並不會包含它,這可能導致幾個非常麻煩的錯誤。
給uniform變數新增資料:我們首先需要找到著色器中uniform屬性的索引/位置值。當我們得到uniform的索引/位置值後,我們就可以更新它的值了。
我們用glgetuniformlocation查詢uniform ourcolor的位置值。我們為查詢函式提供著色器程式和uniform的名字(這是我們希望獲得的位置值的**)。如果glgetuniformlocation返回-1就代表沒有找到這個位置值。
最後,我們可以通過gluniform4f函式設定uniform值。注意,查詢uniform位址不要求你之前使用過著色器程式,但是更新乙個uniform之前你必須先使用程式(呼叫gluseprogram),因為它是在當前啟用的著色器程式中設定uniform的。
著色器(Shader)之頂點著色器
頂點著色器其實就是我們自己編寫的一段在gpu中執行的程式,有了頂點著色器,我們就可以從固定的功能流水線中代替一些模組,從而獲得更多的頂點操作的靈活性。對於頂點位置進行操作的的能力具有廣泛的應該場合 織物模擬 粒子系統的點尺寸處理等。可程式設計流水線中的頂點結構比固定的流水線具有更加豐富的資料。首先我...
頂點著色器與片元著色器
頂點著色器 在管線中的位置 1號 這圖作的跟病毒似的 可以替代下面這些傳統的操作 頂點變換 法線變化及規範化 紋理座標生成 紋理座標變換 光照彩色材質應用 頂點著色器可以用來指定一系列完全通用的 並將應用於各個頂點及相關資料上的操作。理解這點很重要。頂點著色器不會取代一次需要多個頂點的情況或者需要拓...
HLSL頂點著色器
1.在文字檔案裡編寫頂點著色器 hlsl語言 2.編譯著色器 d3dxcompileshaderfromfile 3.建立頂點著色器 createvertexshader 4.獲取hlsl語言中變數控制代碼 getconstantbyname 5.根據控制代碼給hlsl語言中的變數傳值 id3dxc...