webglことはじめ

73
ことはじめ

Upload: kazuya-hiruma

Post on 22-May-2015

5.426 views

Category:

Technology


1 download

DESCRIPTION

WebGL Tokyo Meet upで話したスライドです。 WebGLのセットアップからGLSLなどの、Hello Worldをざっくりと解説しています。

TRANSCRIPT

Page 1: WebGLことはじめ

ことはじめ

Page 2: WebGLことはじめ

比留間 和也

Page 3: WebGLことはじめ

2月頭に突然の iOSチーム異動

Page 4: WebGLことはじめ

Lobiっていうアプリ作ってます

Page 5: WebGLことはじめ

マイQiita っていうアプリ出しました

Page 6: WebGLことはじめ

作ったもの

Page 7: WebGLことはじめ

Canvas 2DCSS3D

WebGL

iOS8でカヤックサイト見るとロゴが3Dに!(゚∀゚)!

Page 8: WebGLことはじめ

今日のゴール

今回話すことのゴールは、WebGLには興味があるけど3Dということでハードルが高いと感じている人にWebGLやってみようかな、と思ってもらえればゴールだと思っています。

Page 9: WebGLことはじめ

アジェンダ

• WebGLはなにができるようになるの?( ́⊇`)

• WebGLはなにをしているの?(Ծ﹏Ծ )

• WebGLの要、GLSL(シェーダ)(☼Д☼)

• WebGLの実際の実装の流れ=͟ ͟ ͞(͞ ‘ω')

Page 10: WebGLことはじめ

アジェンダ

• WebGLはなにができるようになるの?( ́⊇`)

• WebGLはなにをしているの?(Ծ﹏Ծ )

• WebGLの要、GLSL(シェーダ)(☼Д☼)

• WebGLの実際の実装の流れ=͟ ͟ ͞(͞ ‘ω')

Page 11: WebGLことはじめ

WebGL[1](ウェブジーエル)は、ウェブブラウザで3次元コンピュータグラフィックスを表示させるための標準仕様。OpenGL 2.0もしくはOpenGL ES 2.0をサポートするプラットフォーム上で、特別なブラウザのプラグインなしで、ハードウェアでアクセラレートされた三次元グラフィックスを表示可能にする。 !

技術的には、JavaScriptとネイティブのOpenGL ES 2.0のバインディングである。WebGLは非営利団体のKhronos Groupで管理されている。WebGLはHTMLのcanvas要素を使う。

出典:Wikipedia

Page 12: WebGLことはじめ

• ざっくり一言でいうと「ハードウェアでアクセラレートされた(GPUを使った)高速なレンダリング能力を手に入れられる」ということ。

• 三次元グラフィックスと書かれているが、実際のポイントは「ハードウェアでアクセラレートされる」という点。

• つまりこれは、二次元の表現であったとしてもその恩恵を受けられる、ということ。

Page 14: WebGLことはじめ

アジェンダ

• WebGLはなにができるようになるの?( ́⊇`)

• WebGLはなにをしているの?(Ծ﹏Ծ )

• WebGLの要、GLSL(シェーダ)(☼Д☼)

• WebGLの実際の実装の流れ=͟ ͟ ͞(͞ ‘ω')

Page 15: WebGLことはじめ

WebGL(OpenGL)には パイプラインと呼ばれる 仕組みがあります。

パイプライン(・▽・)

Page 16: WebGLことはじめ

ざっくり言うと

Page 17: WebGLことはじめ

データ(入力)に対して(パイプを通すように)一連の処理を施し、最終的な結果(出力)にすること

Page 18: WebGLことはじめ

パイプラインイメージ

入力 出力

処理

Page 19: WebGLことはじめ

変換パイプライン

Page 20: WebGLことはじめ

変換パイプライン

Page 21: WebGLことはじめ

行列?(‾□‾)

Page 22: WebGLことはじめ

こういうやつです

Page 23: WebGLことはじめ

(゚∀゚)!!

Page 24: WebGLことはじめ

モデル座標変換要は「世界のどこに置くか」の定義( ́⊇`)

Page 25: WebGLことはじめ

ビュー座標変換要は「どこから撮影しているのか」の定義( ́⊇`)

Page 26: WebGLことはじめ

プロジェクション 座標変換

要は「どんなレンズか」の定義( ́⊇`)

Page 27: WebGLことはじめ

行列を使うと、これら複雑な座標変換処理を ひとつの行列にまとめて使いまわせる

( ・∀・)イイ!!

Page 28: WebGLことはじめ

グラフィクスパイプライン

Page 29: WebGLことはじめ

グラフィクスパイプライン

Page 30: WebGLことはじめ

アジェンダ

• WebGLはなにができるようになるの?( ́⊇`)

• WebGLはなにをしているの?(Ծ﹏Ծ )

• WebGLの要、GLSL(シェーダ)(☼Д☼)

• WebGLの実際の実装の流れ=͟ ͟ ͞(͞ ‘ω')

Page 31: WebGLことはじめ

WebGLで一番大事な

シェーダ

Page 32: WebGLことはじめ

OS

シェーダのイメージ

?(๑°⌓°๑)?

シェーダブラウザ

Page 33: WebGLことはじめ

GLSL (OpenGL Shading Language) はGLslangとしても知られ、C言語をベースとした高レベルシェーディング言語である。これはアセンブリ言語やハードウェアに依存した言語を使わないで、開発者がグラフィックスパイプラインを直接制御できるようにOpenGL ARBで策定された。

出典:Wikipedia

Page 34: WebGLことはじめ

つまり、シェーダはGPUを操作する=GPU上で動く

Page 35: WebGLことはじめ

まずはシェーダを 見てみる

Page 36: WebGLことはじめ

頂点シェーダ

// 頂点シェーダソース attribute vec3 position; attribute vec4 color; !uniform mat4 mvpMatrix; !varying vec4 vColor; !void main() { vColor = color; gl_Position = mvpMatrix * vec4(position, 1.0); }

Page 37: WebGLことはじめ

フラグメントシェーダ

// フラグメントシェーダソース precision mediump float; !varying vec4 vColor; !void main() { gl_FragColor = vColor; }

Page 38: WebGLことはじめ

これなら読めそう(゚∀゚)!!

Page 39: WebGLことはじめ

覚えておくべき キーワードは

Page 40: WebGLことはじめ

「attribute、uniform、varying」と 「gl_Position、gl_FragColor」

Page 41: WebGLことはじめ

// 頂点シェーダソース attribute vec3 position; attribute vec4 color; !uniform mat4 mvpMatrix; !varying vec4 vColor; !void main() { vColor = color; gl_Position = mvpMatrix * vec4(position, 1.0); }

変数定義

処理

// フラグメントシェーダソース precision mediump float; !varying vec4 vColor; !void main() { gl_FragColor = vColor; }

変数定義処理

Page 42: WebGLことはじめ

// 頂点シェーダソース attribute vec3 position; attribute vec4 color; !uniform mat4 mvpMatrix; !varying vec4 vColor; !void main() { vColor = color; gl_Position = mvpMatrix * vec4(position, 1.0); }

// フラグメントシェーダソース precision mediump float; !varying vec4 vColor; !void main() { gl_FragColor = vColor; }

attribute(属性)

uniform(一定、同質)

varying(様々な、異なる)

Page 43: WebGLことはじめ

アジェンダ

• WebGLはなにができるようになるの?( ́⊇`)

• WebGLはなにをしているの?(Ծ﹏Ծ )

• WebGLの要、GLSL(シェーダ)(☼Д☼)

• WebGLの実際の実装の流れ=͟ ͟ ͞(͞ ‘ω')

Page 44: WebGLことはじめ

JavaScriptのコードを見てみる

https://github.com/edom18/WebGL-Meetup-sample

サンプルを上げておきました( *́▽`)

Page 45: WebGLことはじめ
Page 46: WebGLことはじめ

これだけ書いて、 実は三角形ひとつだけ…

まぢか( ;́Д`)

Page 47: WebGLことはじめ

でも分解すると

Page 48: WebGLことはじめ

…① WebGLのセットアップ

…② データの準備

…③ 座標変換パイプライン

…④ シェーダの準備と    データのアップロード

…⑤ レンダリング

Page 49: WebGLことはじめ

意外と やってることは少ない

(゚∀゚)!!

Page 50: WebGLことはじめ

ざっくりと ひとつひとつ見ていきます

Page 51: WebGLことはじめ
Page 52: WebGLことはじめ

WebGLで表示する生のデータ

WebGLで表示するための バッファデータ

Page 53: WebGLことはじめ

WebGLShaderオブジェクトの生成

Page 54: WebGLことはじめ

WebGLProgramオブジェクトの生成

Page 55: WebGLことはじめ

WebGLBufferオブジェクトの生成

Page 56: WebGLことはじめ

行列用変数の 初期化

各種行列を生成

Page 57: WebGLことはじめ

attribute変数の インデックスを取得

頂点位置・色データをWebGLに通知

頂点インデックスデータをWebGLに通知

座標変換行列データをUniformとしてWebGLに通知

Page 58: WebGLことはじめ

レンダリングGo!!٩(ˊᗜˋ*)و

Page 59: WebGLことはじめ

でもこれだけ・・・((((;゚Д゚))))

Page 60: WebGLことはじめ

実はほぼ、WebGLと通信するためのコード

Page 61: WebGLことはじめ

準備が整ってしまえば、 データを追加するのは簡単

ε-(́∀`*)ホッ

Page 62: WebGLことはじめ

DEMO

Page 63: WebGLことはじめ

ライブラリを使う

Page 64: WebGLことはじめ

あまりWebGLを生で書くことは少ない

Page 65: WebGLことはじめ

ライブラリを使えば 手軽にWebGLで表現できる

ktkr(゚∀゚)!!

Page 66: WebGLことはじめ

Three.js

Page 67: WebGLことはじめ

WebGLではデファクトスタンダードになりつつある

ライブラリ冒頭のサイコロ給のデモもThree.jsを使っています(ㆆᴗㆆ)

Page 68: WebGLことはじめ

同じような行数で どこまでできるかやってみた

Page 69: WebGLことはじめ
Page 70: WebGLことはじめ

DEMO

Page 71: WebGLことはじめ

ライブラリいいね(゚∀゚)b

Page 72: WebGLことはじめ

明日からWebGLで なにか作ろう!!

Page 73: WebGLことはじめ

ご静聴ありがとうございました