WebGL入門

WebGL 編程指南

一、WebGL 基本認識

WebGL(Web Graphics Library)是一個光柵化引擎洋侨,它可以根據(jù)你的代碼繪制出點毡熏,線和三角形坦敌。它來源于 OpenGL,OpenGL 是使用硬件加速的 GPU 來進行圖形處理的計算機圖形處理庫,而 WebGL 則派生自 OpenGL 的其中一個版本狱窘,使其在 Web 中渲染3D圖形成為可能杜顺。

傳統(tǒng)網(wǎng)頁和 WebGL 網(wǎng)頁的軟件結構

GLSL ES:OpenGL ES 著色器語言(shading language),是一種運行在 GPU 上的和C或C++類似的強類型語言训柴。WebGL 語言使用三種語言進行開發(fā):HTML哑舒、JavaScript 和 GLSL ES。

1. 兩個實現(xiàn)要點:

(1)Canvas:定義網(wǎng)頁上的繪圖區(qū)域幻馁。

(2)著色器:繪制圖形的基石洗鸵。

要使用 WebGL 進行繪圖,就必須使用著色器仗嗦,WebGL 需要兩種著色器來實現(xiàn)圖形的各種渲染效果:

  • 頂點著色器:用來描述頂點特性(如位置膘滨、顏色等)等程序。
  • 片元著色器:進行逐片元處理過程如光照的程序稀拐』鸬耍可以將片元理解為像素(圖像的單元)德撬。
從執(zhí)行 JavaScript 程序到在瀏覽器中顯示結果的過程

在代碼中铲咨,著色器程序是以字符串的形式“嵌入”在 JavaScript 文件中的,在程序真正開始運行前它就已經(jīng)設置好了蜓洪。

大部分 WebGL 程序遵循的流程

WebGL 程序包括運行在瀏覽器中的 JavaScript 和運行在 WebGL 系統(tǒng)的著色器程序這兩個部分纤勒。

2. WebGL 坐標系

右手坐標系
<canvas>坐標系統(tǒng)和 WebGL 在<canvas>上的坐標系統(tǒng)

注意:WebGL 坐標系與 canvas 繪圖區(qū)的坐標系不同,需要將前者映射到后者隆檀。

具體轉換步驟:

(1)將坐標從瀏覽器客戶區(qū)轉換到 <canvas> 坐標系下摇天,通過 e.target.getBoundingClientRect() 可以獲取 <canvas> 在客戶區(qū)中的坐標;
(2)將 <canvas> 坐標系下的坐標轉換到 WebGL 坐標系統(tǒng)中恐仑。

var x = e.clientX;
var y = e.clientY;
var rect = e.target.getBoundingClientRect();
x = ((x - rect.left) - canvas.width / 2) / (canvas.width / 2);
y = (canvas.height  / 2 - (y - rect.top)) / (canvas.height / 2);

3. 著色器變量類型

attribute 變量:屬性泉坐,傳輸與頂點相關的數(shù)據(jù);
uniform 變量:全局變量裳仆,傳輸與所有頂點都相同(或與頂點無關)的數(shù)據(jù)腕让;
varying 變量:可變量,從頂點著色器向片元著色器傳輸數(shù)據(jù)歧斟。

向頂點著色器傳輸數(shù)據(jù)的兩種方式
向片元著色器傳輸數(shù)據(jù)的兩種方式

只有頂點著色器才能使用 attribute 變量记某,使用片元著色器時,就需要使用 uniform 變量和 varying 變量构捡。

// Vertex shader program
var VSHADER_SOURCE =
  'attribute vec4 a_Position;\n' +
  'void main() {\n' +
  '  gl_Position = a_Position;\n' +
  '  gl_PointSize = 10.0;\n' +
  '}\n';

// Fragment shader program
var FSHADER_SOURCE =
  'uniform vec4 u_FragColor;\n' +
  'void main() {\n' +
  '  gl_FragColor = u_FragColor;\n' +
  '}\n';

function main() {
   //...
  // Get the storage location of a_Position
  var a_Position = gl.getAttribLocation(gl.program, 'a_Position');
  if (a_Position < 0) {
    console.log('Failed to get the storage location of a_Position');
    return;
  }

  // Get the storage location of u_FragColor
  var u_FragColor = gl.getUniformLocation(gl.program, 'u_FragColor');
  if (!u_FragColor) {
    console.log('Failed to get the storage location of u_FragColor');
    return;
  }

  //...
  // Pass the position of a point to a_Position variable
  gl.vertexAttrib3f(a_Position, xy[0], xy[1], 0.0);
  // Pass the color of a point to u_FragColor variable
  gl.uniform4f(u_FragColor, rgba[0], rgba[1], rgba[2], rgba[3]);

  //...
}

4. 緩沖區(qū)

緩沖區(qū)

二液南、 場景渲染基本內容

Three.JS Walking Map

Three.JS Walking Map
1. 3D 幾何圖形(3D geometry):點、線勾徽、面
2. 相機(camera)+ 視角(perspective):正交相機滑凉、透視相機髓废、全景相機耕捞、3D相機

相機的類型

透視攝像機
3. 紋理(texture)

紋理是一個數(shù)據(jù)序列户辱,可以在著色程序運行中隨意讀取其中的數(shù)據(jù)卢肃。 大多數(shù)情況存放的是圖像數(shù)據(jù),但是紋理僅僅是數(shù)據(jù)序列若未, 你也可以隨意存放除了顏色數(shù)據(jù)以外的其它數(shù)據(jù)朱嘴。

4. 材質(material)

材質與圖形表示方法是相關的,用點表示使用PointsMaterial粗合,用線表示使用LineXXXMaterial萍嬉,用面表示使用MeshXXXMaterial,用精靈表示使用SpriteMaterial等等隙疚。

這樣劃分是因為不同的表示方式所要求的材質有很大不同壤追。比如用線來表示,由于線沒有光照模型供屉,所以行冰,LineXXXMaterial也沒有關照類的屬性。只有面表示的模型才有光照模型伶丐。光照模型有l(wèi)ambert模型和phong模型悼做,對這兩種光線模型,我們只需要知道哗魂,Lambert模型一般用來表示只有漫反射的物體肛走,如塑料,而phong模型用來表示有鏡面反射的物體啡彬,如鏡子。

  • MeshBasicMaterial故硅、MeshNormalMaterial庶灿、MeshLambertMaterial、MeshPhongMaterial吃衅、MeshStandardMaterial往踢、MeshDepthMaterial
  • LineBasicMaterial、LineDashedMaterial
  • PontsMaterial
  • SpritMaterial
5. 光照(light)

(1)基本光源類型:

平行光(directional light) :平行光的光線是相互平行的徘层,具有方向峻呕。平行光可以看作是無限遠處的光源發(fā)出的光,類似于自然中的太陽光趣效。因為太陽距離地球很遠瘦癌,所以陽光到達地球時可以認為是平行的。平行光可以用一個方向和一個顏色來定義跷敬;

點光源光(point light):點光源光是從一個點向周圍的所有方向發(fā)出的光讯私,類似于人造燈泡的光。我們需要指定點光源的位置和顏色。光線的方向將根據(jù)點光源的位置和被照射之處的位置計算出來斤寇,因為點光源的光線的方向在場景內的不同位置是不同的桶癣。

環(huán)境光(ambient light):又叫間接光,是指那些經(jīng)光源(點光源或平行光源)發(fā)出后娘锁,被墻壁多次反射牙寞,然后找到物體表面上的光,用于模擬真實世界中的非直射光莫秆。環(huán)境光從各個角度照射物體间雀,其強度都是一致的。它不用指定位置和方向馏锡,只需要指定顏色即可雷蹂。

平行光、點光源光和環(huán)境光

(2)反射類型:

漫反射:漫反射針對平行光或點光源而言杯道,其反射光在各個方向是均勻的匪煌。如果物體表面像鏡子一樣光滑,那么光線就會以特定的角度反射出去党巾;但是現(xiàn)實中的大部分材質萎庭,比如紙張、巖石齿拂、塑料等驳规,其表面都是粗糙的,在這種情況下反射光就會以不固定的角度反射出去署海。漫反射就是針對后一種情況而建立的理想反射模型吗购。

環(huán)境反射:環(huán)境反射針對環(huán)境光而言的,其方向可以認為就是入射光的反方向砸狞。由于環(huán)境光照射物體的方式就是個方向均勻捻勉、強度相等的,所以反射光也是個方向均勻的刀森。

Three.js

三踱启、WebVR Tools

Three.js:基于 WebGL,擁有底層API研底,能更深層次地了解 3D 渲染和 WebGL埠偿,☆ star 42808;
A-Frame:基于 Three.js榜晦,開始 WebVR 最簡單的庫冠蒋,社區(qū)很活躍完善,☆ star 8303乾胶;
ReactVR:基于 Three.js浊服,受眾為 React 開發(fā)人員统屈,API 類似于 React Native,☆ star 6147牙躺;
Babylon.js:類似于 Three.js愁憔,為游戲而生,☆ star 7024孽拷。

四吨掌、參考

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市脓恕,隨后出現(xiàn)的幾起案子膜宋,更是在濱河造成了極大的恐慌,老刑警劉巖炼幔,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秋茫,死亡現(xiàn)場離奇詭異,居然都是意外死亡乃秀,警方通過查閱死者的電腦和手機肛著,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跺讯,“玉大人枢贿,你說我怎么就攤上這事〉对啵” “怎么了局荚?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長愈污。 經(jīng)常有香客問我耀态,道長,這世上最難降的妖魔是什么暂雹? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任首装,我火速辦了婚禮,結果婚禮上擎析,老公的妹妹穿的比我還像新娘簿盅。我一直安慰自己挥下,他們只是感情好揍魂,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棚瘟,像睡著了一般现斋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上偎蘸,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天庄蹋,我揣著相機與錄音瞬内,去河邊找鬼。 笑死限书,一個胖子當著我的面吹牛虫蝶,可吹牛的內容都是我干的。 我是一名探鬼主播倦西,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼能真,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扰柠?” 一聲冷哼從身側響起粉铐,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卤档,沒想到半個月后蝙泼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡劝枣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年汤踏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哨免。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡茎活,死狀恐怖,靈堂內的尸體忽然破棺而出琢唾,到底是詐尸還是另有隱情载荔,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布采桃,位于F島的核電站懒熙,受9級特大地震影響,放射性物質發(fā)生泄漏普办。R本人自食惡果不足惜工扎,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衔蹲。 院中可真熱鬧肢娘,春花似錦、人聲如沸舆驶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沙廉。三九已至拘荡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撬陵,已是汗流浹背珊皿。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工网缝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蟋定。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓粉臊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親驶兜。 傳聞我的和親對象是個殘疾皇子维费,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內容

  • 默認情況下,canvas是透明的促王。 canvas可以靈活地支持二維圖形和三維圖形犀盟,它不直接提供繪圖方法,而是提供一...
    fehysunny閱讀 1,551評論 0 3
  • 經(jīng)過這一個月來欲仙欲死的摸索贱枣,總算在摸索出了一些入門webGl的門道。關于webGl的學習颤专,我建議大家去入手一本《...
    CharTen閱讀 3,288評論 4 10
  • WebGL入門demo three.js入門 開場白 哇哦纽哥,繪制氣球耶,在網(wǎng)頁上栖秕?對按核!厲害了簇捍!3D效果圖也能在網(wǎng)...
    caraline閱讀 2,799評論 0 2
  • 轉載自VR設計云課堂[http://www.reibang.com/u/c7ffdc4b379e]Unity S...
    水月凡閱讀 1,016評論 0 0
  • 《喚醒內在天才的秘密》 作者:李勝杰只壳、林青賢 營養(yǎng)早餐(20180703) ——《喚醒內在天才的秘密》摘錄: 正面...
    覺之燈閱讀 129評論 0 0