SlideShare ist ein Scribd-Unternehmen logo
1 von 50
GLSLを魔改造してみた
分業可能なエフェクトファイルフォーマットを作る話
1
自己紹介
•石井 翔 (イシイ カケル) @kyasbal_1994
• 21歳(プログラミング歴13年)
• 4月から理科大3年生
(今年はカリフォルニアに留学して
いたため休学中)
• OSS大好き、Web3Dのライブラリ
「jThree」作成中
2
自己紹介
• 石井 翔 (イシイ カケル)
• 21歳(プログラミング歴13年)
• 4月から理科大3年生
(今年はカリフォルニアに留学していたため休学中)
3
今日はWeb3Dにおけるシェーダーの話
4
Web3Dって何がすごいんだっけ?
5
Web3Dのメリット・デメリット
• ユーザーには…
• アクセスの簡単さ(アプリのインストールが必要ない)
• 重いものは現実的に難しい
• エンジニアには…
• 開発環境構築の簡単さ(SDK とかいらない)
• OpenGLと変わらないから普通に難しい
(Unityを使うという選択肢も…?)
6
Web3Dの用途
• ゲームとの親和性は非常に低い
• サービスと結合したUI
(賃貸の内覧、RICHO THETA のギャラリー等)
• アプリのダウンロードの必要がない一過性のもの
(雑誌のおまけ、博物館の案内)
7
最近のWebの文化
• とにかく開発速度。作る→リリース→改善の高速回転。
• 生でWebGLいじってたら間に合わない。
• ツールは最小限に。テキストエディタだけあればできる。
• Unityだとバージョン管理ができない。開発フローのミスマッチ
• 使えるWebエンジニア=フルスタックエンジニアという風潮。
• 彼らが学ぶべき技術
• HTML/CSS/Javascript
• サーバーサイド言語
• サーバーサイドフレームワーク
• データベース
• Javascriptフレームワーク
• CSSフレームワーク
• セキュリティ
• gulpなどの開発環境整備
• AltJS
• インフラ環境の整備
+ GLSL , 3DCG数学 , WebGL?
8
そもそも、WebGLの立ち位置って?
9
WebGLの立ち位置って?
Web主体で見ると? 3D主体で見ると?
Web開発
HTML5
(OpenWeb
Platform)
ココ
3D開発
OpenGL
DirectX
Vulkan
10
お互いにとって小さすぎる領域
11
お互いの理想のWeb3Dを考えてみる
12
それぞれの理想のWeb3D
Web屋
• 一つの表現手法としてWeb3D
• サービス重視
• 数式なんて見たくない
• イベント駆動なプログラム
CG屋
• 手軽な実験環境としてWeb3D
• サービスなんてどうでもいい
• 最適化狂、数学徒
• GL操作部分:
ループ駆動なプログラム
GLSL部分:
全体としてステートレス
(内部はステートを持つが..)
13
理想のWeb3Dのための
エフェクトファイルフォーマットを考える
14
理想のWeb3Dの実現のために
必要なエフェクトに求められること
Web屋のため
• Webの文化に沿ってエフェク
トを使う
• 部品としてシェーダーを利用
したい
CG屋のため
• 注力したいとこだけをいじる。
(無駄なJavascriptはいじらず、
シェーダーだけいじりたい。)
• 簡単に書いて簡単にデバッグ
したい。
15
エフェクトファイルフォーマットをいい感じに決めて、
分業しやすくコンポーネント化してみた
今日の本題
16
このためにjThreeがやった事を紹介します
17
少しだけjThreeの事を話させてください
18
jThreeって?
現在フルスクラッチで新バージョンを作成中のWebGLライブラリ。
• 遅延シェーディングを採用
• Webサービスと融合したWeb3D開発をするためのライブラリ
• ステートレスな部分とステートフルな部分を分割
• jQueryライクな記法によりWebエンジニアに使いやすく
• TypeScriptで型管理されたライブラリ
19
jThreeのファイル構成
3D用のシーン構成等シーンの操作、jQueryっぽい
20
ここにコンポーネント化された
シェーダーを入れたい
21
コンポーネント化されてる例
22
UnityのShaderLab
• UnityにはShaderLabという、
それなりに素晴らしいものがある。
Unityのためにしなければいけない
記法がたくさん。
ShaderLab自体を拡張しにくい
23
Miku Miku Danceの
Miku Miku Effect
• MMDのカスタムエフェクト用ソフト
であるMMEにはシェーダーだけでほとんど
記述できる機能がある。
24
というわけで作った
25
新しいjThreeのファイルを加える
Webエンジニア 3Dエンジニア
26
XMMLで何を成し遂げたいか
• シェーダープログラマーがいじりたいとこだけ気にできる。
• GLSL本体を書ける
• 受け渡し可能なUniform変数、Attribute変数
• レンダラー設定(Culling やDepthTestなど)
• Javascriptは極力触れない
• ウェブプログラマーが部品として利用出来る
• 極力中身を意識しない
• パラメーターを変えることができる
• シェーダー自体が他のエフェクトなどに影響性を持たない
27
XMMLを見てみる
28
XMML → 頂点シェーダー
@fragonlyを消す。
29
XMML → フラグメントシェーダー
@vertonlyを消す。
Attribute変数を消す
30
変数のバインディングも面倒くさい
31
変数を受け渡すために必要な函数たち
• uniform1f
• uniform2f
• uniform3f
• uniform4f
• uniform1i
• uniform2i
• uniform3i
• uniform4i
• uniform1fv
• uniform2fv
• uniform3fv
• uniform4fv
• uniform1iv
• uniform2iv
• uniform3iv
• uniform4iv
• uniformMatrix2fv
• uniformMatrix3fv
• uniformMatrix4fv
• bindTexture
• bindBuffer
• vertexAttribPointer
32
バインドを便利にする
• 変数型ならシェーダーに書いてある
• バインドに必要な引数もシェーダーの中で指定したい
diffuse→ uniform4f
indicies→uniform1fv(長さ10)
変数の一つ上の@から始まる
JSONを読み込んで属性値
として利用する。
33
トゥーンシェーダーを書こう
34
トゥーンシェーダーとは
アニメ調の表現を実現するためのシェーダー
35
トゥーンシェーダーの2要素
• エッジの描画 • 離散的な陰
36
今日はエッジをメインに語ります
37
こんなエッジが欲しい
38
法線成分を微分してやればいい
39
jThreeの法線データ
40
Sobel 微分
•
𝛿𝕗 𝑥,𝑦
𝛿𝑥
=
𝕗 𝑥 + 1, 𝑦 − 1 − 𝕗 𝑥 − 1, 𝑦 − 1 +
2𝕗 𝑥 + 1, 𝑦 − 2𝕗 𝑥 − 1, 𝑦 +
𝕗 𝑥 + 1, 𝑦 + 1 − 𝕗 𝑥 − 1, 𝑦 + 1
•
𝛿𝕗 𝑥,𝑦
𝛿𝑦
=
𝕗 𝑥 − 1, 𝑦 + 1 − 𝕗 𝑥 − 1, 𝑦 − 1 +
2𝕗 𝑥, 𝑦 + 1 − 2𝕗 𝑥, 𝑦 − 1 +
𝕗 𝑥 + 1, 𝑦 + 1 − 𝕗(𝑥 + 1, 𝑓 − 1)
1 0 -1
2 0 -2
1 0 -1
1 2 1
0 0 0
-1 -2 -1
テクスチャのある点の微分係数を知りたい場合に使われる近似手法
41
サービスを考える人が
こんなのいちいち考えてられない!
42
今日は作ってきてみました
43
こんな感じでWebエンジニア
が利用します
44
もっと簡易なエッジを
ライブコーディングします
45
外側だけ考えてみる
46
カリングのおさらい
筒を上から見たイメージ
視点
47
エッジの書き方
筒を上から見たイメージ
視点
この段差がエッジになる
48
おさらい
• 𝐿pixel のエッジを書きたい!
• クリップ空間の座標でポリゴンの座標𝕡0,法線方向に1伸ばした
座標𝕡1を求める。
• 𝑐 = |
𝕡0.𝑥𝑦−𝕡1.𝑥𝑦
2
∗ 𝑆𝑐𝑟𝑒𝑒𝑛𝑆𝑖𝑧𝑒 |をして、スクリーン上での差分
を出す。
• これは1伸ばした時のスクリーン上で何pixelになるかだから、
1/𝑐をすれば、1pxのエッジを書くためののばす距離がわかる。
• あとは、
𝐿
𝑐
だけ法線を伸ばせばいい。
49
最後にまたjThreeの話
• OSSとして開発中(http://github.com/jThreeJS/jThree )
• 仕様策定等slackで行ってます
(レポジトリのslackボタンから誰でも入れます)
• 3月下旬にβ公開予定
• 3月下旬にハンズオンしたい
• 日本発のOSSとしてコミュニティを確立したい
• Contributor募集、Pull request, issue歓迎
•Web3Dで世界を取りに行こうぜ
50

Weitere ähnliche Inhalte

Ähnlich wie チョコ溶かす奴

明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradle
kimukou_26 Kimukou
 

Ähnlich wie チョコ溶かす奴 (16)

Net fringejp2016
Net fringejp2016Net fringejp2016
Net fringejp2016
 
SpringOne Platform 2018 全体報告
SpringOne Platform 2018 全体報告SpringOne Platform 2018 全体報告
SpringOne Platform 2018 全体報告
 
SpringOne Platform 2018 全体報告
SpringOne Platform 2018 全体報告SpringOne Platform 2018 全体報告
SpringOne Platform 2018 全体報告
 
チケット管理システム大決戦第二弾
チケット管理システム大決戦第二弾チケット管理システム大決戦第二弾
チケット管理システム大決戦第二弾
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
 
フロントエンド制作向けビルド ツールGruntがバックエンド 開発でも意外と使える! @M_Ishikawa #yapcasia
フロントエンド制作向けビルド ツールGruntがバックエンド 開発でも意外と使える! @M_Ishikawa #yapcasiaフロントエンド制作向けビルド ツールGruntがバックエンド 開発でも意外と使える! @M_Ishikawa #yapcasia
フロントエンド制作向けビルド ツールGruntがバックエンド 開発でも意外と使える! @M_Ishikawa #yapcasia
 
明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradle
 
Backlogでメールとエクセルから解放された話
Backlogでメールとエクセルから解放された話Backlogでメールとエクセルから解放された話
Backlogでメールとエクセルから解放された話
 
Tokyo r30 beginner
Tokyo r30 beginnerTokyo r30 beginner
Tokyo r30 beginner
 
Groovy Grails eXchage 2014 報告
Groovy Grails eXchage 2014 報告Groovy Grails eXchage 2014 報告
Groovy Grails eXchage 2014 報告
 
Web エンジニアが postgre sql を選ぶ 3 つの理由
Web エンジニアが postgre sql を選ぶ 3 つの理由Web エンジニアが postgre sql を選ぶ 3 つの理由
Web エンジニアが postgre sql を選ぶ 3 つの理由
 
プログラミング言語とシステムデザイン
プログラミング言語とシステムデザインプログラミング言語とシステムデザイン
プログラミング言語とシステムデザイン
 
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
大規模Perl初心者研修を支える技術
大規模Perl初心者研修を支える技術大規模Perl初心者研修を支える技術
大規模Perl初心者研修を支える技術
 
OPTiM_Tech_Night
OPTiM_Tech_NightOPTiM_Tech_Night
OPTiM_Tech_Night
 
Unity/CSharp 3
Unity/CSharp 3Unity/CSharp 3
Unity/CSharp 3
 

Mehr von 翔 石井

Mehr von 翔 石井 (10)

WebでのARには ハードル(闇)がいっぱいある話
WebでのARには ハードル(闇)がいっぱいある話WebでのARには ハードル(闇)がいっぱいある話
WebでのARには ハードル(闇)がいっぱいある話
 
Emscripten night "WebGL + WASM"
Emscripten night "WebGL + WASM"Emscripten night "WebGL + WASM"
Emscripten night "WebGL + WASM"
 
DotsLT AA Overview
DotsLT AA OverviewDotsLT AA Overview
DotsLT AA Overview
 
Grimoire.js Community announcement June 20 2016
Grimoire.js Community announcement June 20 2016Grimoire.js Community announcement June 20 2016
Grimoire.js Community announcement June 20 2016
 
WebGLで浮動小数点テクスチャを扱う話
WebGLで浮動小数点テクスチャを扱う話WebGLで浮動小数点テクスチャを扱う話
WebGLで浮動小数点テクスチャを扱う話
 
jThree community kickoff
jThree community kickoffjThree community kickoff
jThree community kickoff
 
jThree announcment 4-24
jThree announcment 4-24jThree announcment 4-24
jThree announcment 4-24
 
jThree 0.10 alpha release
jThree 0.10 alpha releasejThree 0.10 alpha release
jThree 0.10 alpha release
 
Dynamic lighting and dropping shadow in WebGL
Dynamic lighting and dropping shadow in WebGLDynamic lighting and dropping shadow in WebGL
Dynamic lighting and dropping shadow in WebGL
 
Efficacy of deferred rendering in WebGL
Efficacy of deferred rendering in WebGLEfficacy of deferred rendering in WebGL
Efficacy of deferred rendering in WebGL
 

チョコ溶かす奴