SlideShare a Scribd company logo
1 of 70
ShadowGun Sample Level から
学べるモバイル最適化



                      株式会社 Aiming
               リードソフトウェアエンジニア
                          牧野克俊
                        2012/06/01
自己紹介
• オンラインゲームを長年作ってきま
  した
• 主にサーバや通信部分担当です!
• クライアントや 3D は自信ないです
でもがんばって解説します!
• 基本的に多くの情報はすでに英語で
  Unity の Web サイトに出ています
 – http://blogs.unity3d.com/2012/03/23/shad
   owgun-optimizing-for-mobile-sample-level/
 – http://blogs.unity3d.com/2011/08/18/fast-
   mobile-shaders-talk-at-siggraph/
ShadowGun
概要

• データを見てみよう
• シェーダから学ぶ
• テクニックを解説してみる
データを見てみよう
Scene 内データ数
• GameObject    : 795
• メッシュ(MeshFilter) : 429
 –不透明    : 369
 –半透明    : 60
Scene 内データ数
• マテリアル           : 40
• シェーダ         : 17
• ライト             : 92
 –Directional: 1
 –Point      :91
テクスチャ枚数
•   64     × 1枚
•   128    × 1枚
•   256    × 7枚
•   512    × 10枚
•   1024   × 10枚
•   2048   × 3枚
テクスチャ用途
• 64、128
  – 光の表現、God Ray、BRDF LookUpTexture
• 256
  – 遠景(月、山)、煙、床、水面
• 512
  – 彫像、床、旗、空、NormalMap
• 1024
  – 敵、シャトル、壁、窓
• 2048
  – 壁、オブジェクト用アトラス
テクスチャフォーマット
• 64、128
  – RGBA 32、RGB 16
• 256
  – RGBA 32、RGB 16、Compressed
• 512、1024、2048
  – Compressed
ポリゴン数
• ポリゴン数
 – 毎フレーム         : 20k 〜 30k 描画
 – 敵1体       : 約2k
 – Draw-call : 30 〜 50
 – Batched   : 120 〜 150
レンダリングオブジェクト数
• 不透明   : 349


• 半透明   : 49
レンダリングオブジェクト数
• 不透明   : 349
 – 5 種類のマテリアルで約 300
 – この 5 種類は同じシェーダ
• 半透明   : 49
 – 3 種類のマテリアルで約 30
処理時間
•   physx: 0.3
•   animation: 0.3
•   culling 0.0
•   skinning: 2.6
•   batching: 0.7
•   render: 1.8
•   fixed-update-count: 1 .. 4
•   update: 0.2
•   fixedUpdate: 0.4
•   coroutines: 0.0
処理時間
•   physx: 0.3
•   animation: 0.3
•   culling 0.0
•   skinning: 2.6            結構重い!
•   batching: 0.7
•   render: 1.8
•   fixed-update-count: 1 .. 4
•   update: 0.2
•   fixedUpdate: 0.4
•   coroutines: 0.0
シェーダから学ぶ
Case 1
v2f vert (appdata_full v) {
        v2f o;
        o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
        o.uv = v.texcoord;
        float3 worldNormal = mul((float3x3)_Object2World, v.normal);
        float3 viewNormal = mul((float3x3)UNITY_MATRIX_MV, v.normal);

                                                                                   頂点シェーダ
        float4 viewPos = mul(UNITY_MATRIX_MV, v.vertex);
        float3 viewDir = float3(0,0,1);
        float3 viewLightPos = _SpecOffset * float3(1,1,-1);
        float3 dirToLight = viewPos.xyz - viewLightPos;
        float3 h = (viewDir + normalize(-dirToLight)) * 0.5;
        float atten = 1.0 - saturate(length(dirToLight) / _SpecRange);
        o.spec = _SpecColor * pow(saturate(dot(viewNormal, normalize(h))), _Shininess * 128) * 2 * atten;
        o.SHLighting = ShadeSH9(float4(worldNormal,1)) * _SHLightingScale;
        return o;
}


fixed4 frag (v2f i) : COLOR {
        fixed4 c         = tex2D (_MainTex, i.uv);
        c.rgb *= i.SHLighting;


}
        c.rgb += i.spec.rgb * c.a;
        return c;                                           フラグメントシェーダ
Case 2
v2f vert (appdata_full v) {
        v2f o;
        float3 viewPos = mul(UNITY_MATRIX_MV,v.vertex);
        float dist = length(viewPos);
        float nfadeout = saturate(dist / _FadeOutDistNear);
        float ffadeout = 1 - saturate(max(dist - _FadeOutDistFar,0) * 0.2);
        ffadeout *= ffadeout;
        nfadeout *= nfadeout;


                                                                                   頂点シェーダ
        nfadeout *= nfadeout;
        nfadeout *= ffadeout;
        float4 vpos = v.vertex;
        vpos.xyz -= v.normal * saturate(1 - nfadeout) * v.color.a * _ContractionAmount;
        o.uv            = v.texcoord.xy;
        o.pos = mul(UNITY_MATRIX_MVP, vpos);
        o.color = nfadeout * v.color * _Multiplier;
        return o;
}


fixed4 frag (v2f i) : COLOR {

                                                            フラグメントシェーダ
        return tex2D (_MainTex, i.uv.xy) * i.color;
}
• フラグメントシェーダが超シンプ
  ル!
• フラグメントシェーダが超シンプ
  ル!
–なぜ?
• フラグメントシェーダが超シンプ
  ル!
–なぜ?
 • 計算量を減らすため
 • ピクセル数 >>> 頂点数
• Virtual Gloss Per-Vertex Additive
  (Supports Lightmap)
  –壁とか床
  –一番使用量が多い
Pass {
     CGPROGRAM
     pragma vertex vert
     #pragma fragment frag
     #pragma fragmentoption
  ARB_precision_hint_faste

         fixed4 frag (v2f i) : COLOR
         {
               ・・・
Pass {
     CGPROGRAM
     pragma vertex vert
     #pragma fragment frag
     #pragma fragmentoption
  ARB_precision_hint_faste
         精度を可能な限り落して
         fixed4 frag (v2f i) : COLOR
         {         実行時間を短くす
         る ・・・
fixed4 frag (v2f i) : COLOR {
      fixed4 c = tex2D (_MainTex, i.uv);
      fixed3 spec = i.spec.rgb * c.a;
      c.rgb += spec;
      fixed3 lm = DecodeLightmap(tex2D(
                         unity_Lightmap, i.lmap));
      c.rgb *= lm;
      return c;
}
fixed4 frag (v2f i) : COLOR {
      fixed4 c = tex2D (_MainTex, i.uv);
      fixed3 spec = 明示的に精度を落とす
                      i.spec.rgb * c.a;
      c.rgb += spec;
      fixed3 lm = DecodeLightmap(tex2D(
                          unity_Lightmap, i.lmap));
      c.rgb *= lm;
      return c;
}
精度
• fixed
  – 通常 11 bit
  – -2.0 〜 +2.0
  – 精度 1 / 256
• half
  – 通常 16 bit
  – -60000 〜 +60000
  – 精度おおよそ 3 桁
• float
  – 32 bit
精度
• fixed
  – 通常 11 bit              速い
  – -2.0 〜 +2.0
  – 精度 1 / 256
• half
  – 通常 16 bit
  – -60000 〜 +60000
  – 精度おおよそ 3 桁
• float                    遅い
  – 32 bit
精度
• fixed
  – 色、単位ベクトル
• half
  – その他
• float
  – half で精度が足りないとき
精度
• こんな宣言もできます
 – lowp、mediump、highp
精度
• こんな宣言もできます
 – lowp、mediump、highp


あくまでヒントでハードウェアによっ
 てどの精度が使われるか違ってくる
テクニックを学ぼう
描画順
1. 不透明
2. Skybox
  –空、地面
  –月、遠景の山
3. 半透明
ライティング
• ライト
 – Directional : 1
 – Point       : 91
ライティング
• ライト
 – Directional : 1
 – Point       : 91


   リアルタイムで計算なんか無
        理!
ライティング
• 静的オブジェクト
       → Lightmap
• 動的オブジェクト
       → LightProbe
静的オブジェクトのライティン
      グ


         Lightmap
            +
  Per Vertex Specular Maps
Per Vertex Specular Maps
1. テクスチャの α に鏡面反射強度を格
   納しておく
2. 頂点シェーダでスペキュラ計算
3. フラグメントシェーダで上記計算結
   果と強度を掛けて足す
コード
v2f vert (appdata_full v) {
      ・・・
      o.spec = _SpecColor *
            pow(saturate(dot(viewNormal,
            normalize(h))), _Shininess * 128)
            * 2 * atten;
      ・・・
}
コード
half4 frag (v2f i) : COLOR {
     half4 c = tex2D (_MainTex, i.uv);
     half3 spec = i.spec.rgb * c.a;
}
動的オブジェクトのライティン
      グ


     LightProbe
        +
       BRDF
BRDF とは
Bidirectional Reflectance
     Distribution Function
     = 双方向反射率分布関数
BRDF とは

物質の質感をあらわすパラメータ
で、
物質に光が入射してきたときに、
どのように反射するのか記述した
もの
BRDF
• 事前に LookupTexture を作成
 – RGB にディフューズ
 – α にスペキュラ
• ライトとビュー方向から LookupTexture か
  ら値を取得
• アルベドと上記値を乗算
コード
void surf (Input IN, inout MySurfaceOutput o) {
      fixed4 tex =
tex2D(_MainTex, IN.uv_MainTex);
      o.Albedo = tex.rgb;
      o.Gloss = tex.a;
      o.Alpha = tex.a;
      o.Normal = tex2D(_BumpMap,
            IN.uv_BumpMap).rgb * 2.0 - 1.0;
}
コード
ixed4 LightingPseudoBRDF (MySurfaceOutput s, fixed3
lightDir, fixed3 viewDir, fixed atten)
{
        fixed3 halfDir = normalize (lightDir + viewDir);
        // N.L
        fixed NdotL = dot (s.Normal, lightDir);
        // N.H
        fixed NdotH = dot (s.Normal, halfDir);

       // remap N.L from [-1..1] to [0..1]
       fixed biasNdotL = NdotL * 0.5 + 0.5;
       ・・・
コード
    ・・・

    fixed4 l = tex2D (_BRDFTex,
                   fixed2(biasNdotL, NdotH));

    fixed4 c;
    c.rgb = s.Albedo * (l.rgb + s.Gloss * l.a) * 2;
    c.a = 0;

    return c;
}
                         s.Gloss(= tex.a)
GodRay
Godray
• ポストプロセスで実装されることが
  多い
• モバイルでポストプロセスはコスト
  が高い
Godray
• ポストプロセスで実装されることが
  多い
• モバイルでポストプロセスはコスト
  が高い
 – 板ポリとテクスチャ
 – 距離に応じて縮小、透明度を上げる
Godray
• ポストプロセスで実装されることが
  多い
• モバイルでポストプロセスはコスト
  が高い
 – 板ポリとテクスチャ
 – 距離に応じて縮小、透明度を上げる
  • 画面いっぱいに広がると負荷が高い
  • それっぽく見せるため
コード
v2f vert (appdata_full v) {
        v2f o;
        float3 viewPos = mul(UNITY_MATRIX_MV,v.vertex);
        float dist = length(viewPos);
        float nfadeout = saturate(dist / _FadeOutDistNear);
        float ffadeout = 1 - saturate(max(dist - _FadeOutDistFar,0)
* 0.2);
                     距離に応じての減衰率を出す
       ffadeout *= ffadeout;

       ・・・
コード
       ・・・


       float4 vpos = v.vertex;
       vpos.xyz -= v.normal * saturate(1 - nfadeout) * v.color.a
* _ContractionAmount;
                                  頂点を法線方向に移動
       o.uv = v.texcoord.xy;
       o.pos = mul(UNITY_MATRIX_MVP, vpos);
       o.color = nfadeout * v.color * _Multiplier;
       return o;
}
旗
旗
• 頂点カラーの α に風の影響を受ける
  かを格納してある
• 上記と各種パラメータを使って頂点
  シェーダで計算して直接頂点の位置
  を変更
煙
煙
• 通常はパーティクルで作成
煙
• 普通はパーティクルで作成
• 少しでも軽くするために
 – テクスチャの 2 重スクロール
 – 頂点カラーとブレンド
 – 端っこの頂点カラーを透明にする
コード
v2f vert (appdata_full v) {
        v2f o;
          テクスチャ座標移動
        o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
        o.uv.xy = TRANSFORM_TEX(v.texcoord.xy,_MainTex) +
                       frac(float2(_ScrollX, _ScrollY) * _Time);
        o.uv.zw = TRANSFORM_TEX(v.texcoord.xy,_DetailTex) +
                        frac(float2(_Scroll2X, _Scroll2Y) * _Time);

       ・・・
コード
    ・・・


    o.uv.x += sin(_Time * _SineFreqX) * _SineAmplX;
    o.uv.y += sin(_Time * _SineFreqY) * _SineAmplY;

    o.uv.z += sin(_Time * _SineFreqX2) * _SineAmplX2;
    o.uv.w += sin(_Time * _SineFreqY2) * _SineAmplY2;

    o.color = _MMultiplier * _Color * v.color;
    return o;
}
Sphere Ambient Occlusion
Sphere Ambient Occlusion
• ある点がどれだけ遮蔽されているか
  に応じて陰をつける
• ShadowGun ではキャラクターの影で
  使用している
 – 両足、腰に球を置いてその影を投影
Sphere Ambient Occlusion

• なんか小難しい式をあれこれする
  と最終的に
参考資料
• http://www.iquilezles.org/www/articles/spher
  eao/sphereao.htm/
void surf (Input IN, inout SurfaceOutput o) {fixed4 tex =
       tex2D(_MainTex, IN.uv_MainTex);
       o.Albedo = tex.rgb;
       o.Alpha = tex.a;

      half3 t = _Center.xyz - IN.worldPos.xyz;
      half d = 1 / (t.x * t.x + t.y * t.y + t.z * t.z);
      o.Gloss = (_Radius * _Radius * d);

      WorldNormalVector(IN, o.Normal);
}
コード
fixed4 LightingSimpleLambertAO (SurfaceOutput s, fixed3
lightDir, fixed atten) {
        fixed NdotL = dot (s.Normal, lightDir);
        fixed bl = NdotL * s.Gloss;

       fixed4 c;               光のブロック率を出す
       c.rgb = s.Albedo * _LightColor0.rgb *
                       (NdotL * atten * 2) * (1 - bl);
       c.a = s.Alpha;
       return c;
}
まとめ
まとめ
• StaticBatching のためにマテリアルを共通
  化
• テクスチャは結構な量を使っても大丈夫
 – ただし圧縮フォーマット前提
• 静的なライティングで十分
• 処理を頂点シェーダに可能な限り持って
  いく
 – = ピクセル単位での処理を減らす
• シェーダの計算は精度を落とす

More Related Content

What's hot

きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回Tomoya Kawanishi
 
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能MITSUNARI Shigeo
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法Takeshi Yamamuro
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介MITSUNARI Shigeo
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013Ryo Sakamoto
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装MITSUNARI Shigeo
 
Popcntによるハミング距離計算
Popcntによるハミング距離計算Popcntによるハミング距離計算
Popcntによるハミング距離計算Norishige Fukushima
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用MITSUNARI Shigeo
 
GPGPU deいろんな問題解いてみた
GPGPU deいろんな問題解いてみたGPGPU deいろんな問題解いてみた
GPGPU deいろんな問題解いてみたRyo Sakamoto
 
RubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyRubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyimasahiro
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたMITSUNARI Shigeo
 
【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスター【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスターUnity Technologies Japan K.K.
 
ディジタル信号処理 課題解説 その5
ディジタル信号処理 課題解説 その5ディジタル信号処理 課題解説 その5
ディジタル信号処理 課題解説 その5noname409
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mclMITSUNARI Shigeo
 
【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろうUnity Technologies Japan K.K.
 
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計UnityTechnologiesJapan002
 

What's hot (20)

きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
HPC Phys-20201203
HPC Phys-20201203HPC Phys-20201203
HPC Phys-20201203
 
Popcntによるハミング距離計算
Popcntによるハミング距離計算Popcntによるハミング距離計算
Popcntによるハミング距離計算
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
 
GPGPU deいろんな問題解いてみた
GPGPU deいろんな問題解いてみたGPGPU deいろんな問題解いてみた
GPGPU deいろんな問題解いてみた
 
RubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyRubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRuby
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
 
【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスター【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスター
 
ディジタル信号処理 課題解説 その5
ディジタル信号処理 課題解説 その5ディジタル信号処理 課題解説 その5
ディジタル信号処理 課題解説 その5
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
 
【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう
 
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
 

Viewers also liked

Unityとアセットツールで学ぶ「絵づくり」の基礎 ライト、シェーダー、イメージエフェクト
Unityとアセットツールで学ぶ「絵づくり」の基礎 ライト、シェーダー、イメージエフェクトUnityとアセットツールで学ぶ「絵づくり」の基礎 ライト、シェーダー、イメージエフェクト
Unityとアセットツールで学ぶ「絵づくり」の基礎 ライト、シェーダー、イメージエフェクト小林 信行
 
BRDF レンダリングの方程式
BRDF レンダリングの方程式BRDF レンダリングの方程式
BRDF レンダリングの方程式康弘 等々力
 
Unityのasset bundle運用実例@lordofknights
Unityのasset bundle運用実例@lordofknightsUnityのasset bundle運用実例@lordofknights
Unityのasset bundle運用実例@lordofknightsKouji Hosoda
 
Extending the Unity Editor Extended
Extending the Unity Editor ExtendedExtending the Unity Editor Extended
Extending the Unity Editor ExtendedMasamitsu Ishikawa
 
知って得するUnity エディタ拡張編
知って得するUnity エディタ拡張編知って得するUnity エディタ拡張編
知って得するUnity エディタ拡張編Shota Baba
 
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移まべ☆てっく運営
 
Unity エディタ拡張
Unity エディタ拡張Unity エディタ拡張
Unity エディタ拡張Shota Baba
 

Viewers also liked (7)

Unityとアセットツールで学ぶ「絵づくり」の基礎 ライト、シェーダー、イメージエフェクト
Unityとアセットツールで学ぶ「絵づくり」の基礎 ライト、シェーダー、イメージエフェクトUnityとアセットツールで学ぶ「絵づくり」の基礎 ライト、シェーダー、イメージエフェクト
Unityとアセットツールで学ぶ「絵づくり」の基礎 ライト、シェーダー、イメージエフェクト
 
BRDF レンダリングの方程式
BRDF レンダリングの方程式BRDF レンダリングの方程式
BRDF レンダリングの方程式
 
Unityのasset bundle運用実例@lordofknights
Unityのasset bundle運用実例@lordofknightsUnityのasset bundle運用実例@lordofknights
Unityのasset bundle運用実例@lordofknights
 
Extending the Unity Editor Extended
Extending the Unity Editor ExtendedExtending the Unity Editor Extended
Extending the Unity Editor Extended
 
知って得するUnity エディタ拡張編
知って得するUnity エディタ拡張編知って得するUnity エディタ拡張編
知って得するUnity エディタ拡張編
 
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移
 
Unity エディタ拡張
Unity エディタ拡張Unity エディタ拡張
Unity エディタ拡張
 

Similar to Shadow gunのサンプルから学べるモバイル最適化

【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」nyagasuki
 
Android OpenGL HandsOn
Android OpenGL HandsOnAndroid OpenGL HandsOn
Android OpenGL HandsOnIkuo Tansho
 
簡単!OpenGL ES 2.0フラグメントシェーダー
簡単!OpenGL ES 2.0フラグメントシェーダー簡単!OpenGL ES 2.0フラグメントシェーダー
簡単!OpenGL ES 2.0フラグメントシェーダーEiji Kamiya
 
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video UnderstandingToru Tamaki
 
LexADV_WOVis Ver.0.1bの概要
LexADV_WOVis Ver.0.1bの概要LexADV_WOVis Ver.0.1bの概要
LexADV_WOVis Ver.0.1bの概要ADVENTURE Project
 
文献紹介:Video Transformer Network
文献紹介:Video Transformer Network文献紹介:Video Transformer Network
文献紹介:Video Transformer NetworkToru Tamaki
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーmganeko
 
文献紹介:SegFormer: Simple and Efficient Design for Semantic Segmentation with Tr...
文献紹介:SegFormer: Simple and Efficient Design for Semantic Segmentation with Tr...文献紹介:SegFormer: Simple and Efficient Design for Semantic Segmentation with Tr...
文献紹介:SegFormer: Simple and Efficient Design for Semantic Segmentation with Tr...Toru Tamaki
 
文献紹介:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
文献紹介:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale文献紹介:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
文献紹介:An Image is Worth 16x16 Words: Transformers for Image Recognition at ScaleToru Tamaki
 
シェーダーしよっ☆ Let's play shaders!
シェーダーしよっ☆ Let's play shaders!シェーダーしよっ☆ Let's play shaders!
シェーダーしよっ☆ Let's play shaders!Yuichi Higuchi
 
【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!
【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!
【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!UnityTechnologiesJapan002
 
ARグラスで 魅力的な絵作り
ARグラスで 魅力的な絵作りARグラスで 魅力的な絵作り
ARグラスで 魅力的な絵作りKazuya Hiruma
 
Real timeimageprocessing
Real timeimageprocessingReal timeimageprocessing
Real timeimageprocessingushiostarfish _
 
ROS Tutorial 02 - CIT
ROS Tutorial 02 - CITROS Tutorial 02 - CIT
ROS Tutorial 02 - CITDaiki Maekawa
 
Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
 Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_ Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_Unity Technologies Japan K.K.
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
 
文献紹介:Token Shift Transformer for Video Classification
文献紹介:Token Shift Transformer for Video Classification文献紹介:Token Shift Transformer for Video Classification
文献紹介:Token Shift Transformer for Video ClassificationToru Tamaki
 

Similar to Shadow gunのサンプルから学べるモバイル最適化 (20)

【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
 
Android OpenGL HandsOn
Android OpenGL HandsOnAndroid OpenGL HandsOn
Android OpenGL HandsOn
 
簡単!OpenGL ES 2.0フラグメントシェーダー
簡単!OpenGL ES 2.0フラグメントシェーダー簡単!OpenGL ES 2.0フラグメントシェーダー
簡単!OpenGL ES 2.0フラグメントシェーダー
 
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
 
Boost.SIMD
Boost.SIMDBoost.SIMD
Boost.SIMD
 
FOSS4G 2012 Osaka
FOSS4G 2012 OsakaFOSS4G 2012 Osaka
FOSS4G 2012 Osaka
 
LexADV_WOVis Ver.0.1bの概要
LexADV_WOVis Ver.0.1bの概要LexADV_WOVis Ver.0.1bの概要
LexADV_WOVis Ver.0.1bの概要
 
文献紹介:Video Transformer Network
文献紹介:Video Transformer Network文献紹介:Video Transformer Network
文献紹介:Video Transformer Network
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
 
文献紹介:SegFormer: Simple and Efficient Design for Semantic Segmentation with Tr...
文献紹介:SegFormer: Simple and Efficient Design for Semantic Segmentation with Tr...文献紹介:SegFormer: Simple and Efficient Design for Semantic Segmentation with Tr...
文献紹介:SegFormer: Simple and Efficient Design for Semantic Segmentation with Tr...
 
文献紹介:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
文献紹介:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale文献紹介:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
文献紹介:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
 
シェーダーしよっ☆ Let's play shaders!
シェーダーしよっ☆ Let's play shaders!シェーダーしよっ☆ Let's play shaders!
シェーダーしよっ☆ Let's play shaders!
 
【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!
【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!
【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!
 
ARグラスで 魅力的な絵作り
ARグラスで 魅力的な絵作りARグラスで 魅力的な絵作り
ARグラスで 魅力的な絵作り
 
Real timeimageprocessing
Real timeimageprocessingReal timeimageprocessing
Real timeimageprocessing
 
ROS Tutorial 02 - CIT
ROS Tutorial 02 - CITROS Tutorial 02 - CIT
ROS Tutorial 02 - CIT
 
Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
 Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_ Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
Slide
SlideSlide
Slide
 
文献紹介:Token Shift Transformer for Video Classification
文献紹介:Token Shift Transformer for Video Classification文献紹介:Token Shift Transformer for Video Classification
文献紹介:Token Shift Transformer for Video Classification
 

More from Katsutoshi Makino

Aiming 開発ゲームの裏側
Aiming 開発ゲームの裏側Aiming 開発ゲームの裏側
Aiming 開発ゲームの裏側Katsutoshi Makino
 
Unity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだことUnity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだことKatsutoshi Makino
 
C# で i phone ゲーム開発
C# で i phone ゲーム開発C# で i phone ゲーム開発
C# で i phone ゲーム開発Katsutoshi Makino
 
プログラマに優しいバグレポートの書き方
プログラマに優しいバグレポートの書き方プログラマに優しいバグレポートの書き方
プログラマに優しいバグレポートの書き方Katsutoshi Makino
 
プログラマが欲しい仕様書とは
プログラマが欲しい仕様書とはプログラマが欲しい仕様書とは
プログラマが欲しい仕様書とはKatsutoshi Makino
 
各種ゲームエンジンの紹介と利用について
各種ゲームエンジンの紹介と利用について各種ゲームエンジンの紹介と利用について
各種ゲームエンジンの紹介と利用についてKatsutoshi Makino
 

More from Katsutoshi Makino (9)

Aiming 開発ゲームの裏側
Aiming 開発ゲームの裏側Aiming 開発ゲームの裏側
Aiming 開発ゲームの裏側
 
Unity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだことUnity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだこと
 
C# で i phone ゲーム開発
C# で i phone ゲーム開発C# で i phone ゲーム開発
C# で i phone ゲーム開発
 
Mmo game networking_1
Mmo game networking_1Mmo game networking_1
Mmo game networking_1
 
プログラマに優しいバグレポートの書き方
プログラマに優しいバグレポートの書き方プログラマに優しいバグレポートの書き方
プログラマに優しいバグレポートの書き方
 
プログラマが欲しい仕様書とは
プログラマが欲しい仕様書とはプログラマが欲しい仕様書とは
プログラマが欲しい仕様書とは
 
Unity って何?
Unity って何?Unity って何?
Unity って何?
 
Unity ゲーム開発
Unity ゲーム開発Unity ゲーム開発
Unity ゲーム開発
 
各種ゲームエンジンの紹介と利用について
各種ゲームエンジンの紹介と利用について各種ゲームエンジンの紹介と利用について
各種ゲームエンジンの紹介と利用について
 

Shadow gunのサンプルから学べるモバイル最適化