SlideShare a Scribd company logo
簡単!OpenGL ES 2.0
              フラグメントシェーダー
                株式会社アイビス 神谷栄治




12年5月25日金曜日
自己紹介
  • 株式会社アイビス             (社員70名ほど)
     •   iPhone, iPad, Android, タブレット, Webシステムの受託開発など


  • 代表取締役社長            神谷栄治

  • ハンドル:かみやん


  • Twitter:       @kamiyan

  • 自称、ハッカー社長                              前回も言って
                                        みたけど( ´Д`)y━・~~
12年5月25日金曜日
アプリの紹介
              • ibisMail   for iPhone(アイビスメール)

                • 世界初のメールアプリ。国内有料総合1位獲
                  得。

              • ibisMail   for iPad
                • こちらも国内有料総合1位獲得。

              • ibisPaint(アイビスペイント)

                • こちらも国内有料総合1位獲得。
                                                 3冠!!
12年5月25日金曜日
前回iPhoneDev勉強会の反省
     皆様の声



       変態!変態!
              ありがとうございます( ´Д`)y━・~~
12年5月25日金曜日
反省をふまえて
  •IBGLKit
     • ibisPaintのWindow Tool
                    KitはフルC++なので、別途
        OpenGLライブラリをObjective-Cで作りました。

  •Fragment           Shader Base
     • サンプルアプリとしてFragment      Shader Baseというアプ
        リを作りました。


                   夜中コツコツ作るのは楽しい( ´Д`)y━・~~

12年5月25日金曜日
OpenGL ESのメリット(1)

  • 超高速!      iPad(3rd Gen)なら4コア!

  • GPUコアは年々増えていく(PCでは1000コア)


  • CPUで200ms∼400msかかる処理も1ms∼2msでできる


  • ibisPaintでは   iPad (3rd Gen)、2048x1536(3.14Mpixels)で、
     レイヤー6枚で60fps!!


12年5月25日金曜日
OpenGL ESのメリット(2)

  • Core      GraphicsやCore Imageよりも低レベルライブラリ

  • InstagramやiPhotoもES2.0を使っている


  • AndroidやWindows、PS   Suite、WebGLなど他のプラット
     フォームにも移植しやすい




12年5月25日金曜日
Fragment Shader Baseとは
  • 第1回iPhoneDev勉強会の私の発表では「難しい∼」と

     言う声が聞かれた。

  • 反省をふまえ、説明はやめてみんなにフラグメント

     シェーダーを書いてもらおう!

  • iPhoneアプリ上でシェーダー言語でコードを書いて、コ

     ンパイルして、リンクして、実行できれば誰でも体験
     できるよね?
               僕もベットの中でもコード書けるし( ´Д`)y━・~~
12年5月25日金曜日
Fragment Shader Baseデモ中
  • ライブコーディング中∼


  • Instagramのようなカメラフィルタアプリをイメージ


  • iPhone, iPad両対応                  ユニバーサルアプリ

  • ソースは、                 http://bit.ly/JYgGTH

     •   ( http://kamiyan.la.coocan.jp/iPhone/FragmentShaderBase001.zip )




12年5月25日金曜日
ライブコーディング(1)
        //赤
        gl_FragColor = vec4(1,0,0,1);

        //フェードインアウト黒
        gl_FragColor = vec4(0,0,0,u_alpha);

        //色相
        gl_FragColor = u_color;

        //テクスチャ座標x
        float v = v_texCoord.x;
        gl_FragColor = vec4(v,v,v,1);

        //テクスチャ座標y
        float v = v_texCoord.y;
        gl_FragColor = vec4(v,v,v,1);

        //テクスチャ座標を足す
        float v = (v_texCoord.x + v_texCoord.y) / 2.0;
        gl_FragColor = vec4(v,v,v,1);
12年5月25日金曜日
ライブコーディング(2)
        //テクスチャ座標を足す(オーバーフロー)
        float v = v_texCoord.x + v_texCoord.y;
        gl_FragColor = vec4(v,v,v,1);

        //テクスチャ座標でsin()
        float v = sin(v_texCoord.x * 3.14);
        gl_FragColor = vec4(v,v,v,1);

        //テクスチャ座標xyで乗算(ぼんやり)
        float v = sin(v_texCoord.x * 3.14) * sin(v_texCoord.y * 3.14);
        gl_FragColor = vec4(v,v,v,1);

        //テクスチャ座標yの高周波数
        float v2 = sin(v_texCoord.y * 314.0)*0.2+0.8;
        gl_FragColor = vec4(v2,v2,v2,1);

        //テクスチャの表示
        gl_FragColor =texture2D(u_texture, v_texCoord);

        //テクスチャの繰り返し
        gl_FragColor =texture2D(u_texture, v_texCoord * 2.0);
12年5月25日金曜日
ライブコーディング(3)
        //テクスチャの位相ずらし
        gl_FragColor =texture2D(u_texture, v_texCoord + vec2(0.5,0.5));

        //テクスチャのフェードインアウト
        gl_FragColor =texture2D(u_texture, v_texCoord) * u_alpha;

        //テクスチャに色を乗算
        gl_FragColor =texture2D(u_texture, v_texCoord) * u_color;

        //ぼんやり乗算
        float v = sin(v_texCoord.x * 3.14) * sin(v_texCoord.y * 3.14);
        gl_FragColor =texture2D(u_texture, v_texCoord) * v;

        //ぼんやり乗算(強め)
        float v = sin(v_texCoord.x * 3.14) * sin(v_texCoord.y * 3.14) * 2.0;
        gl_FragColor =texture2D(u_texture, v_texCoord) * v;

        //ぼんやり乗算(リミッタ)
        float v = min(sin(v_texCoord.x * 3.14) * sin(v_texCoord.y * 3.14) * 5.0, 1.0);
        gl_FragColor =texture2D(u_texture, v_texCoord) * v;

12年5月25日金曜日
ライブコーディング(4)
        //ぼんやり乗算(縁黒)
        float v = min(sin(v_texCoord.x * 3.14) * sin(v_texCoord.y * 3.14) * 5.0, 1.0);
        vec4 col = vec4(v,v,v,1);
        gl_FragColor =texture2D(u_texture, v_texCoord) * col;

        //ぼんやり+横縞
        float v1 = min(sin(v_texCoord.x * 3.14) * sin(v_texCoord.y * 3.14) * 5.0, 1.0);
        float v2 = sin(v_texCoord.y * 314.0) * 0.2 +0.8;
        float v =v1*v2;
        vec4 col = vec4(v,v,v,1);
        gl_FragColor =texture2D(u_texture, v_texCoord) * col;

        //グレースケール
        vec4 col = texture2D(u_texture, v_texCoord);
        float v = dot(col,vec4(0.3,0.6,0.1,0));
        gl_FragColor =vec4(v,v,v,1);

        //セピア
        vec4 col = texture2D(u_texture, v_texCoord);
        float v = dot(col,vec4(0.3,0.6,0.1,0);
        gl_FragColor =vec4(v,v*0.87,v*0.75,1);
12年5月25日金曜日
ライブコーディング(5)
        //カラー+グレースケール
        float v1 = sin(v_texCoord.x * 3.14) * sin(v_texCoord.y * 3.14);
        vec4 col = texture2D(u_texture, v_texCoord);
        float v = dot(col,vec4(0.3,0.6,0.1,0));
        vec4 gray =vec4(v,v,v,1);
        gl_FragColor = mix(gray, col, v1);

        //カラー+グレースケール(アニメーション)
        float v1 = sin(v_texCoord.x * 3.14) * sin(v_texCoord.y * 3.14);
        vec4 col = texture2D(u_texture, v_texCoord);
        float v = dot(col,vec4(0.3,0.6,0.1,0));
        vec4 gray =vec4(v,v,v,1);
        gl_FragColor = mix(gray, col, u_alpha) * vec4(v1,v1,v1,1) ;




12年5月25日金曜日
まとめ(1)
  • Fragment   Shader BaseアプリがあればiPhoneだけでコー
     ディングができる!

  • Fragment   Shader Baseアプリで、自由度の高さと高速さ
     が分かる。

  • シェーダ言語のビルドと実行がスピーディに出来る。


  • varying変数、uniform変数、gl_FragColor変数、vec2型、

     vec4型、texture2D(), sin(), cos(), min(), mix(), dot()など

12年5月25日金曜日
まとめ(2)
  • ibisPaintは60fpsで動いている。60fpsを死守せよ!


  • プログラミングの醍醐味は高速化!たまんねぇ∼

      ( ´Д`)y━・~~

  •   ibisPaint Xは無料でiPhone / iPadのユニバーサルアプリ

                    ダウンロードしてね∼ ( ´Д`)y━・~~

              あとでShideShareに上げておきます。
               ご清聴ありがとございました。
12年5月25日金曜日

More Related Content

What's hot

Core Graphicsでつくる自作UIコンポーネント入門
Core Graphicsでつくる自作UIコンポーネント入門Core Graphicsでつくる自作UIコンポーネント入門
Core Graphicsでつくる自作UIコンポーネント入門cocopon
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
MITSUNARI Shigeo
 
【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう
Unity Technologies Japan K.K.
 
Popcntによるハミング距離計算
Popcntによるハミング距離計算Popcntによるハミング距離計算
Popcntによるハミング距離計算
Norishige Fukushima
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Ryo Sakamoto
 
Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化Katsutoshi Makino
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)MITSUNARI Shigeo
 
【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!
【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!
【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!
UnityTechnologiesJapan002
 
JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門
Shohei Arai
 
iOSプログラマへ。HTML5 Canvasがおもしろい!
iOSプログラマへ。HTML5 Canvasがおもしろい!iOSプログラマへ。HTML5 Canvasがおもしろい!
iOSプログラマへ。HTML5 Canvasがおもしろい!cocopon
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
yosupo
 
Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
 Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_ Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
Unity Technologies Japan K.K.
 
Android OpenGL HandsOn
Android OpenGL HandsOnAndroid OpenGL HandsOn
Android OpenGL HandsOn
Ikuo Tansho
 
新しい暗号技術
新しい暗号技術新しい暗号技術
新しい暗号技術
MITSUNARI Shigeo
 
Cocoa勉強会201208
Cocoa勉強会201208Cocoa勉強会201208
Cocoa勉強会201208
Satoshi Oomori
 
初めてのグラフカット
初めてのグラフカット初めてのグラフカット
初めてのグラフカットTsubasa Hirakawa
 

What's hot (19)

Core Graphicsでつくる自作UIコンポーネント入門
Core Graphicsでつくる自作UIコンポーネント入門Core Graphicsでつくる自作UIコンポーネント入門
Core Graphicsでつくる自作UIコンポーネント入門
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう
 
Popcntによるハミング距離計算
Popcntによるハミング距離計算Popcntによるハミング距離計算
Popcntによるハミング距離計算
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
 
Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
 
【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!
【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!
【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!
 
JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門
 
iOSプログラマへ。HTML5 Canvasがおもしろい!
iOSプログラマへ。HTML5 Canvasがおもしろい!iOSプログラマへ。HTML5 Canvasがおもしろい!
iOSプログラマへ。HTML5 Canvasがおもしろい!
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
llvm入門
llvm入門llvm入門
llvm入門
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
 
Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
 Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_ Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
 
Android OpenGL HandsOn
Android OpenGL HandsOnAndroid OpenGL HandsOn
Android OpenGL HandsOn
 
新しい暗号技術
新しい暗号技術新しい暗号技術
新しい暗号技術
 
Cocoa勉強会201208
Cocoa勉強会201208Cocoa勉強会201208
Cocoa勉強会201208
 
初めてのグラフカット
初めてのグラフカット初めてのグラフカット
初めてのグラフカット
 

Viewers also liked

SurfaceTextureとシェーダを使って遊んでみる
SurfaceTextureとシェーダを使って遊んでみるSurfaceTextureとシェーダを使って遊んでみる
SurfaceTextureとシェーダを使って遊んでみる
Tatsuya Matsumoto
 
Modern OpenGL scientific visualization
Modern OpenGL scientific visualizationModern OpenGL scientific visualization
Modern OpenGL scientific visualization
Nicolas Rougier
 
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティスどこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス
5mingame2
 
OpenGL 3DCG
OpenGL 3DCGOpenGL 3DCG
OpenGL 3DCG
Takenori Nakagawa
 
Live2Dの描画の裏側の話
Live2Dの描画の裏側の話Live2Dの描画の裏側の話
Live2Dの描画の裏側の話
Naoki Aso
 
視野変換1(基礎編)
視野変換1(基礎編)視野変換1(基礎編)
視野変換1(基礎編)
康弘 等々力
 
Tabc vol3 テクニカルアーティストを始めるにあたって
Tabc vol3 テクニカルアーティストを始めるにあたってTabc vol3 テクニカルアーティストを始めるにあたって
Tabc vol3 テクニカルアーティストを始めるにあたって
fumoto kazuhiro
 
LINE 2016 エンジニアインターン 03
LINE 2016 エンジニアインターン 03LINE 2016 エンジニアインターン 03
LINE 2016 エンジニアインターン 03
LINE Corporation
 
LINE 2016 エンジニアインターン 02
LINE 2016 エンジニアインターン 02LINE 2016 エンジニアインターン 02
LINE 2016 エンジニアインターン 02
LINE Corporation
 
LINE 2016 エンジニアインターン 01
LINE 2016 エンジニアインターン 01LINE 2016 エンジニアインターン 01
LINE 2016 エンジニアインターン 01
LINE Corporation
 
中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~
ProjectAsura
 
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
Drecom Co., Ltd.
 
Intern2015 01
Intern2015 01Intern2015 01
Intern2015 01
LINE Corporation
 
Introducing libpd -Pdをアプリのサウンドエンジンに-
Introducing libpd -Pdをアプリのサウンドエンジンに-Introducing libpd -Pdをアプリのサウンドエンジンに-
Introducing libpd -Pdをアプリのサウンドエンジンに-
Yoichi Hirata
 
テクニカルアーティストの仕事とスキル ~パイプライン系TAの事例~
テクニカルアーティストの仕事とスキル ~パイプライン系TAの事例~テクニカルアーティストの仕事とスキル ~パイプライン系TAの事例~
テクニカルアーティストの仕事とスキル ~パイプライン系TAの事例~
Manabu Murakami
 
OpenGLと行列
OpenGLと行列OpenGLと行列
OpenGLと行列
miyosuda
 

Viewers also liked (17)

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

Similar to 簡単!OpenGL ES 2.0フラグメントシェーダー

coma Creators session vol.2
coma Creators session vol.2coma Creators session vol.2
coma Creators session vol.2Atsushi Tadokoro
 
Crystalskullを改造してみる
Crystalskullを改造してみるCrystalskullを改造してみる
Crystalskullを改造してみる
Takao Sumitomo
 
「さくらのINFRA WARS」で 利用されている技術
「さくらのINFRA WARS」で 利用されている技術「さくらのINFRA WARS」で 利用されている技術
「さくらのINFRA WARS」で 利用されている技術
townewgokgok
 
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
mametter
 
かんたんなcocos2d-xの紹介
かんたんなcocos2d-xの紹介かんたんなcocos2d-xの紹介
かんたんなcocos2d-xの紹介
Tomoaki Shimizu
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in Dart
Goro Fuji
 
GREE Creators' Meetup #2 session B Manryo
GREE Creators' Meetup #2 session B ManryoGREE Creators' Meetup #2 session B Manryo
GREE Creators' Meetup #2 session B Manryo
Shiho Manryo
 
TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio Code
Akira Inoue
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
 
卒研発表
卒研発表卒研発表
卒研発表
yayugu
 
2017-12-04 Linuxの基本構造とBashでの扱い方
2017-12-04 Linuxの基本構造とBashでの扱い方2017-12-04 Linuxの基本構造とBashでの扱い方
2017-12-04 Linuxの基本構造とBashでの扱い方
浩平 渡邉
 
Real timeimageprocessing
Real timeimageprocessingReal timeimageprocessing
Real timeimageprocessingushiostarfish _
 
AozoraYomite @InfoTalk 2012/12/21
AozoraYomite @InfoTalk 2012/12/21AozoraYomite @InfoTalk 2012/12/21
AozoraYomite @InfoTalk 2012/12/21
Yuki Higuchi
 
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
Takashi Yoshinaga
 
函数プログラミングの エッセンスと考え方
函数プログラミングのエッセンスと考え方函数プログラミングのエッセンスと考え方
函数プログラミングの エッセンスと考え方
啓 小笠原
 
cocos2d-xハンズオン勉強会 in 名古屋
cocos2d-xハンズオン勉強会 in 名古屋cocos2d-xハンズオン勉強会 in 名古屋
cocos2d-xハンズオン勉強会 in 名古屋Tomoaki Shimizu
 
Cocos2d-x v3.2を利用してシューティングゲームを作ろう!
Cocos2d-x v3.2を利用してシューティングゲームを作ろう!Cocos2d-x v3.2を利用してシューティングゲームを作ろう!
Cocos2d-x v3.2を利用してシューティングゲームを作ろう!
Tomoaki Shimizu
 
プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__
Tomohiro Kumagai
 
KETpic できれいな図を書こう
KETpic できれいな図を書こうKETpic できれいな図を書こう
KETpic できれいな図を書こう
Yoshitomo Akimoto
 
Swiftのアプリ開発でハマったこと
Swiftのアプリ開発でハマったことSwiftのアプリ開発でハマったこと
Swiftのアプリ開発でハマったこと
yohei sugigami
 

Similar to 簡単!OpenGL ES 2.0フラグメントシェーダー (20)

coma Creators session vol.2
coma Creators session vol.2coma Creators session vol.2
coma Creators session vol.2
 
Crystalskullを改造してみる
Crystalskullを改造してみるCrystalskullを改造してみる
Crystalskullを改造してみる
 
「さくらのINFRA WARS」で 利用されている技術
「さくらのINFRA WARS」で 利用されている技術「さくらのINFRA WARS」で 利用されている技術
「さくらのINFRA WARS」で 利用されている技術
 
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
 
かんたんなcocos2d-xの紹介
かんたんなcocos2d-xの紹介かんたんなcocos2d-xの紹介
かんたんなcocos2d-xの紹介
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in Dart
 
GREE Creators' Meetup #2 session B Manryo
GREE Creators' Meetup #2 session B ManryoGREE Creators' Meetup #2 session B Manryo
GREE Creators' Meetup #2 session B Manryo
 
TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio Code
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
卒研発表
卒研発表卒研発表
卒研発表
 
2017-12-04 Linuxの基本構造とBashでの扱い方
2017-12-04 Linuxの基本構造とBashでの扱い方2017-12-04 Linuxの基本構造とBashでの扱い方
2017-12-04 Linuxの基本構造とBashでの扱い方
 
Real timeimageprocessing
Real timeimageprocessingReal timeimageprocessing
Real timeimageprocessing
 
AozoraYomite @InfoTalk 2012/12/21
AozoraYomite @InfoTalk 2012/12/21AozoraYomite @InfoTalk 2012/12/21
AozoraYomite @InfoTalk 2012/12/21
 
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
 
函数プログラミングの エッセンスと考え方
函数プログラミングのエッセンスと考え方函数プログラミングのエッセンスと考え方
函数プログラミングの エッセンスと考え方
 
cocos2d-xハンズオン勉強会 in 名古屋
cocos2d-xハンズオン勉強会 in 名古屋cocos2d-xハンズオン勉強会 in 名古屋
cocos2d-xハンズオン勉強会 in 名古屋
 
Cocos2d-x v3.2を利用してシューティングゲームを作ろう!
Cocos2d-x v3.2を利用してシューティングゲームを作ろう!Cocos2d-x v3.2を利用してシューティングゲームを作ろう!
Cocos2d-x v3.2を利用してシューティングゲームを作ろう!
 
プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__
 
KETpic できれいな図を書こう
KETpic できれいな図を書こうKETpic できれいな図を書こう
KETpic できれいな図を書こう
 
Swiftのアプリ開発でハマったこと
Swiftのアプリ開発でハマったことSwiftのアプリ開発でハマったこと
Swiftのアプリ開発でハマったこと
 

簡単!OpenGL ES 2.0フラグメントシェーダー

  • 1. 簡単!OpenGL ES 2.0 フラグメントシェーダー 株式会社アイビス 神谷栄治 12年5月25日金曜日
  • 2. 自己紹介 • 株式会社アイビス (社員70名ほど) • iPhone, iPad, Android, タブレット, Webシステムの受託開発など • 代表取締役社長 神谷栄治 • ハンドル:かみやん • Twitter:    @kamiyan • 自称、ハッカー社長 前回も言って みたけど( ´Д`)y━・~~ 12年5月25日金曜日
  • 3. アプリの紹介 • ibisMail for iPhone(アイビスメール) • 世界初のメールアプリ。国内有料総合1位獲 得。 • ibisMail for iPad • こちらも国内有料総合1位獲得。 • ibisPaint(アイビスペイント) • こちらも国内有料総合1位獲得。 3冠!! 12年5月25日金曜日
  • 4. 前回iPhoneDev勉強会の反省 皆様の声 変態!変態! ありがとうございます( ´Д`)y━・~~ 12年5月25日金曜日
  • 5. 反省をふまえて •IBGLKit • ibisPaintのWindow Tool KitはフルC++なので、別途 OpenGLライブラリをObjective-Cで作りました。 •Fragment Shader Base • サンプルアプリとしてFragment Shader Baseというアプ リを作りました。 夜中コツコツ作るのは楽しい( ´Д`)y━・~~ 12年5月25日金曜日
  • 6. OpenGL ESのメリット(1) • 超高速! iPad(3rd Gen)なら4コア! • GPUコアは年々増えていく(PCでは1000コア) • CPUで200ms∼400msかかる処理も1ms∼2msでできる • ibisPaintでは iPad (3rd Gen)、2048x1536(3.14Mpixels)で、 レイヤー6枚で60fps!! 12年5月25日金曜日
  • 7. OpenGL ESのメリット(2) • Core GraphicsやCore Imageよりも低レベルライブラリ • InstagramやiPhotoもES2.0を使っている • AndroidやWindows、PS Suite、WebGLなど他のプラット フォームにも移植しやすい 12年5月25日金曜日
  • 8. Fragment Shader Baseとは • 第1回iPhoneDev勉強会の私の発表では「難しい∼」と 言う声が聞かれた。 • 反省をふまえ、説明はやめてみんなにフラグメント シェーダーを書いてもらおう! • iPhoneアプリ上でシェーダー言語でコードを書いて、コ ンパイルして、リンクして、実行できれば誰でも体験 できるよね? 僕もベットの中でもコード書けるし( ´Д`)y━・~~ 12年5月25日金曜日
  • 9. Fragment Shader Baseデモ中 • ライブコーディング中∼ • Instagramのようなカメラフィルタアプリをイメージ • iPhone, iPad両対応 ユニバーサルアプリ • ソースは、 http://bit.ly/JYgGTH • ( http://kamiyan.la.coocan.jp/iPhone/FragmentShaderBase001.zip ) 12年5月25日金曜日
  • 10. ライブコーディング(1) //赤 gl_FragColor = vec4(1,0,0,1); //フェードインアウト黒 gl_FragColor = vec4(0,0,0,u_alpha); //色相 gl_FragColor = u_color; //テクスチャ座標x float v = v_texCoord.x; gl_FragColor = vec4(v,v,v,1); //テクスチャ座標y float v = v_texCoord.y; gl_FragColor = vec4(v,v,v,1); //テクスチャ座標を足す float v = (v_texCoord.x + v_texCoord.y) / 2.0; gl_FragColor = vec4(v,v,v,1); 12年5月25日金曜日
  • 11. ライブコーディング(2) //テクスチャ座標を足す(オーバーフロー) float v = v_texCoord.x + v_texCoord.y; gl_FragColor = vec4(v,v,v,1); //テクスチャ座標でsin() float v = sin(v_texCoord.x * 3.14); gl_FragColor = vec4(v,v,v,1); //テクスチャ座標xyで乗算(ぼんやり) float v = sin(v_texCoord.x * 3.14) * sin(v_texCoord.y * 3.14); gl_FragColor = vec4(v,v,v,1); //テクスチャ座標yの高周波数 float v2 = sin(v_texCoord.y * 314.0)*0.2+0.8; gl_FragColor = vec4(v2,v2,v2,1); //テクスチャの表示 gl_FragColor =texture2D(u_texture, v_texCoord); //テクスチャの繰り返し gl_FragColor =texture2D(u_texture, v_texCoord * 2.0); 12年5月25日金曜日
  • 12. ライブコーディング(3) //テクスチャの位相ずらし gl_FragColor =texture2D(u_texture, v_texCoord + vec2(0.5,0.5)); //テクスチャのフェードインアウト gl_FragColor =texture2D(u_texture, v_texCoord) * u_alpha; //テクスチャに色を乗算 gl_FragColor =texture2D(u_texture, v_texCoord) * u_color; //ぼんやり乗算 float v = sin(v_texCoord.x * 3.14) * sin(v_texCoord.y * 3.14); gl_FragColor =texture2D(u_texture, v_texCoord) * v; //ぼんやり乗算(強め) float v = sin(v_texCoord.x * 3.14) * sin(v_texCoord.y * 3.14) * 2.0; gl_FragColor =texture2D(u_texture, v_texCoord) * v; //ぼんやり乗算(リミッタ) float v = min(sin(v_texCoord.x * 3.14) * sin(v_texCoord.y * 3.14) * 5.0, 1.0); gl_FragColor =texture2D(u_texture, v_texCoord) * v; 12年5月25日金曜日
  • 13. ライブコーディング(4) //ぼんやり乗算(縁黒) float v = min(sin(v_texCoord.x * 3.14) * sin(v_texCoord.y * 3.14) * 5.0, 1.0); vec4 col = vec4(v,v,v,1); gl_FragColor =texture2D(u_texture, v_texCoord) * col; //ぼんやり+横縞 float v1 = min(sin(v_texCoord.x * 3.14) * sin(v_texCoord.y * 3.14) * 5.0, 1.0); float v2 = sin(v_texCoord.y * 314.0) * 0.2 +0.8; float v =v1*v2; vec4 col = vec4(v,v,v,1); gl_FragColor =texture2D(u_texture, v_texCoord) * col; //グレースケール vec4 col = texture2D(u_texture, v_texCoord); float v = dot(col,vec4(0.3,0.6,0.1,0)); gl_FragColor =vec4(v,v,v,1); //セピア vec4 col = texture2D(u_texture, v_texCoord); float v = dot(col,vec4(0.3,0.6,0.1,0); gl_FragColor =vec4(v,v*0.87,v*0.75,1); 12年5月25日金曜日
  • 14. ライブコーディング(5) //カラー+グレースケール float v1 = sin(v_texCoord.x * 3.14) * sin(v_texCoord.y * 3.14); vec4 col = texture2D(u_texture, v_texCoord); float v = dot(col,vec4(0.3,0.6,0.1,0)); vec4 gray =vec4(v,v,v,1); gl_FragColor = mix(gray, col, v1); //カラー+グレースケール(アニメーション) float v1 = sin(v_texCoord.x * 3.14) * sin(v_texCoord.y * 3.14); vec4 col = texture2D(u_texture, v_texCoord); float v = dot(col,vec4(0.3,0.6,0.1,0)); vec4 gray =vec4(v,v,v,1); gl_FragColor = mix(gray, col, u_alpha) * vec4(v1,v1,v1,1) ; 12年5月25日金曜日
  • 15. まとめ(1) • Fragment Shader BaseアプリがあればiPhoneだけでコー ディングができる! • Fragment Shader Baseアプリで、自由度の高さと高速さ が分かる。 • シェーダ言語のビルドと実行がスピーディに出来る。 • varying変数、uniform変数、gl_FragColor変数、vec2型、 vec4型、texture2D(), sin(), cos(), min(), mix(), dot()など 12年5月25日金曜日
  • 16. まとめ(2) • ibisPaintは60fpsで動いている。60fpsを死守せよ! • プログラミングの醍醐味は高速化!たまんねぇ∼ ( ´Д`)y━・~~ • ibisPaint Xは無料でiPhone / iPadのユニバーサルアプリ ダウンロードしてね∼ ( ´Д`)y━・~~ あとでShideShareに上げておきます。 ご清聴ありがとございました。 12年5月25日金曜日