《WebGL 編程指南》筆記 —— 第二章 WebGL入門

  1. 默認情況下,canvas是透明的。

  2. canvas可以靈活地支持二維圖形和三維圖形劳吠,它不直接提供繪圖方法,而是提供一種叫上下文(context)的機制來進行繪圖宪赶。

  3. WebGL 中的顏色取值rgba繼承OpenGL宗弯, 取值為0.0 — 1.0

gl.clearColor()

如果沒有指定背景色,默認值如下:

default-bg-color
  1. gl.clear(gl.COLOR_BUFFER_BIT)清空繪圖區(qū)域搂妻,實際上是在清空顏色緩沖區(qū)(color buffer)蒙保。
    WebGL中除了顏色緩沖區(qū),還有比如深度緩沖區(qū)(DEPTH_BUFFER_BIT)欲主、模板緩沖區(qū)(STENCIL_BUFFER_BIT)等邓厕。

  2. gl.clearColor() 指定了背景色以后,背景色會駐存在WebGL系統中扁瓢,在下一次調用gl.clearColr()方法前不會改變详恼。即,如果后面你想用同一種顏色再清空一次繪圖區(qū)引几,沒必要再指定一次背景色昧互。

  3. WebGL依賴一種新的稱為著色器(shader)的繪圖機制。

  4. WebGL需要兩種著色器:

(1)頂點著色器(Vertex shader):用來描述頂點的特性(如位置伟桅、顏色等)敞掘。
(2)片元著色器(Fragment shader) : 進行逐片處理過程(如光照等),片元也可以理解為像素(圖像的單元)楣铁。

  1. WebGL程序執(zhí)行流程
webgl-flow

最右邊的是顏色緩沖區(qū)不是瀏覽器玖雁,因為顏色緩沖區(qū)的內容會自動顯示在瀏覽器中。

  1. 初始化著色器initShaders()的行為
initShades()

在初始化著色器之前盖腕,頂點著色器和片元著色器都是空白的赫冬,我們需要將字符串形式的著色器代碼從JavaScript傳給WebGL系統,并建立著色器赊堪,這就是initShaders()所做的事情面殖。

注意:

著色器代碼運行在WebGL系統中,而不是JavaScript程序中哭廉。
頂點著色器先執(zhí)行脊僚,片元著色器后執(zhí)行。
  1. WebGL程序包括運行在瀏覽器中的JavaScript運行在WebGL 系統中的著色器這兩部分遵绰。

  2. 頂點著色器

var VSHADER_SOURCE = 
 'void main() {\n' +
 ' gl_Position = vec4(0.0, 0.0, 0.0, 1.0);\n' + // Set the vertex coordinates of the point
 ' gl_PointSize = 10.0;\n' + // Set the point size
 '}\n';

(1)void → 沒有返回值
(2)不能為main函數指定參數
(3)gl_Position 表示位置辽幌,是內置變量,必須被賦值椿访,否則著色器無法工作
(4)gl_PointSize 表示尺寸乌企,也是內置變量,默認值為1.0

vshader
GLSE_data_type
vec4
gl_Position = vec4(0.0, 0.0, 1.0, 1.0)

前三個分量分別為X, Y, Z成玫,最后一個分量為 齊次坐標

齊次坐標
  1. 片元著色器
// Fragment shader program
var FSHADER_SOURCE =
 'void main() {\n' +
 ' gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n' + // Set the point color
 '}\n';
fshader
  1. 繪制操作
    步驟:
    (1)清空繪制區(qū)
    (2)gl.drawArrays(mode, first, count)
gl.drawArrays()

gl.drawArrays(mode, first, count) 將會執(zhí)行 count

shader-flow
  1. WebGL 坐標系統
webgl-coord
  1. attribute 變量 和 uniorm 變量
    attribute 變量 : GLSL ES變量加酵,傳輸的是那些與頂點相關的數據(外部向頂點著色器傳輸拳喻,只有頂點著色器能使用)。
    uniform 變量: 傳輸的是那些與所有頂點都相同(或與頂點無關)的數據 (數據傳輸的目標是片元著色器猪腕,而非頂點著色器)冗澈。
data-transfer

為了使用 attribute 變量:示例程序需要包含以下步驟:

(1)在頂點著色器中,聲明 attribute 變量陋葡;

attribute vec4 a_Position;

attribute 被稱為存儲限定符(storage qualifier)亚亲,它表示接下來的變量,attribute變量必須聲明為全局變量腐缤。

storage-qualifier

(2)將 attribute 變量賦值給 gl_Position 變量捌归;

先獲取 attribute變量的存儲位置:

var a_Position = gl.getAttribLocation(gl.program, 'a_Position');

gl.program => 程序對象,包含了頂點著色器片元著色器

gl.getAttribLotation()

(3)向 attribute 變量傳輸數據岭粤;
將頂點位置傳輸給 attribute 變量:

gl.vertexAttrib3f(a_Position, 0.0, 0.0, 0.0);
vertexAttrib3f

gl.vertexAttrib3f()的同族函數:

vertexAttribnf

WebGL 相關函數命名規(guī)范:


webgl-function-standard

使用 uniform 變量步驟:
(1)在片元著色器中準備 uniform 變量惜索;

uniform vec4 u_FragColor;
uniform-declaration

precision mediump float; 精度限定詞(precision qualifier) ,指定變量的范圍(最大值與最小值)和精度

(2)用這個 uniform 變量向 gl_FragColor 賦值绍在;
獲取 uniform 變量的存儲地址门扇。

getUniformLocation.png

(3)將顏色數據從JavaScript傳給該 uniform 變量。
uniform 變量賦值 gl.uniform4f(location, v0, v1, v2, v3)

uniform4f

gl.uniform4f()的同族函數

uniformnf
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末偿渡,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子霸奕,更是在濱河造成了極大的恐慌溜宽,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件质帅,死亡現場離奇詭異适揉,居然都是意外死亡,警方通過查閱死者的電腦和手機煤惩,發(fā)現死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門嫉嘀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人魄揉,你說我怎么就攤上這事剪侮。” “怎么了洛退?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵瓣俯,是天一觀的道長。 經常有香客問我兵怯,道長彩匕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任媒区,我火速辦了婚禮驼仪,結果婚禮上掸犬,老公的妹妹穿的比我還像新娘。我一直安慰自己绪爸,他們只是感情好湾碎,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著毡泻,像睡著了一般胜茧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仇味,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天呻顽,我揣著相機與錄音,去河邊找鬼丹墨。 笑死廊遍,一個胖子當著我的面吹牛,可吹牛的內容都是我干的贩挣。 我是一名探鬼主播喉前,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼王财!你這毒婦竟也來了卵迂?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绒净,失蹤者是張志新(化名)和其女友劉穎见咒,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體挂疆,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡改览,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了缤言。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宝当。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胆萧,靈堂內的尸體忽然破棺而出庆揩,到底是詐尸還是另有隱情,我是刑警寧澤鸳碧,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布盾鳞,位于F島的核電站,受9級特大地震影響瞻离,放射性物質發(fā)生泄漏腾仅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一套利、第九天 我趴在偏房一處隱蔽的房頂上張望推励。 院中可真熱鬧鹤耍,春花似錦、人聲如沸验辞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跌造。三九已至杆怕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壳贪,已是汗流浹背陵珍。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留违施,地道東北人互纯。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像磕蒲,于是被迫代替她去往敵國和親留潦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容