Shader學習筆記,通過GLSL實現(一)

2021-06-03 01:55:26 字數 2999 閱讀 5045

最近一直在專心研究利用glsl編寫shader,寫點東西將自己學的總結一下,把自己學習shader的經歷分享一下,希望能對有興趣學習shader的同學有些幫助,但這些玩意還算不上教程,很多都是我自己在學習中的問題以及如何解決的,有什麼不足還請各位指出,想要系統的學習glsl的話還是推薦大家看《opengl shading language 3rd edition》,但如果你對opengl也一無所知的話,那就請從《opengl programming guide 7th edition》讀起了。

本次主要是給大家乙個glsl的簡單示例,對於一門新的語言或者技術,初學者入門總是要通過閱讀一些示例程式,我在初學glsl的時候也是這樣,但是上網找了一圈發現,網上的大牛們所給的示例大部分都是僅僅有shader的**,而沒有相應的opengl應用程式,好不容易找到乙個完整的也只是簡簡單單的渲染乙個2d三角形,但是如果如果是想渲染乙個帶有光照的3d模型呢?如何在opengl程式中加入對shader的支援呢?如何向shader中傳遞資料呢?等等這些問題雖然書中會有答案,但是卻缺少乙個完整的示例將他們系統的整合起來,下面我就給出乙個利用glsl+opengl實現最基本的binn-phong+lamber光照的的程式,至於具體演算法就不細講了,有興趣的可以自己研究一下,很簡單的。

在本程式中,頂點著色器完成了幾乎所有任務,包括頂點由物體座標系到投影座標系的變換以及所有的光照計算,而片段著色器只是完成了顏色資料的傳遞,但在後面由於一些演算法的要求(例如bumpmap),我們還會將光照計算移到片段著色器中,這裡要注意,其實除了個別一些功能以外(例如頂點的空間變化或者紋理查詢),很多的計算均可以放在頂點著色器或者片段著色器裡,其區別只是計算速度與影象的質量。下面是著色器**:

頂點著色器(vertex shader):

uniform vec3 lightposition;//光源位置

uniform vec3 eyeposition;//相機位置

uniform vec4 ambient;//環境光顏色

uniform vec4 lightcolor;//光源顏色

uniform float ns;//高光係數

uniform float attenuation;//光線的衰減係數

varying vec4 color;//向片段著色其傳遞的引數

void main()

片段著色器(fragment shader):

//這裡的的varying變數名稱要與頂點著色器裡的一樣,否則會編譯錯誤varying vec4 color;

void main()

其實shader程式不是很難寫,我學習的過程中主要是卡在了opengl程式和shader程式的關聯上,其實後來看看並不是太難,總結起來也就是讀取shader**;建立、編譯shader;向shader中傳遞資料,其他的和一般的opengl程式差不多,下面給出opengl程式://標頭檔案是我自己封裝的工具包,功能包括:讀取shader原始檔;初始化shader和program等#include

glfloat ambient[4] = ;

glfloat lightcolor[4] = ;

glfloat eyeposition[3] = ;

glfloat skycolor[3] = ;

glfloat groundcolor[3] = ;

glfloat ns = 8;

glfloat attenuation = 0.1;

glfloat objectsize = 15.0;

gluint program;

gluint vshader , fshader;

void myinit()

void myreshape(int w , int h)

void mydisplay()

void main(int argc , char** argv)

程式效果:

前面說到了我們自己向shader中傳遞矩陣資料,這裡簡單說一下:

在程式中向宣告個變數,例如glfloat modelviewmatrix[16];

然後在完成檢視模型矩陣的設定後呼叫glgetfloatv(gl_modelview_matrix ,modelviewmatrix);

然後在program啟用後呼叫gluniformmatrix4fv(glgetuniformlocation("modelviewmatrix"), 1 , gl_false , modelviewmatrix);

這樣就完成了向shader中傳遞我們自己的矩陣資料。 總的說來整個程式並不是很難,但我是折騰了有一陣才搞成功,估計還是我太水了的緣故吧。。。    

Shader學習筆記

direct和opengl兩種程式設計標準,前者是微軟提供的,一般用於windows平台,而後者是linux android ios等都共同支援的標準。由這兩種標準就衍生出來了集中gpu程式語言,諸如hlsl cg glsl等,在unity裡面,並不直接使用者三種語言去編寫,而是用自己自定義的sha...

Shader 學習筆記 20151031

閱讀了unity shaders and effects cookboot的 custom light model一節。page 17 閱讀了unity online manual關於 custom light model兩段文章 閱讀了博文 unity shaders 初探su ce shader...

Shader 學習筆記 20151102

計算光源法線點乘,也就是它們之間的夾角余弦 float diflight dot s.normal,lightdir 計算視點法線點乘,也就是它們之間的夾角余弦 float rimlight dot s.normal,viewdir 給光源法線點乘搞了乙個hlambert效果 就是讓非光照面也有明暗...