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

WebGL Introduction

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →
Avatar for libitte libitte
August 25, 2014

WebGL Introduction

- WebGL とは?
- 三角形を描いてみる

Avatar for libitte

libitte

August 25, 2014

More Decks by libitte

Other Decks in Programming

Transcript

  1. AGENDA GLSL でできることのデモ WebGL とは? OpenGL というのは... ということでWebGL はこんな感じ とにかく

    WebGL を使ってみる GPU?? 三角形を描いてみる 2 つのシェー ダ uniform を使うと... まとめ 参考リンク
  2. WHAT IS WEBGL? brawser で使える OpenGL ( OpenGL = Open

    なGraphics Library ) HTML5 Canvas 要素を使います(Document Objec Model interfaces).
  3. WHAT IS OPENGL? C-lang 向けの 3D graphics API. ex) 画面消去

    glClearColor(0, 0, 0, 1); // 消去色のRGBA指定 glClear(GL_COLOR_BUFFER_BIT); // 色バッファを消去実行
  4. TRY WEBGL step-1: 描画先になるCanvas オブジェクトを取得する var canvas = document.getElementById('webgl-canvas'); step-2:

    レンダリングコンテキストを取得する var gl = canvas.getContext('webgl'); step-3: WebGL の命令を発行する gl.clearColor(0, 0, 0, 1); // 消去色のR,G,B,A指定 gl.clear(gl.COLOR_BUFFER_BIT); // 色バッファを消去実行
  5. CPU AND GPU GPU = Graphics Processing Unit (CPU) <-->

    (MEM) ^ --- | GraphicsAPI ----- 世界の壁 v (GPU) <--> (GPUMEM)
  6. GPU 周りのデー タを参照できない 周りにデー タを書き込めない 演算後のデー タを見れない 演算元データ 演算後データ [

    ] -> (演算器) -> [ ] [ ] -> (演算器) -> [ ] [ ] -> (演算器) -> [ ] [ ] -> (演算器) -> [ ] [ ] -> (演算器) -> [ ] [ ] -> (演算器) -> [ ] [ ] -> (演算器) -> [ ] [ ] -> (演算器) -> [ ]
  7. DRAW TRIANGLES // 1.描画先になるCanvasオブジェクトを取得する var canvas = document.getElementById('webgl-canvas'); // 2.レンダリングコンテキストを取得する

    var gl = canvas.getContext('webgl'); gl.clearColor(0, 0, 0, 1); gl.clear(gl.COLOR_BUFFER_BIT); /* * 演算器の準備 * GPU のプログラムをセットアップする */ // シェーダの用意 var vertexShaderSource = '\ precision mediump float;\ attribute vec2 vertex;\ void main() {\ gl_Position = vec4(vertex, 0.0, 1.0);\ }\ '; var fragmentShaderSource = '\ precision mediump float;\ void main() {\ gl_FragColor = vec4(1.0, 0.7, 0.6, 1.0);\ }\ '; var vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertexShader, vertexShaderSource);
  8. DRAW TRIANGLES - COORDINATE SYSTEM canvas 要素( 描画領域) の中心が (0,

    0) 2 つの値で1 つの頂点の座標 (x, y) 3 つの座標で1 つの三角形 三角形が6 つあります var vertexData = [ -0.6,-0.4, -0.6,0.4, 0.6,-0.4, 0.6,-0.4, 0.6,0.4, -0.6,0.4, -0.6,0.1, -0.7,0, -0.6,-0.1, 0.6,0.1, 0.7,0, 0.6,-0.1, -0.4,-0.4, -0.3,-0.5, -0.2,-0.4, 0.2,-0.4, 0.3,-0.5, 0.4,-0.4 ];
  9. DRAW TRIANGLES - VERTEX NUM gl.drawArrays(gl.TRIANGLES, 0, 18); 0 番目の頂点から、18

    個の頂点を使う 指定するのは " 頂点の個数" ( 三角形の個数ではない) TRIANGLES を他の値にすると描画形式が変わる 用意した座標デー タの個数と指定頂点の数をあわせること http://www.khronos.org/opengles/sdk/docs/man/xhtml/glDrawA http://d.hatena.ne.jp/nakamura001/20081231/1230719279
  10. DRAW TRIANGLES - COLOR (R, G, B, A) で色を指定します OpenGL

    での色指定はRGB のみ var fragmentShaderSource = '\ precision mediump float;\ void main() {\ gl_FragColor = vec4(1.0, 0.7, 0.6, 1.0);\ }\ ';
  11. TWO SHADERS 用意したデー タの数 = 頂点の数 出力の結果 = 絵 =

    デー タの数 = pixel 数 用意した頂点デー タと出力デー タ数が異なる理由 = 頂点シェー ダとフラグメントシェー ダは テスタライザを介して処理が分離されている
  12. UNIFORM シェー ダプログラムに 外部からパラメー タを指定することができる. 1. シェー ダソー スに uniform

    を記述する 2. getUniformLocation() でハンドルを取得する 3. uniform*() で値を設定する
  13. UNIFORM NOTATION uniform の記述例 precision mediump float; uniform vec4 color;

    // uniform の宣言 void main() { gl_FragColor = color; // uniform を使用 }
  14. DRAW SHADERS var canvas = document.getElementById('webgl-canvas'); var gl = canvas.getContext('webgl');

    gl.clearColor(0, 0, 0, 1); gl.clear(gl.COLOR_BUFFER_BIT); // シェーダの用意 var vertexShaderSource = '\ precision mediump float;\ uniform vec2 offset;\ attribute vec2 vertex;\ void main() {\ gl_Position = vec4(vertex + offset, 0.0, 1.0);\ }\ '; var fragmentShaderSource = '\ precision mediump float;\ uniform vec4 color;\ void main() {\ gl_FragColor = color;\ }\ '; var vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertexShader, vertexShaderSource); gl.compileShader(vertexShader); //バーテックスシェーダーの用意 var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
  15. CONCLUSION WebGL ≒ OpenGL ES 2.0 WebGL は canvas オブジェクトからレンダリングコンテキ

    ストを取得して使う GPU のお仕事は流れ作業 同じ作業を大量のシェー ダで並列に行うのが基本( 事前準 備大事) 周りのデー タを参照できない、 周りに書き込むことがで きない、 演算後のデー タを参照できない WebGL で三角形を描画するには座標を指定する uniform を使うことでシェー ダプログラムに外部から値を 与えることができる