在shaderdesigner下編shader是最為方便的,但這裡先用opengl下的程式設計來舉例
這幾個shader的實際效果:
1.最簡單的固定單色shader
vertex shader
座標經過投影矩陣變換:vtrans = projection * modelview * incomingvertex
void main()
或者更簡單的方式,使用ftransform函式
void main()
fragment shader賦予畫素乙個固定值的顏色
void main()
2.顏色shader
在opengl程式當中使用 glcolor函式指定顏色時,接收該顏色值的shader
例如opengl程式當中畫乙個紅色茶壺:
glcolor3f(1, 0, 0);
glutsolidteapot(1);
glcolor在shader當中總共涉及四個值
attribute vec4 gl_color;
varying vec4 gl_frontcolor; // writable on the vertex shader
varying vec4 gl_backcolor; // writable on the vertex shader
varying vec4 gl_color; // readable on the fragment shader
流程如下:
opengl程式使用glcolor函式後,將顏色值以attribute gl_color的形式傳給了vertex shader, vertext shader接受到後開始計算gl_fontcolor和gl_backcolor,而在fragment shader則會接受到乙個由fontcolor和backcolor插值計算出來的varying gl_color(注意:該gl_color與vertex shader當中的不同),因而可以基於gl_color開始計算gl_fragcolor
vertex shader
void main()
fragment shader
void main()
3.動態變形shader
隨著時間變動,改變渲染座標。關鍵在於如何把opengl的變數傳遞給shader
比如在opengl中設定乙個時間變數time,初始化為0,每次渲染時增加0.1:
float t = 0;
void renderscene(void)
那麼將其傳遞給shader需要做的是:
1.在初始化階段使用glgetuniformlocation獲取shader裡變數的訪問位置
2.在渲染階段使用gluniform給該訪問位置變數賦值
glint loc;
float t = 0;
void renderscene(void)
void setshaders()
最後在shader中使用時宣告一下即可使用(本例當中讓圖形沿x軸3d翻轉)
vertex shader
uniform float time;
void main()
fragment shader
void main()
4.lambert shader
lambert模型下的shader,只考慮漫反射,反射強度正比於入射光與法線方向的夾角余弦值:io= ld*md*cosθ
ld是散射光顏色(gl_lightsource[0].diffuse),md是材質散射係數(gl_frontmaterial.diffuse),夾角余弦cosθ可由正規化的法線向量(normal)和入射光向量(lightdir)點乘得到。
opengl當中可以對材質和光照的屬性進行設定
float lpos[4] = ;
float lamb[4] = ;
float ldif[4] = ;
float lspe[4] = ;
gllightfv(gl_light0, gl_position, lpos);
gllightfv(gl_light0, gl_ambient, lamb);
gllightfv(gl_light0, gl_diffuse, ldif);
gllightfv(gl_light0, gl_specular, lspe);
glfloat ambient = ;
glfloat diffuse = ;
glfloat specular = ;
glfloat shininess = ;
glmaterialfv(gl_front, gl_ambient, ambient);
glmaterialfv(gl_front, gl_diffuse, diffuse);
glmaterialfv(gl_front, gl_specular, specular);
glmaterialfv(gl_front, gl_shininess, shininess);
vertex shader
void main()
fragment shader
void main()
如果再考慮上環境散射項,那麼opengl中使用gllightfv來設定環境光
float lpos[4] = ;
float lamb[4] = ;
void renderscene(void)
vertex shader
void main()
5.blinn-phong shader
phong光照模型,考慮反射成分(specular項)。其中shininess在opengl中材質可用glmaterialfv進行設定
void main()
gl_frontcolor = ndotl * diffuse + globalambient + ambient +specular;
gl_position = ftransform();
}
6.法線shader
將法線方向對映到顏色空間中,可用於生成法線貼圖
void main()
GLSL的簡單範例
這個例子在 windows下 採用 vc6.0 開發 首先確定你已經安裝並可以正常使用 glew 和 glut 擴充套件庫 第一步,建立頂點著色器和片元著色器檔案 minimal.vert 和 minimal.frag 並匯入到專案中。檔案原始碼如下 頂點著色器 void main 這個頂點著色器非...
GLSL教程 (四)shder的簡單示例
glsl的hello world 這一節中包含乙個最基本的shader,它提供如下功能 頂點變換然後使用單一的顏色渲染圖元。頂點shader 前面已經說過,頂點shader負責完成頂點變換。這裡將按照固定功能的方程完成頂點變換。固定功能流水線中乙個頂點通過模型檢視矩陣以及投影矩陣進行變換,使用如下公...
GLSL教程 (四)shder的簡單示例
glsl的hello world 這一節中包含乙個最基本的shader,它提供如下功能 頂點變換然後使用單一的顏色渲染圖元。頂點shader 前面已經說過,頂點shader負責完成頂點變換。這裡將按照固定功能的方程完成頂點變換。固定功能流水線中乙個頂點通過模型檢視矩陣以及投影矩陣進行變換,使用如下公...