SlideShare a Scribd company logo
FiltersでGLSLを
楽しく学んじゃおう!
2015.02.25 旅する勉強会 比留間 和也
自己紹介
面白法人カヤック
技術部/比留間 和也
HTML5 Confrence 2015
WebGL セッション
WebGL TOKYO MEETUP
Lobiっていうアプリ
作ってます
本題
Filtersって?
FILTERS
普通のカメラの
フィルターアプリ
ではない
自分でフィルターが
作れる
FILTERS
画面にカメラの映像を出すだけのフィルター
言語はGLSL
WebGLで使うアレ
WebGL?
• WebGLでなにができる?( ́ `)
• WebGLはなにをしているの?(Ծ﹏Ծ )
• 今日の本題、GLSL(シェーダ)(☼Д☼)
WebGL[1](ウェブジーエル)は、ウェブブラウザで3次
元コンピュータグラフィックスを表示させるための標準
仕様。OpenGL 2.0もしくはOpenGL ES 2.0をサポート
するプラットフォーム上で、特別なブラウザのプラグイ
ンなしで、ハードウェアでアクセラレートされた三次元
グラフィックスを表示可能にする。
!
技術的には、JavaScriptとネイティブのOpenGL ES 2.0
のバインディングである。WebGLは非営利団体の
Khronos Groupで管理されている。WebGLはHTMLの
canvas要素を使う。
出典:Wikipedia
• ざっくり一言でいうと「ハードウェアでアクセラ
レートされた(GPUを使った)高速なレンダリン
グ能力を手に入れられる」ということ。
• 三次元グラフィックスと書かれているが、実際のポ
イントは「ハードウェアでアクセラレートされる」
という点。
• つまりこれは、二次元の表現であったとしてもその
恩恵を受けられる、ということ。
カメラの映像は
2Dで表現できる
• WebGLでなにができる?( ́ `)
• WebGLはなにをしているの?(Ծ﹏Ծ )
• 今日の本題、GLSL(シェーダ)(☼Д☼)
WebGL(OpenGL)には
パイプラインと呼ばれる
仕組みがあります。
パイプライン(・▽・)
ざっくり言うと
データ(入力)に対して
(パイプを通すように)一連の処理を施し、
最終的な結果(出力)にすること
パイプラインイメージ
入力 出力
処理
変換パイプライン
変換パイプライン
行列?( ̄□ ̄)
こういうやつです
(゚ ゚)!!
モデル座標変換
要は「世界のどこに置くか」の定義( ́ `)
ビュー座標変換
要は「どこから撮影しているのか」の定義( ́ `)
プロジェクション
座標変換
要は「どんなレンズか」の定義( ́ `)
グラフィクスパイプライン
グラフィクスパイプライン
• WebGLでなにができる?( ́ `)
• WebGLはなにをしているの?(Ծ﹏Ծ )
• 今日の本題、GLSL(シェーダ)(☼Д☼)
WebGLで一番大事な
シェーダ
OS
シェーダのイメージ
?(๑ ⌓ ๑)?
シェーダ
ブラウザ
GLSL (OpenGL Shading Language) はGLslangとして
も知られ、C言語をベースとした高レベルシェーディング
言語である。これはアセンブリ言語やハードウェアに依
存した言語を使わないで、開発者がグラフィックスパイ
プラインを直接制御できるようにOpenGL ARBで策定さ
れた。
出典:Wikipedia
つまり、シェーダはGPUを
操作する=GPU上で動く
本来は3Dオブジェクトの
表面の陰影(シェーディング)
をするための言語
1枚のポリゴンの
表面を描く、と考える
これが1枚ポリゴンのシェーダコード
DEMO
フィルターを
作ってみる
今回は代表的なフィルターである
「モザイク」を作ってみます
コード
void main()	
{	
vec2 uv = iScreen;	
uv = floor(uv * iSize * 15.0) / 15.0 / iSize;	
vec4 color = texture2D(iCamera, uv);	
gl_FragColor = vec4(color.rgb, 1.0);	
}
短っΣ( ̄□ ̄;
DEMO
これだけだとつまらないの
で、もう少し手を加えてみる
GLSLでお絵かき
円を描いてみる
bool inCircle(vec2 position, vec2 offset, float size) {	
float len = length(position - offset);	
if (len < size) {	
return true;	
}	
return false;	
}	
!
void main( void ) {	
vec4 red = vec4(1.0, 0.0, 0.0, 1.0);	 	
vec4 white = vec4(1.0, 1.0, 1.0, 1.0);	
vec3 destColor = white;	
vec2 position = (gl_FragCoord.xy * 2.0 - resolution) /
min(resolution.x, resolution.y);	
!
// positionが円の中に入っているか?	
if (inCircle (position, vec2(0.0, 0.0), 0.8)) {	
destColor *= red;	
}	
!
	 	 gl_FragColor = vec4(destColor, 1.0);	
}
DEMO
組み合わせる
const vec3 white = vec3(1.0, 1.0, 1.0);	
!
bool inCircle(vec2 position, vec2 offset, float size) {	
float len = length(position - offset);	
if (len < size) {	
return true;	
}	
return false;	
}	
!
void main( void ) {	
vec2 uv = iScreen;	
uv = floor(uv * iSize * 15.0) / 15.0 / iSize;	
vec4 color = texture2D(iCamera, uv);	
!
vec3 destColor = white;	
vec2 position = (gl_FragCoord.xy * 2.0 - iResolution) / min(iResolution.x,
iResolution.y);	
!
if (inCircle(position, iPosition, 1.0 + (1.0 - iSize))) {	
destColor = color.rgb;	
}	
else {	
destColor = texture2D(iCamera, iScreen).rgb;	
}	
!
gl_FragColor = vec4(destColor, 1.0);	
}
ちょっと解説
大事なポイントは
Filtersで使える変数
• iScreen
• iResolution
• iTime
• iPosition
• iSize
• iCamera
(0, 0)から(1, 1)のUV座標
カメラの解像度
スタート時からの経過時間(秒)
スクロール位置(0∼1)
ピンチサイズ(デフォルトは1)
カメラの映像(テクスチャ)
• iScreen
• iResolution
• iTime
• iPosition
• iSize
• iCamera
(0, 0)から(1, 1)のUV座標
カメラの解像度
スタート時からの経過時間(秒)
スクロール位置(0∼1)
ピンチサイズ(デフォルトは1)
カメラの映像(テクスチャ)
ユーザー操作によって値が変わる
const vec3 white = vec3(1.0, 1.0, 1.0);	
!
bool inCircle(vec2 position, vec2 offset, float size) {	
float len = length(position - offset);	
if (len < size) {	
return true;	
}	
return false;	
}	
!
void main( void ) {	
vec2 uv = iScreen;	
uv = floor(uv * iSize * 15.0) / 15.0 / iSize;	
vec4 color = texture2D(iCamera, uv);	
!
vec3 destColor = white;	
vec2 position = (gl_FragCoord.xy * 2.0 - iResolution) / min(iResolution.x,
iResolution.y);	
!
if (inCircle(position, iPosition, 1.0 + (1.0 - iSize))) {	
destColor = color.rgb;	
}	
else {	
destColor = texture2D(iCamera, iScreen).rgb;	
}	
!
gl_FragColor = vec4(destColor, 1.0);	
}
使っているのはここ
まとめ
• WebGLのめんどくさいセットアップをほぼやって
くれている
• GLSLだけを書いて、すぐに結果を確認できる
• ユーザー操作による動的要素を使ったインタラクショ
ンのあるものも作れる
Filtersは
普通のカメラの
フィルターアプリ
ではない
GLSL学習アプリである(違
気になった人はぜひ
ダウンロードしてみてね☆
ご清聴ありがとうございました

More Related Content

PDF
簡単!OpenGL ES 2.0フラグメントシェーダー
PDF
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
KEY
シェーダーしよっ☆ Let's play shaders!
KEY
Cocos2d Shaders
PDF
GLSLによるシェーダーアートことはじめ
PDF
IbisPaintのOpenGLES2.0
KEY
Core Graphicsでつくる自作UIコンポーネント入門
KEY
Cocoa勉強会201208
簡単!OpenGL ES 2.0フラグメントシェーダー
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
シェーダーしよっ☆ Let's play shaders!
Cocos2d Shaders
GLSLによるシェーダーアートことはじめ
IbisPaintのOpenGLES2.0
Core Graphicsでつくる自作UIコンポーネント入門
Cocoa勉強会201208

What's hot (20)

PDF
新しい暗号技術
KEY
Sencha study
KEY
iOSプログラマへ。HTML5 Canvasがおもしろい!
PDF
Lotus DEvCon 2000 - LotusScript Tips and Techniques
PPTX
Inside of excel 方眼紙撲滅委員会 #pyfes
PDF
SSE4.2の文字列処理命令の紹介
PDF
Android OpenGL HandsOn
PPTX
Shadow gunのサンプルから学べるモバイル最適化
PDF
Popcntによるハミング距離計算
PDF
llvm入門
PDF
怪しいWindowsプログラミング
PPTX
函数プログラミングの エッセンスと考え方
PDF
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
PDF
coma Creators session vol.2
PPTX
CG2013 12
PDF
kagamicomput201706
PDF
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
PDF
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
PDF
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
PDF
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
新しい暗号技術
Sencha study
iOSプログラマへ。HTML5 Canvasがおもしろい!
Lotus DEvCon 2000 - LotusScript Tips and Techniques
Inside of excel 方眼紙撲滅委員会 #pyfes
SSE4.2の文字列処理命令の紹介
Android OpenGL HandsOn
Shadow gunのサンプルから学べるモバイル最適化
Popcntによるハミング距離計算
llvm入門
怪しいWindowsプログラミング
函数プログラミングの エッセンスと考え方
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
coma Creators session vol.2
CG2013 12
kagamicomput201706
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
Ad

Viewers also liked (19)

PDF
Modern OpenGL scientific visualization
KEY
SurfaceTextureとシェーダを使って遊んでみる
PDF
ネイティブ原理主義
PPTX
どこでも動くゲームを作るためのベタープラクティス
PDF
【配布用】Web広告の成功法則_広告の設計と運用改善
PDF
OpenGL 3DCG
PPTX
Live2Dの描画の裏側の話
PPT
視野変換1(基礎編)
PDF
Deploy to Lobi
PDF
Tabc vol3 テクニカルアーティストを始めるにあたって
PPTX
LINE 2016 エンジニアインターン 03
PPTX
LINE 2016 エンジニアインターン 02
PPTX
LINE 2016 エンジニアインターン 01
PDF
中級グラフィックス入門~シャドウマッピング総まとめ~
PDF
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
PDF
Intern2015 01
PDF
Introducing libpd -Pdをアプリのサウンドエンジンに-
PDF
テクニカルアーティストの仕事とスキル ~パイプライン系TAの事例~
PPTX
OpenGLと行列
Modern OpenGL scientific visualization
SurfaceTextureとシェーダを使って遊んでみる
ネイティブ原理主義
どこでも動くゲームを作るためのベタープラクティス
【配布用】Web広告の成功法則_広告の設計と運用改善
OpenGL 3DCG
Live2Dの描画の裏側の話
視野変換1(基礎編)
Deploy to Lobi
Tabc vol3 テクニカルアーティストを始めるにあたって
LINE 2016 エンジニアインターン 03
LINE 2016 エンジニアインターン 02
LINE 2016 エンジニアインターン 01
中級グラフィックス入門~シャドウマッピング総まとめ~
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
Intern2015 01
Introducing libpd -Pdをアプリのサウンドエンジンに-
テクニカルアーティストの仕事とスキル ~パイプライン系TAの事例~
OpenGLと行列
Ad

Similar to FiltersでGLSLを楽しく学んじゃおう! (20)

PDF
WebVR Tokyo Meetup vol2
PDF
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
KEY
初心者向けAndroidゲーム開発ノウハウ
PDF
OpenGL ES Introduction
PPTX
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
PDF
海外ゲーム技術勉強会#1 OGRE3D
PDF
【Unity道場 2月】シェーダを書けるプログラマになろう
KEY
GroovyなAndroidテスト #atest_hack
PDF
SVGでつくるインタラクティブWebアプリケーション
PDF
WebGLことはじめ
PDF
Metroスタイルで花開くか? XAMLベースのUIフレームワーク
PPTX
Open modeler
PDF
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
PDF
スマホにおけるWebGL入門
PDF
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
PDF
Flashup 12 Basic Training of Away3D
PPTX
Visual Studio 2010で楽しくデバッグ
PPTX
Deep Dive C# 6.0
PDF
Creators'night#3今井
PDF
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
WebVR Tokyo Meetup vol2
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
初心者向けAndroidゲーム開発ノウハウ
OpenGL ES Introduction
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
海外ゲーム技術勉強会#1 OGRE3D
【Unity道場 2月】シェーダを書けるプログラマになろう
GroovyなAndroidテスト #atest_hack
SVGでつくるインタラクティブWebアプリケーション
WebGLことはじめ
Metroスタイルで花開くか? XAMLベースのUIフレームワーク
Open modeler
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
スマホにおけるWebGL入門
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Flashup 12 Basic Training of Away3D
Visual Studio 2010で楽しくデバッグ
Deep Dive C# 6.0
Creators'night#3今井
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう

More from Kazuya Hiruma (20)

PDF
Jump & Coin - 空間を超えるゲーム体験 - | LODGE XR TALK
PDF
MESONプロジェクトから学ぶこれからのAR開発に必要なこと
PDF
PORTAL with Nreal in CES 2020 開発の学び @XR Hub
PDF
ARグラスで 魅力的な絵作り
PDF
AWE Nite ARKit3 Hackathon
PDF
レイマーチ入門勉強会資料
PDF
MESONで手がけたARアプリ AR Developer Meetup #2
PDF
みんなレイ飛ばしてる?
PDF
VRゲーム制作楽しいよ! @UnityおとなのLT大会
PDF
ElminaAR - Unity x ARKit 入門Meetup
PPTX
今すぐ始められるモバイルVR〜あなたも今日からVRエンジニア〜
PPTX
UnityでARKitハンズオン
PPTX
すぐそこにある未来〜AR〜
PPTX
VRで酔わないコンテンツ作り
PPTX
WebVRコンテンツ制作入門
PPTX
WebVRってこんなことできるよ!
PPTX
そしてWebVR
PPTX
Unity入門ハンズオン
PPTX
WebVR 酔いづらいコンテンツの作り方
PPTX
WebVRことはじめ
Jump & Coin - 空間を超えるゲーム体験 - | LODGE XR TALK
MESONプロジェクトから学ぶこれからのAR開発に必要なこと
PORTAL with Nreal in CES 2020 開発の学び @XR Hub
ARグラスで 魅力的な絵作り
AWE Nite ARKit3 Hackathon
レイマーチ入門勉強会資料
MESONで手がけたARアプリ AR Developer Meetup #2
みんなレイ飛ばしてる?
VRゲーム制作楽しいよ! @UnityおとなのLT大会
ElminaAR - Unity x ARKit 入門Meetup
今すぐ始められるモバイルVR〜あなたも今日からVRエンジニア〜
UnityでARKitハンズオン
すぐそこにある未来〜AR〜
VRで酔わないコンテンツ作り
WebVRコンテンツ制作入門
WebVRってこんなことできるよ!
そしてWebVR
Unity入門ハンズオン
WebVR 酔いづらいコンテンツの作り方
WebVRことはじめ

FiltersでGLSLを楽しく学んじゃおう!