Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WebGL2入門

Avatar for Rintarooo Rintarooo
November 11, 2023

 WebGL2入門

Avatar for Rintarooo

Rintarooo

November 11, 2023
Tweet

Other Decks in Programming

Transcript

  1. コンテンツ Contents • WebGLとは • Hands-on⓪ • Hands-on① • シェーダーとは

    • Hands-on② • レンダリングパイプライン • Hands-on③ • VBO, IBO and VAO • Hands-on (optional) 2
  2. WebGLとは • Javascriptで呼び出せる(Webブラウザ上で動く)グラフィックスAPI。 • 呼び出す上で、ライブラリのインストールやプラグインは不要。 グラフィックスAPIとは? 8 • WebGLはライブラリではなく, 「みんな〜!こういう風に実装しようね!」という、仕様書※のようなもの。

    • 実際に実装されるAPIの内部処理は、Intel, NVIDIA, AMDなどの CPUやGPUの開発会社(ベンダー)に委ねられる。(差はほぼ無いらしい) 参考:OpenGLは普通のライブラリとは違う グラフィックスの基礎 ※仕様を策定している非営利団体:Khronos Group
  3. WebGLの位置付け (Appleが開 発元) 抽象度 (下に行くほどローレベル) PyOpenGL • WebGLは、ローレベル※なAPI • 抽象度の高いライブラリやCG系のソ

    フトは、描画する際に、 内部的にローレベルのAPIを呼び出 すこともある (Direct3D) (Microsoftが 開発元) 参考:WebGLのなりたち ライブラリ グラフィックスAPI CG系のソフト 10 抽象化 派生 派生 DirectX 12 ※ローレベル =ハードウェア側に近い。  結果として、コードの記述量が多くなる。
  4. なぜWebGLを学ぶ? • より抽象度の高い便利なCGソフトやライブラリを勉強する時、 ◦ WebGLのような、ローレベルAPIに触れておくことで、 内部処理の知識を流用して、安易に扱えれるようになる◎ • 一方、WebGLではなく、 ◦ Vulkanだと、

    ▪ ローレベル過ぎて、学習コストがあまりにも高過ぎる。 ◦ OpenGLだと、 ▪ WebGLと比べて、環境作るハードル高め (GLFW, GLADなどのライブラリ要る)。 ▪ Apple、独自のMetalなどのAPIへの移行を推奨 参考:OpenGLを勉強する必要はあるのか 12
  5. Hands-on⓪ : Canvasを作ってみる 19 3. `src/sample0_hello_world_canvas/index.html`を右クリックして、 Live Serverで開く $ code

    WebGL2-tutorial/ 2. codeコマンドで、VSCodeで開く (VSCodeユーザ向け) VSCodeの拡張機能であるLive Server
  6. Hands-on⓪ : Canvasを作ってみる 20 2. VSCode以外のユーザーは、Pythonの標準のhttpパッケージの serverモジュール使って、ローカルサーバーを起動 $ python3 -m

    http.server 3000 参考:簡単なローカルサーバーの立て方 (非VSCodeユーザ向け※ ) $ cd WebGL2-tutorial/src/sample0_hello_world_canvas 3. 指定したポート番号(この例だと、3000)に、ブラウザから `http://localhost:3000`にアクセス ※Macのopenコマンドは、後にモジュールをimportしたjsを使う時 にエラーになるので非推奨
  7. Hello World! WebGLの中身 26 1. (L6) html側で定義したcanvasのidを指定して、どのcanvasに描画するか決める 2. (L9) GLコンテキストと呼ばれる、描画命令を司るオブジェクトを作成。

    この時に、引数に”webgl”ではなく、”webgl2”を指定。 3. (L23) 色を指定して、canvasをクリアする src/sample1_hello_world_webgl/hello_webgl.jsの解説 ID : webgl-canvas-id
  8. Hello World! WebGLの中身 27 1. (L6) html側で定義したcanvasのidを指定して、どのcanvasに描画するか決める 2. (L9) GLコンテキストと呼ばれる、描画命令を司るオブジェクトを作成。

    この時に、引数に”webgl”ではなく、”webgl2”を指定。 3. (L23) 色を指定して、canvasをクリアする src/sample1_hello_world_webgl/hello_webgl.jsの解説 GLコンテキスト
  9. Hello World! WebGLの中身 28 1. (L6) html側で定義したcanvasのidを指定して、どのcanvasに描画するか決める 2. (L9) GLコンテキストと呼ばれる、描画命令を司るオブジェクトを作成。

    この時に、引数に”webgl”ではなく、”webgl2”を指定。 3. (L20)(L23) 色を指定して、canvasをクリアする src/sample1_hello_world_webgl/hello_webgl.jsの解説
  10. 頂点シェーダー 41 • シェーダー部分は、GLSL(GL Shading Language)と呼ばれる 特有のシェーダー言語で書かれる。 ◦ GLSLの文法≠javascriptの文法 •

    WebGL2で使われるシェーディング言語はGLSL。一方、厳密には、WebGL2 はOpenGLではなくOpenGL ES3.0の仕様に基づくので、GLSLのサブセット であるESSLと呼ぶのが正しいらしい。 (0.3, 0.3) (-0.3, -0.3) (0.3, -0.3) (-0.3, 0.3) src/sample2_2d_square/shaders/vertex-shader-glsl.js
  11. 1. 空のバッファを作成(=GPU上のメモリ確保) 2. (L52)作成したバッファに対して、 gl.ARRAY_BUFFERをバインド(=バッファの種類を、割り当てる) 3. 作成した空のバッファに、 頂点のデータ(例:positions=[0.3,0.3,...])を入れて、 バッファを埋める(=CPU側からGPU上のメモリに、データを転送して格納) バッファの初期化②

    66 このバッファは、頂点データだよ! シェーダー側で読み取っていいよ! バインド済み • gl.ARRAY_BUFFER =頂点データ(座標、色、法線など) • gl.ELEMENT_ARRAY_BUFFER =頂点の順番を表すデータ バッファの種類は2種類。
  12. バッファの初期化③ • 頂点のデータの配列をCPU側で宣言(L46)。 67 pos[0] =0.3 pos[1] =0.3 pos[2] =-0.3

    今回、GPU側に転送したい頂点のデータ。 変数宣言時には、VRAM上(CPU側)にある。 正方形の頂点の2D座標
  13. 頂点シェーダーはバッファに格納された値を使いたい 74 頂点シェーダー フラグメント シェーダー (0.3, 0.3) (-0.3, -0.3) (0.3,

    -0.3) (-0.3, 0.3) pos[0] =0.3 pos[1] =0.3 pos[2] =-0.3 バインド済み 頂点データが格納された GPU上のバッファ 頂点のデータ 使いたい〜!
  14. Attributeとは 76 頂点シェーダー 頂点のデータ 使いたい〜! pos[0] =0.3 pos[1] =0.3 pos[2]

    =-0.3 バインド済み 頂点データが格納された GPU上のバッファ Attribute =頂点シェーダーの入力変数のこと 参考:WebGL2で、頂点シェーダー内での変数宣言の際の修飾子が、 attributeからinに変更。
  15. Attributeのポインタでバッファを指し示す 77 頂点シェーダー 頂点のデータ 使いたい〜! pos[0] =0.3 pos[1] =0.3 pos[2]

    =-0.3 バインド済み 頂点データが格納された GPU上のバッファ ポインタ Attribute =頂点シェーダーの入力変数のこと
  16. Attributeのポインタでバッファを指し示す 78 頂点シェーダー pos[0] =0.3 pos[1] =0.3 pos[2] =-0.3 バインド済み

    頂点データ Attribute ポインタ バッファをAttributeのポインタで指し、頂点シェーダーに分かるように、バッファに 格納されたデータの説明をしてあげる どんな頂点の データなの〜? draw-scene.js(L10)
  17. Attributeの有効化 79 頂点シェーダー pos[0] =0.3 pos[1] =0.3 pos[2] =-0.3 バインド済み

    頂点データ Attribute ポインタ じゃあ使うね〜! Attributeを有効化 draw-scene.js(L11)
  18. • バッファの種類3つ • VBO、IBO、VAO ◦ VBOとは? ▪ Vertex Buffer Object(頂点バッファオブジェクト)

    ◦ IBOとは? ▪ Index Buffer Object(インデックスバッファオブジェクト) ◦ VAOとは? ▪ Vertex Array Object 90 バッファの種類
  19. VBO • VBOとは? ◦ Vertex Buffer Object(頂点バッファオブジェクト) • 頂点の座標、色、法線などの頂点のデータを表すバッファの名称。 91

    (0.3, 0.3) (-0.3, -0.3) (0.3, -0.3) (-0.3, 0.3) (0.3, 0.3) (-0.3, -0.3) (0.3, -0.3) (-0.3, 0.3) (0.3, 0.3) (-0.3, -0.3) (0.3, -0.3) (-0.3, 0.3) 頂点の座標 VBO1つ 頂点の座標+色 VBO2つ 頂点の座標+色+法線 VBO3つ
  20. IBO • IBOとは? ◦ Index Buffer Object(インデックスバッファオブジェクト) ◦ 頂点のインデックスの配列(描画の順番を表す。) •

    同じ頂点データを使い回す時に有効。 92 • バインドするときにのバッファの種類を gl.ARRAY_BUFFERではなく、 gl.ELEMENT_ARRAY_BUFFER • ドローコールの際に、 gl.drawArrays()ではなく、gl.drawElements()
  21. VBO • VBOとは? ◦ Vertex Buffer Object(頂点バッファオブジェクト) • 頂点の座標、色、法線などの頂点のデータを表すバッファの名称。 94

    (0.3, 0.3) (-0.3, -0.3) (0.3, -0.3) (-0.3, 0.3) (0.3, 0.3) (-0.3, -0.3) (0.3, -0.3) (-0.3, 0.3) (0.3, 0.3) (-0.3, -0.3) (0.3, -0.3) (-0.3, 0.3) 頂点の座標 VBO1つ 頂点の座標+色 VBO2つ 頂点の座標+色+法線 VBO3つ