WebGL 學堂
進度
0/8
互動式教學 · ZH-TW · OPEN SOURCE

在瀏覽器裡,
畫出三維世界。

用八個章節把 WebGLRenderingContext 變成你的畫筆。每一頁都有可編輯的著色器與即時預覽──讀完不只是看懂,是真的會寫。

不必註冊 · 無相依套件
8
章節
24
可編輯範例
3.5h
完整內容
0
相依套件
fig. 0.1 · radial fragment shader60 fps
課程地圖 · CHAPTERS

八個章節,一張地圖。

每一章都是一份能單獨運作的範例與一份可編輯的著色器。讀到哪、寫到哪,progress 會自動存在你的瀏覽器裡。

01
入門

畫布與 Context

Canvas & Context

取得 WebGLRenderingContext、清色、視口設定。

getContextclearColorviewport
尚未開始· 12 分鐘翻開章節 →
02
入門

著色器入門

Shaders 101

vertex / fragment shader 的職責、GLSL 語法、編譯與連結。

createShadercompileShaderlinkProgram
尚未開始· 28 分鐘翻開章節 →
03
基礎

緩衝區與屬性

Buffers & Attributes

VBO 結構、vertexAttribPointer 步長 / 偏移、interleaved 資料。

createBufferbufferDatavertexAttribPointer
尚未開始· 24 分鐘翻開章節 →
04
基礎

變換與矩陣

Transforms & Matrices

model / view / projection、column-major、glMatrix 速覽。

uniformMatrix4fvmat4.perspectivemat4.lookAt
尚未開始· 32 分鐘翻開章節 →
05
進階

紋理對應

Textures

上傳影像、UV 座標、wrap / filter、mipmap。

createTexturetexImage2DtexParameteri
尚未開始· 26 分鐘翻開章節 →
06
進階

光照模型

Lighting

Lambert、Blinn-Phong、法線變換與切線空間。

normalMatrixdot(N,L)pow(spec,shin)
尚未開始· 30 分鐘翻開章節 →
07
進階

索引緩衝與幾何

Indexed Geometry

ELEMENT_ARRAY_BUFFER、drawElements、共用頂點。

ELEMENT_ARRAY_BUFFERdrawElementsUNSIGNED_SHORT
尚未開始· 22 分鐘翻開章節 →
08
進階

後製與 FBO

Post-processing & FBO

Framebuffer Object、render-to-texture、bloom / blur 兩遍渲染。

createFramebufferframebufferTexture2DbindFramebuffer
尚未開始· 36 分鐘翻開章節 →
渲染管線 · GRAPHICS PIPELINE

從 CPU 到像素,
一共五個階段。

一次 gl.drawArrays() 會啟動底下這條 pipeline。資料由左至右流動,每階段的輸出就是下階段的輸入。理解這張圖,就能讀懂任何 WebGL 範例。

01cpu

JS / CPU

  • ·頂點資料
  • ·uniform 設定
  • ·gl.drawArrays()
02gpu

Vertex Shader

  • ·gl_Position
  • ·varying 輸出
  • ·逐頂點計算
03gpu

Rasterizer

  • ·圖元組裝
  • ·裁切 / 剔除
  • ·線性插值
04gpu

Fragment Shader

  • ·gl_FragColor
  • ·紋理採樣
  • ·逐像素計算
05gpu

Framebuffer

  • ·深度測試
  • ·混合 blending
  • ·寫入顏色
← 你寫的 JS螢幕的像素 →
互動工作檯 · INTERACTIVE WORKBENCH

改一行,看一次。

下面是一段完整、可編譯、會跑的 fragment shader。修改裡面的常數、函式、運算子,畫面會在你打字的同時更新。編譯失敗時錯誤訊息會直接出現。

fragment.glsl
preview.canvas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
preview
即時渲染
preset
u_time · u_resolution · u_mouse
提示 · 拖滑鼠進入畫面會影響 u_mouse· 編譯有 250ms 的 debounce· 三個 preset 可一鍵切換
詞彙對照 · GLOSSARY

十個你會反覆遇到的名詞。

中英對照、簡短定義。讀範例卡關時可以回來查。

Shader
著色器
在 GPU 上執行的程式,分為 vertex 與 fragment 兩種主要型態。
01
Buffer
緩衝區
存放在 GPU 記憶體中的資料區塊,通常用來放頂點屬性。
02
Texture
紋理
貼到幾何表面的影像資料,用 UV 座標對應採樣位置。
03
Uniform
統一變數
由 JS 在繪製前設定、整次 draw call 維持不變的全域變數。
04
Attribute
屬性
每個頂點各自不同的輸入資料(位置、法線、UV…)。
05
Varying
變化變數
vertex 傳給 fragment 的值,會被光柵化器在三角形內插值。
06
Framebuffer
幀緩衝區
渲染目標的容器,可以是螢幕或一張可被當紋理使用的離屏紋理。
07
Draw call
繪製呼叫
一次 gl.drawArrays() 或 gl.drawElements() 的執行,會啟動整條 pipeline。
08
Clip space
裁切空間
vertex shader 輸出後的 [-1, 1] 立方體座標系。
09
Depth test
深度測試
依照 Z 值決定哪一片段該保留、哪一片該丟棄。
10
延伸閱讀 · REFERENCES

讀完以後,繼續讀下去。

官方文件、規範、書籍、工具──能讓你走得更遠的六個方向。

官方

MDN · WebGL API

developer.mozilla.org

最完整的中文 / 英文雙語 reference,函式簽名一查就有。

規範

Khronos WebGL Spec

registry.khronos.org

WebGL 1.0 / 2.0 規格書原文。鑽研細節時的最終依據。

書籍

WebGL Programming Guide

松田晃一

入門經典;範例步驟極為清楚,適合一邊讀一邊跟著敲。

範例

WebGL Fundamentals

webglfundamentals.org

從零開始、概念釐清非常仔細,許多名詞的最佳對照教材。

工具

Spector.js

Chrome 擴充

抓取單一 frame、檢視每個 draw call 的狀態,除錯神器。

社群

Shadertoy

shadertoy.com

純 fragment shader 的線上 playground 與作品庫,靈感泉源。

讀者來信 · FAQ

常被問到的問題。

如果你有其他問題,到 GitHub Issues 開一張,會盡快回。

WebGL 對應 OpenGL ES 2.0/3.0,是目前最廣泛支援的 3D API。WebGPU 是新一代規範,更接近 Vulkan/Metal 的低階介面,效能與 compute shader 支援更佳,但瀏覽器支援仍在普及中。學會 WebGL 的觀念後再切換到 WebGPU 很順暢。

準備好寫第一個著色器了嗎?

所有教材免費、開源、可離線使用。第一章只要十二分鐘,畫面就會動起來。