SlideShare a Scribd company logo
1 of 10
Download to read offline
Real Time
              Image Processing
                        with OpenGL ES 2.0




13年3月24日日曜日
カメラ

          OpenGL ES テクスチャ

          Custom Fragment Shader

              CAEAGLLayer

                UIView



13年3月24日日曜日
カメラ

          OpenGL ES テクスチャ

          Custom Fragment Shader   ・爆速(GPU)
                                   ・多彩な表現
              CAEAGLLayer          ・無限の自由度

                UIView



13年3月24日日曜日
Fragment Shaderって何だよ(怒

              よくある画像処理プログラミング

          const int wide = 100;
          const int high = 100;
          unsigned char pixels[wide * high * 4] = {0};
          for(int y = 0 ; y < high ; ++y)
          {
             for(int x = 0 ; x < wide ; ++x)
             {
                unsigned char *color = pixels + 4 * (y * wide + x);
                color[0] = 32;
                color[1] = 12;
                color[2] = 0;
                color[3] = 120;
             }
          }




13年3月24日日曜日
Fragment Shaderって何だよ(怒


          const int wide = 100;
          const int high = 100;
          unsigned char pixels[wide * high * 4] = {0};
          for(int y = 0 ; y < high ; ++y)
          {
             for(int x = 0 ; x < wide ; ++x)
             {



                                  Fragment Shader!
              }
          }




13年3月24日日曜日
Basics
                                      浮動小数点精度
         precision highp float;

         uniform sampler2D videoInput;        ユーザー定義定数
         uniform float iGlobalTime;
         uniform vec2 iResolution;

         varying highp vec2 uv;
         void main()
         {
             vec2 unused1 = iResolution;
             float unused2 = iGlobalTime;

              gl_FragColor = texture2D(videoInput, uv);
         }
                 出力色                     画像         座標




13年3月24日日曜日
precision highp float;

          uniform sampler2D videoInput;
          uniform float iGlobalTime;
          uniform vec2 iResolution;

          varying vec2 uv;
          void main()
          {
              vec2 unused = iResolution;

              float stongth = sin(iGlobalTime) * 0.5 + 0.5;
              float waveu = sin((uv.y + iGlobalTime) * 20.0) * 0.5 * 0.1 * stongth;
              gl_FragColor = texture2D(videoInput, uv + vec2(waveu, 0));
          }




13年3月24日日曜日
precision highp float;

              uniform sampler2D videoInput;
              uniform float iGlobalTime;
              uniform vec2 iResolution;

              varying vec2 uv;

              void main(void)
              {
                  vec2 unused = iResolution;

                  float blurx = sin(iGlobalTime) * 0.5 + 0.5;
                  float offsetx = blurx * 0.05;

                  vec2 ruv = uv + vec2(offsetx, 0.0);
                  vec2 guv = uv;
                  vec2 buv = uv - vec2(offsetx, 0.0);

                  float r = texture2D(videoInput, ruv).r;
                  float g = texture2D(videoInput, guv).g;
                  float b = texture2D(videoInput, buv).b;

                  gl_FragColor = vec4(r, g, b, 1.0);
              }




13年3月24日日曜日
precision highp float;
          uniform sampler2D videoInput;
          uniform float iGlobalTime;
          uniform vec2 iResolution;
          varying vec2 uv;
          float gray(vec4 color)
          {
              return (color.r + color.g + color.b) * 0.33333333;
          }
          void main(void)
          {
              float unused = iGlobalTime;

              float pixelwide = 1.0 / iResolution.x;
              float pixelhigh = 1.0 / iResolution.y;

              vec4 c = texture2D(videoInput, uv);
              float c_value = gray(c);

              vec4   l   =   texture2D(videoInput,     uv   +   vec2(-pixelwide, 0.0));
              vec4   u   =   texture2D(videoInput,     uv   +   vec2(0.0, pixelhigh));
              vec4   r   =   texture2D(videoInput,     uv   +   vec2( pixelwide, 0.0));
              vec4   b   =   texture2D(videoInput,     uv   +   vec2(0.0, -pixelhigh));

              float difference = 0.0;

              difference       =   max(difference,   abs(c_value     -   gray(l)));
              difference       =   max(difference,   abs(c_value     -   gray(u)));
              difference       =   max(difference,   abs(c_value     -   gray(r)));
              difference       =   max(difference,   abs(c_value     -   gray(b)));

              difference = clamp(difference * 20.0, 0.0, 1.0);

              gl_FragColor = vec4(difference, difference, difference, 1.0);
          }
13年3月24日日曜日
Enjoy Shader!



     https://github.com/Ushio/RealTimeImageProcessing




13年3月24日日曜日

More Related Content

What's hot

シェーダーしよっ☆ Let's play shaders!
シェーダーしよっ☆ Let's play shaders!シェーダーしよっ☆ Let's play shaders!
シェーダーしよっ☆ Let's play shaders!Yuichi Higuchi
 
Quantum computer adder
Quantum computer adderQuantum computer adder
Quantum computer adderRikuyaKubota
 
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」nyagasuki
 
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計UnityTechnologiesJapan002
 
Ijpc2015 2-a ioiウエハース
Ijpc2015 2-a ioiウエハースIjpc2015 2-a ioiウエハース
Ijpc2015 2-a ioiウエハースreew2n
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTtakesako
 
【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しようUnity Technologies Japan K.K.
 
Let's Simulate a Quantum Computer with Pretty Scala
Let's Simulate a Quantum Computer with Pretty ScalaLet's Simulate a Quantum Computer with Pretty Scala
Let's Simulate a Quantum Computer with Pretty ScalaTakatomo Torigoe
 
Coma studyroom
Coma studyroomComa studyroom
Coma studyroomCohei Aoki
 
Qiskit Challenge 2021 Exercise1
Qiskit Challenge 2021 Exercise1Qiskit Challenge 2021 Exercise1
Qiskit Challenge 2021 Exercise1FukiNakamura
 
iOSプログラマへ。HTML5 Canvasがおもしろい!
iOSプログラマへ。HTML5 Canvasがおもしろい!iOSプログラマへ。HTML5 Canvasがおもしろい!
iOSプログラマへ。HTML5 Canvasがおもしろい!cocopon
 
Quantum computer adder grover
Quantum computer adder groverQuantum computer adder grover
Quantum computer adder groverOishiKenta
 
GLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめGLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめYoichi Hirata
 
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編Unity Technologies Japan K.K.
 
Cocos2dshader devcon jp_20120621_en
Cocos2dshader devcon jp_20120621_enCocos2dshader devcon jp_20120621_en
Cocos2dshader devcon jp_20120621_enRicardo Quesada
 
積分要素の過渡応答性(MATLAB)
積分要素の過渡応答性(MATLAB)積分要素の過渡応答性(MATLAB)
積分要素の過渡応答性(MATLAB)Tsuyoshi Horigome
 
3次元図形をSchemeで造ろう!
3次元図形をSchemeで造ろう!3次元図形をSchemeで造ろう!
3次元図形をSchemeで造ろう!vi-iv
 
積分要素の応答性(MATLAB)
積分要素の応答性(MATLAB)積分要素の応答性(MATLAB)
積分要素の応答性(MATLAB)Tsuyoshi Horigome
 
簡単!OpenGL ES 2.0フラグメントシェーダー
簡単!OpenGL ES 2.0フラグメントシェーダー簡単!OpenGL ES 2.0フラグメントシェーダー
簡単!OpenGL ES 2.0フラグメントシェーダーEiji Kamiya
 
2次遅れの積分要素の過渡応答性(MATLAB)
2次遅れの積分要素の過渡応答性(MATLAB)2次遅れの積分要素の過渡応答性(MATLAB)
2次遅れの積分要素の過渡応答性(MATLAB)Tsuyoshi Horigome
 

What's hot (20)

シェーダーしよっ☆ Let's play shaders!
シェーダーしよっ☆ Let's play shaders!シェーダーしよっ☆ Let's play shaders!
シェーダーしよっ☆ Let's play shaders!
 
Quantum computer adder
Quantum computer adderQuantum computer adder
Quantum computer adder
 
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
 
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
 
Ijpc2015 2-a ioiウエハース
Ijpc2015 2-a ioiウエハースIjpc2015 2-a ioiウエハース
Ijpc2015 2-a ioiウエハース
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNT
 
【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう
 
Let's Simulate a Quantum Computer with Pretty Scala
Let's Simulate a Quantum Computer with Pretty ScalaLet's Simulate a Quantum Computer with Pretty Scala
Let's Simulate a Quantum Computer with Pretty Scala
 
Coma studyroom
Coma studyroomComa studyroom
Coma studyroom
 
Qiskit Challenge 2021 Exercise1
Qiskit Challenge 2021 Exercise1Qiskit Challenge 2021 Exercise1
Qiskit Challenge 2021 Exercise1
 
iOSプログラマへ。HTML5 Canvasがおもしろい!
iOSプログラマへ。HTML5 Canvasがおもしろい!iOSプログラマへ。HTML5 Canvasがおもしろい!
iOSプログラマへ。HTML5 Canvasがおもしろい!
 
Quantum computer adder grover
Quantum computer adder groverQuantum computer adder grover
Quantum computer adder grover
 
GLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめGLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめ
 
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
 
Cocos2dshader devcon jp_20120621_en
Cocos2dshader devcon jp_20120621_enCocos2dshader devcon jp_20120621_en
Cocos2dshader devcon jp_20120621_en
 
積分要素の過渡応答性(MATLAB)
積分要素の過渡応答性(MATLAB)積分要素の過渡応答性(MATLAB)
積分要素の過渡応答性(MATLAB)
 
3次元図形をSchemeで造ろう!
3次元図形をSchemeで造ろう!3次元図形をSchemeで造ろう!
3次元図形をSchemeで造ろう!
 
積分要素の応答性(MATLAB)
積分要素の応答性(MATLAB)積分要素の応答性(MATLAB)
積分要素の応答性(MATLAB)
 
簡単!OpenGL ES 2.0フラグメントシェーダー
簡単!OpenGL ES 2.0フラグメントシェーダー簡単!OpenGL ES 2.0フラグメントシェーダー
簡単!OpenGL ES 2.0フラグメントシェーダー
 
2次遅れの積分要素の過渡応答性(MATLAB)
2次遅れの積分要素の過渡応答性(MATLAB)2次遅れの積分要素の過渡応答性(MATLAB)
2次遅れの積分要素の過渡応答性(MATLAB)
 

Viewers also liked

静的リンクライブラリ
静的リンクライブラリ静的リンクライブラリ
静的リンクライブラリushiostarfish _
 
Programmer @jc-21 2014/03/29
Programmer @jc-21 2014/03/29Programmer @jc-21 2014/03/29
Programmer @jc-21 2014/03/29Yuki Higuchi
 
Blur based Weber–Fechner law
Blur based Weber–Fechner lawBlur based Weber–Fechner law
Blur based Weber–Fechner lawushiostarfish _
 
La espiral de la tercera ley de kepler. Astronomía, Sistema Solar, Tierra
La espiral de la tercera ley de kepler. Astronomía, Sistema Solar, TierraLa espiral de la tercera ley de kepler. Astronomía, Sistema Solar, Tierra
La espiral de la tercera ley de kepler. Astronomía, Sistema Solar, TierraJorge Diderot Chelén Franulic
 
2013-07-12 (金) レッツゴーデベロッパー変真 前夜祭
2013-07-12 (金) レッツゴーデベロッパー変真 前夜祭2013-07-12 (金) レッツゴーデベロッパー変真 前夜祭
2013-07-12 (金) レッツゴーデベロッパー変真 前夜祭tototti
 
いろいろ迷子のレンダラー Lost Child Render
いろいろ迷子のレンダラー Lost Child Renderいろいろ迷子のレンダラー Lost Child Render
いろいろ迷子のレンダラー Lost Child Renderushiostarfish _
 
ARC環境で メモリリークを起こす 7つの方法
ARC環境で メモリリークを起こす 7つの方法ARC環境で メモリリークを起こす 7つの方法
ARC環境で メモリリークを起こす 7つの方法ushiostarfish _
 
ハレとケ展 現場のUnity
ハレとケ展 現場のUnityハレとケ展 現場のUnity
ハレとケ展 現場のUnityushiostarfish _
 

Viewers also liked (11)

Lt cocoa
Lt cocoaLt cocoa
Lt cocoa
 
静的リンクライブラリ
静的リンクライブラリ静的リンクライブラリ
静的リンクライブラリ
 
Programmer @jc-21 2014/03/29
Programmer @jc-21 2014/03/29Programmer @jc-21 2014/03/29
Programmer @jc-21 2014/03/29
 
Blur based Weber–Fechner law
Blur based Weber–Fechner lawBlur based Weber–Fechner law
Blur based Weber–Fechner law
 
La espiral de la tercera ley de kepler. Astronomía, Sistema Solar, Tierra
La espiral de la tercera ley de kepler. Astronomía, Sistema Solar, TierraLa espiral de la tercera ley de kepler. Astronomía, Sistema Solar, Tierra
La espiral de la tercera ley de kepler. Astronomía, Sistema Solar, Tierra
 
SWWDC2012_11_17
SWWDC2012_11_17SWWDC2012_11_17
SWWDC2012_11_17
 
2013-07-12 (金) レッツゴーデベロッパー変真 前夜祭
2013-07-12 (金) レッツゴーデベロッパー変真 前夜祭2013-07-12 (金) レッツゴーデベロッパー変真 前夜祭
2013-07-12 (金) レッツゴーデベロッパー変真 前夜祭
 
いろいろ迷子のレンダラー Lost Child Render
いろいろ迷子のレンダラー Lost Child Renderいろいろ迷子のレンダラー Lost Child Render
いろいろ迷子のレンダラー Lost Child Render
 
Metal Fluid Simulation
Metal Fluid SimulationMetal Fluid Simulation
Metal Fluid Simulation
 
ARC環境で メモリリークを起こす 7つの方法
ARC環境で メモリリークを起こす 7つの方法ARC環境で メモリリークを起こす 7つの方法
ARC環境で メモリリークを起こす 7つの方法
 
ハレとケ展 現場のUnity
ハレとケ展 現場のUnityハレとケ展 現場のUnity
ハレとケ展 現場のUnity
 

Similar to Real timeimageprocessing

Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGLMedia Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGLAtsushi Tadokoro
 
Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化Katsutoshi Makino
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Fixstars Corporation
 
プログラミング技法特論第8回
プログラミング技法特論第8回プログラミング技法特論第8回
プログラミング技法特論第8回Noritada Shimizu
 
2012 03-24-titanium plusquicktigame2d
2012 03-24-titanium plusquicktigame2d2012 03-24-titanium plusquicktigame2d
2012 03-24-titanium plusquicktigame2dHiroshi Oyamada
 
coma Creators session vol.2
coma Creators session vol.2coma Creators session vol.2
coma Creators session vol.2Atsushi Tadokoro
 
DeNA TechCon2016 360VR Live Streaming
DeNA TechCon2016 360VR Live StreamingDeNA TechCon2016 360VR Live Streaming
DeNA TechCon2016 360VR Live StreamingTakeyuki Ogura
 
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)Takashi Yoshinaga
 
Androidで画像処理リベンジ
Androidで画像処理リベンジAndroidで画像処理リベンジ
Androidで画像処理リベンジDaisuke Takai
 
Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発Ryo Suzuki
 
2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2dHiroshi Oyamada
 
Cocos2d x-sprite3d
Cocos2d x-sprite3dCocos2d x-sprite3d
Cocos2d x-sprite3daktsk
 
Media Art II 2013 第5回:openFrameworks Addonを使用する
Media Art II 2013 第5回:openFrameworks Addonを使用するMedia Art II 2013 第5回:openFrameworks Addonを使用する
Media Art II 2013 第5回:openFrameworks Addonを使用するAtsushi Tadokoro
 
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介UnityTechnologiesJapan002
 

Similar to Real timeimageprocessing (18)

Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGLMedia Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
 
Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
 
プログラミング技法特論第8回
プログラミング技法特論第8回プログラミング技法特論第8回
プログラミング技法特論第8回
 
2012 03-24-titanium plusquicktigame2d
2012 03-24-titanium plusquicktigame2d2012 03-24-titanium plusquicktigame2d
2012 03-24-titanium plusquicktigame2d
 
coma Creators session vol.2
coma Creators session vol.2coma Creators session vol.2
coma Creators session vol.2
 
DeNA TechCon2016 360VR Live Streaming
DeNA TechCon2016 360VR Live StreamingDeNA TechCon2016 360VR Live Streaming
DeNA TechCon2016 360VR Live Streaming
 
フラグを愛でる
フラグを愛でるフラグを愛でる
フラグを愛でる
 
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
 
Androidで画像処理リベンジ
Androidで画像処理リベンジAndroidで画像処理リベンジ
Androidで画像処理リベンジ
 
Slide
SlideSlide
Slide
 
Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発
 
2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d
 
Cocos2d x-sprite3d
Cocos2d x-sprite3dCocos2d x-sprite3d
Cocos2d x-sprite3d
 
Media Art II 2013 第5回:openFrameworks Addonを使用する
Media Art II 2013 第5回:openFrameworks Addonを使用するMedia Art II 2013 第5回:openFrameworks Addonを使用する
Media Art II 2013 第5回:openFrameworks Addonを使用する
 
CG2013 02
CG2013 02CG2013 02
CG2013 02
 
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
 
KINECT WITH ROS
KINECT WITH ROSKINECT WITH ROS
KINECT WITH ROS
 

Real timeimageprocessing

  • 1. Real Time Image Processing with OpenGL ES 2.0 13年3月24日日曜日
  • 2. カメラ OpenGL ES テクスチャ Custom Fragment Shader CAEAGLLayer UIView 13年3月24日日曜日
  • 3. カメラ OpenGL ES テクスチャ Custom Fragment Shader ・爆速(GPU) ・多彩な表現 CAEAGLLayer ・無限の自由度 UIView 13年3月24日日曜日
  • 4. Fragment Shaderって何だよ(怒 よくある画像処理プログラミング const int wide = 100; const int high = 100; unsigned char pixels[wide * high * 4] = {0}; for(int y = 0 ; y < high ; ++y) { for(int x = 0 ; x < wide ; ++x) { unsigned char *color = pixels + 4 * (y * wide + x); color[0] = 32; color[1] = 12; color[2] = 0; color[3] = 120; } } 13年3月24日日曜日
  • 5. Fragment Shaderって何だよ(怒 const int wide = 100; const int high = 100; unsigned char pixels[wide * high * 4] = {0}; for(int y = 0 ; y < high ; ++y) { for(int x = 0 ; x < wide ; ++x) { Fragment Shader! } } 13年3月24日日曜日
  • 6. Basics 浮動小数点精度 precision highp float; uniform sampler2D videoInput; ユーザー定義定数 uniform float iGlobalTime; uniform vec2 iResolution; varying highp vec2 uv; void main() { vec2 unused1 = iResolution; float unused2 = iGlobalTime; gl_FragColor = texture2D(videoInput, uv); } 出力色 画像 座標 13年3月24日日曜日
  • 7. precision highp float; uniform sampler2D videoInput; uniform float iGlobalTime; uniform vec2 iResolution; varying vec2 uv; void main() { vec2 unused = iResolution; float stongth = sin(iGlobalTime) * 0.5 + 0.5; float waveu = sin((uv.y + iGlobalTime) * 20.0) * 0.5 * 0.1 * stongth; gl_FragColor = texture2D(videoInput, uv + vec2(waveu, 0)); } 13年3月24日日曜日
  • 8. precision highp float; uniform sampler2D videoInput; uniform float iGlobalTime; uniform vec2 iResolution; varying vec2 uv; void main(void) { vec2 unused = iResolution; float blurx = sin(iGlobalTime) * 0.5 + 0.5; float offsetx = blurx * 0.05; vec2 ruv = uv + vec2(offsetx, 0.0); vec2 guv = uv; vec2 buv = uv - vec2(offsetx, 0.0); float r = texture2D(videoInput, ruv).r; float g = texture2D(videoInput, guv).g; float b = texture2D(videoInput, buv).b; gl_FragColor = vec4(r, g, b, 1.0); } 13年3月24日日曜日
  • 9. precision highp float; uniform sampler2D videoInput; uniform float iGlobalTime; uniform vec2 iResolution; varying vec2 uv; float gray(vec4 color) { return (color.r + color.g + color.b) * 0.33333333; } void main(void) { float unused = iGlobalTime; float pixelwide = 1.0 / iResolution.x; float pixelhigh = 1.0 / iResolution.y; vec4 c = texture2D(videoInput, uv); float c_value = gray(c); vec4 l = texture2D(videoInput, uv + vec2(-pixelwide, 0.0)); vec4 u = texture2D(videoInput, uv + vec2(0.0, pixelhigh)); vec4 r = texture2D(videoInput, uv + vec2( pixelwide, 0.0)); vec4 b = texture2D(videoInput, uv + vec2(0.0, -pixelhigh)); float difference = 0.0; difference = max(difference, abs(c_value - gray(l))); difference = max(difference, abs(c_value - gray(u))); difference = max(difference, abs(c_value - gray(r))); difference = max(difference, abs(c_value - gray(b))); difference = clamp(difference * 20.0, 0.0, 1.0); gl_FragColor = vec4(difference, difference, difference, 1.0); } 13年3月24日日曜日
  • 10. Enjoy Shader! https://github.com/Ushio/RealTimeImageProcessing 13年3月24日日曜日