1.清空繪圖區
清空繪圖區是使用指定的背景顏色填充canvas,使用gl.clearColor設置背景色。gl.clearColor(red, green, blue, alpha)。openGL的顏色取值返回是0-1。
調用gl.clear()函數,用clearColor指定的背景色清空繪圖區域。gl.clear(g.COLOR_BUFFRE_BIT),清理繪圖區域實際上在清理顏色緩沖區(color buffer),傳遞的gl.COLOR_BUFFER_BIT就是在告訴WebGL清理顏色緩沖區。緩沖區還包括:
gl.COLOR_BUFFER_BIT顏色緩沖區、gl.DEPTH_BUFFER_BIT深度緩沖區、gl.STENCIL_BUFFER_BIT模板緩沖區。清理函數分別為gl.clearColor(red,green,blue,alpha)、gl.clearDepth(depth)、gl.clearStencil(s)。
2.什么是着色器
WebGL有兩種着色器:
頂點着色器(Vertex shader):頂點着色器是用來描述頂點特性(如位置、尺寸等)的程序。頂點(vertext)是指二維或三維空間中的一個點,比如二維或三維圖形的端點或交點。
片元着色器(Fragment shader):進行片元處理過程如光照的程序。片元(fragment)是一個WebGL術語,你可以將其理解為像素(圖像的單元)。
3.GLSE中的數據類型
float:表示浮點數
vec4:表示有四個浮點數組成的矢量
mat4:4*4矩陣(WebGL中矩陣是列主序的)
必須注意的是,如果WebGL需要的參數是浮點類型,例如10.0。如果傳遞10會報錯,因為10被認為是整數。
4.vec4函數
我們在使用WebGL時,會給頂點着色器參數賦值,gl_Position的數據類型為vec4,gl_Position = vec4(0.0, 0.0, 0.0, 1.0)。但實際需要的位置坐標只有三個(x,y,z)值。幸好WebGL提供了vec4函數。由4個分量組成的矢量被稱為齊次坐標,他能夠提高三維數據的效率,在三維圖形系統大量使用。如果最后一個分量設置為1.0,那么齊次坐標可以表示前三個分量為坐標值的那個點。所有當需要用齊次坐標表示頂點時,只需要將最后一個分量設置為1.0就可以了。
5.gl.drawArrays(mode, first, count)函數
mode:指定繪制的方式,包括gl.POINTS、gl.LINES、gl.LINE_STRIP、gl.TRIANGLES、gl.TRIANGLE_STRIP、gl.TRIANGLE_FAN。
first:指定從哪個頂點開始繪制(整形數)
count:指定繪制需要用到多少個頂點(整形數)
6.attribute變量
想要將位置信息從javascript程序中傳給頂點着色器。有兩種方式可做到:attribute變量和uniform變量。attribute變量傳輸時那些與頂點相關的數據,uniform變量傳輸的是哪些所有頂點相同(與頂點無關)的數據。例如attribute vec4 a_Position, attribute變量a_Position的類型為vec4。一般attribute變量都以a_開頭,而uniform變量以u_開頭。如何獲取attribute變量的存儲位置?
var a_Position = gl.getAttribLocation(gl.program, 'a_Position');
如何給頂點位置設置值?
gl.vertexAttrib3f(a_Position, 0.0, 0.0, 0.0);
7.gl.getAttribLocation(program, name)函數
program:指定包含頂點着色器和片元着色器的着色器程序對象
name:想要獲取存儲地址的attribute變量的名稱
返回值:大於等於0,attribute變量的存儲地址;小於0,指定的attribute變量不存在
8.gl.vertexAttrib4f(location, v0, v1, v2, v3)函數
location:指定將要修改的attribute變量的存儲位置
v0:attribute變量的第一個分量的值
v1:attribute變量的第二個分量的值
v2:attribute變量的第三個分量的值
v2:attribute變量的第四個分量的值
說明:gl.vertexAttrib3f有幾個同族函數。gl.vertexAttrib1f(location, v0),gl.vertexAttrib2f(location, v0, v1),gl.vertexAttrib3f(location, v0, v1, v2)。
9.gl.getUniformLocation(program, name)
program:指定包含頂點着色器和片元着色器的着色器程序對象
name:想要獲取存儲地址的uniform變量的名稱
返回值:not-null,指定的uniform變量的位置;null,指定的uniform變量不存在,或者其命名以gl_或者webgl_前綴。
說明:getUniformLocation和getAttribLocation的區別在於為null和-1,如果變量不存在時。
10.gl.uniform4f(location, v0, v1, v2, v3)
向location位置處的變量賦值,參數和vertexAttrib4f函數參數相似。
11.gl.uniform4fv(location, [v0, v1, v2, v3])
向location位置處的變量賦值,參數是以數組的形式傳入。
11.gl.uniformMatrix4fv(location, transpose, array)
將array表示的4*4矩陣分配給由location指定的uniform變量。參數:
location:uniform變量的存儲位置。
Transpose:在WebGL中必須指定為false
array:帶傳輸的類型化數組,4*4矩陣按列主序存儲在其中
12.gl.FragCoord
該內置變量的第一個分量和第二個分量表示片元在<canvas>坐標系統中的坐標值
13.gl.drawingBufferWidth/gl.drawingBufferHeight
分別表示顏色緩沖區的寬度和高度