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

WebGL2入門

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
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つ