前端圖形學篇爲隨手記,在學習推動過程會根據我的瞭解進行二次修改,文章中的觀點可能來自看到的各個網站書籍,存在的錯誤或不完善的地方請諒解javascript
It's not what you look at that matters, it's what you see.
重要的不是你正看着的是什麼,而是你從中所看到的是什麼。——亨利·戴維·梭羅
頂點前端
頂點是指二維或三維空間中的一個點,好比二維或者三維圖形的端點或交點java
片元web
能夠了解成像素,但包括大小、顏色、光源等元素。編程
頂點着色器(Vertex shader) 用於描述頂點特徵(如位置、顏色等)的程序,它能改變幾何形狀的位置。它處理每一個頂點的數據,例如頂點座標,法線,色彩,和紋理座標。canvas
片元着色器(Fragment shader)進行逐片元處理過程如光照的程序bash
例子中繪製一個10像素大小的點編程語言
着色器採用GLSL ES編程語言,其是OpenGL中GLSL全稱是 Graphics Library Shader Language (圖形庫着色器語言)的一個子集,但其採用類C的寫法並不難理解。
函數
注意:
GLSL ES是大小寫敏感的強類型語言,語句必須以分號(;)結束
GLSL ES是從main()函數開始執行,程序只能有一個mian()函數
頂點着色器指定點的位置及大小學習
var VSHADER_SOURCE =
'void main() {\n}' +
' gl_Position = vec4(0.0, 0.0, 0.0, 1.0)\n' + //齊次座標,浮點數,必須
' gl_PointSize = 10.0;\n' + //浮點數,非必須,默認爲10.0
'}\n';
片元着色器指定點的顏色
var FSHADER_SOURCE =
'void main() {\n}' +
' gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0)'\n' +
'}\n';
着色器以JavaScript字符串形式編寫,主程序就能夠將其傳給webGL進行編譯
初始化着色器
輔助函數initShaders()對字符串編寫的着色器進行初始化
initShaders(gl, vshader, fshader)
參數
gl 指定渲染的上下文
vshader 指定頂點着色器字符串
fshader 指定片元着色器字符串
返回值
true 初始化着色器成功
false 初始化着色器失敗
注意:着色器運行在webGL中,而不是在javascript中。
完整代碼
WebGL程序將頂點的位置座標從JS傳到着色器,而後在對於位置上進行繪製。
attribute變量 傳輸的是頂點相關的數據,全局變量,只能用在頂點着色器
uniform變量 傳輸的是對於全部頂點都相同的數據,全局變量,如顏色
varying變量 是從頂點着色器向片元着色器傳輸數據,須在兩種着色器中共同聲明
主要步驟:
1.着色器中聲明attribute變量
'attribute vec4 a_Position;\n' +複製代碼
<存儲限定符><類型><變量名>
詞attribute爲存儲限定符,聲明成全局變量
2.獲取attribute變量的位置,賦值js中的變量
var a_Position = gl.getAttribLocation(al.program, 'a_Position');複製代碼
3.對attribute變量進行賦值
gl.vertexAttrib3f(a_Position, 0.0, 0.0, 0.0);複製代碼
vertexAttrib3f(location, v1, v2, v3)做爲傳值函數,第一個參數爲傳值參數的地址,後面爲傳遞的數值
同理,存在
vertexAttrib1f(location, v1)
vertexAttrib2f(location, v1, v2)
vertexAttrib4f(location, v1, v2, v3, v4)
vertexAttrib3f中的3f爲參數個數+參數類型,「f」爲浮點數,「i」爲整數
複製代碼
以上步驟能夠動態設置webgl着色器的參數,所以這裏就能夠構成用戶與圖形交互的一個基礎,如鼠標移動,獲取移動的軌跡點,並經過attribute賦值着色器進行繪製。 相對應,若是須要對片元着色器進行處理,則使用uniform進行聲明,getUniformLocation獲取變量存儲地址,uniform4f傳輸數據。
齊次座標
經過(x, y, z, w)描述,等價於三維座標上的(x/w, y/w, z/w),w爲齊次座標系中度量份量,當w爲1時等同三維座標系。