SlideShare uma empresa Scribd logo
1 de 114
Baixar para ler offline
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 1
Metal  と Vulkan を⽤用いた
⽔水彩画レンダリング技法の紹介
次世代のモバイルグラフィックスは Non-‐‑‒Photorealistic  Rendering  へと移⾏行行する
株式会社ドリコム 増野 健⼈人
川上 知成
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 2
講演者紹介
川上 知成 -‐‑‒ 進⾏行行
株式会社ドリコム プログラムマネジメント室
サーバーサイドエンジニア、PMを担当し、現在は複数のプロジェクトに関与
CEDEC2014, 2015登壇
増野 健⼈人 -‐‑‒ メインスピーカー
株式会社ドリコム ゲームプロダクト部
コンシューマゲーム会社にてグラフィックスシステムやシェーダー開発に携わる
ドリコム⼊入社後は3D・シェーダー技術のスキルボトムアップの活動を⾏行行う
本⽇日の発表について
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 3
Vulkan and  the  Vulkan logo  are  trademarks  of  the  Khronos Group  Inc.
OpenGL  is  a  registered  trademark  and  the  OpenGL  ES  logo  is  a  trademark  of  Silicon  Graphics  Inc.  used  by  permission  by  Khronos.
SPIR  and  the  SPIR  logo  are  trademarks  of  the  Khronos Group  Inc.
Apple,  Mac,  iMac,  MacBook,  iPhone,  Xcode,  macOS,  Metal  and  OS  X  are  trademarks  of  Apple  Inc.,  registered  in  the  U.S.  and  other  countries.
iOS  is  a  trademark  or  registered  trademark  of  Cisco  in  the  U.S.  and  other  countries  and  is  used  under  license.
Android™.
DirectX®.
FlowMap Painter  (c)2012  Teck  Lee  Tan  www.teckArtist.com
Copyrights.
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 4
ゲームエンジンと要素技術/基礎技術
はじめに
要素技術/基礎技術を⾒見見る理理由
• 対象事象の原理理原則を押さえる
→⽐比較対象や⽐比較すべきポイントを選定出来、評価が可能
• 時代に乗る
→市場、発表、研究、発⾒見見などの各段階で⾒見見極め必要な技術を取捨選択
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 5
• 近年年のモバイルグラフィックス
• グラフィックスAPI  のパラダイムシフト
• Low-‐‑‒Overhead,  Low-‐‑‒Level  プログラミング
• Non-‐‑‒Photorealistic  Rendering  における⽔水彩画表現
• まとめ、質疑応答
セッションの内容
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 6
近年年のモバイルグラフィックス
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 7
そもそもスマートフォンは多岐に渡る利利⽤用⽤用途がある。
• 電話、メール、メッセージアプリ
• SNS  (コミュニケーション)
• 動画視聴
• ゲーム
ゲームはあくまでコンテンツの⼀一つ。
ユーザーはバッテリーリソースを消費しながらこれらコンテンツを利利⽤用している。
モバイルデバイスとゲーム
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 8
現在、スマートフォン端末はフルHD(1920x1080px)  の画⾯面解像度度を持ったデバ
イスが⼀一般的に普及している。総ピクセル数で⾔言えば約207万px あり、これを1秒
間に60回書き換えを⾏行行なっている。
この膨⼤大なピクセルの更更新を CPU を使⽤用して⾏行行うことも可能だが、リアルタイム
性を求めるゲームではレンダリング専⽤用のプロセッサ(GPU)を通して画⾯面更更新の⾼高
速化を図っている。
→  スマホゲーム通常は OpenGL  ES を通して GPU で描画が⾏行行われている。
ゲームの更更新とレンダリング
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 9
OpenGL  ES
OpenGL for  Embedded  System
Khronos Group という標準化団体によって策定されている組み込み機器向けのグ
ラフィックスAPI
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 10
OpenGL  ES  は現在の iOS  /  Android  開発を⽀支える共通のグラフィックスAPI。
描画部分においては最も基本であり、最も重要なAPIの⼀一つ。
現在のスマホネイティブアプリは、iOS/Android  の両対応がほぼ⼀一般的になって
いるが、プラットフォームが異異なるこの2つのデバイスにおいて、OpenGL  ES  で
グラフィックスエンジンを記述すれば、両プラットフォームの対応を⾏行行うことがで
きる。
モバイルゲームを⽀支えるAPI  
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 11
グラフィックスAPI  の呼び出しにより CPU  で動作しているアプリケーションから
GPU  に対してタスクの発⾏行行が⾏行行われる。(GPUドライバが制御する)
A社 の GPU  と B社 の GPU  でアーキテクチャが異異なっても、この共通の API  に
よりその違いを吸収している。
OpenGL  ES
A_GPU_drawCall(Triangles,  0,  6)
DrawCall(Triangles,  0,  6  )
A社 GPU  (SoC)
B_GPU_drawCall(Triangles,  0,  6)
B社 GPU  (SoC)ハードウェア
ドライバ
アプリケーション
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 12
Khronos による仕様の策定
• 2015年年8⽉月には、最新バージョンとなる ES  3.2 がリリース
• 現在のモバイルグラフィックスの多くは ES  2.0 をベースにしている
後述する、Metal,  Vulkan も、OpenGL  ES  と同じグラフィックスAPIの⼀一つ。
OpenGL  ES
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 13
モバイルグラフィックスの推移
2003年
OpenGL
ES 1.0
2004年
OpenGL
ES 1.1
2007年
OpenGL
ES 2.0
2012年
OpenGL
ES 3.0
2014年
OpenGL
ES 3.1
2015年
OpenGL
ES 3.2
固定パイプライン時代
第一世代グラフィックス
プログラマブルパイプライン時代
第二世代グラフィックス
低レベルグラフィックスAPI時代
第三世代(次世代)グラフィックス
2016年年
Metal,Vulkan
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 14
グラフィックスAPIを選ぶ基準としては、OSサポートは勿論論、端末に搭載される
GPU  (ドライバ)  の対応が必須となる。
後述する、Metal,  Vulkan も端末によってサポートが異異なるため留留意
グラフィックスAPI
OpenGL ES Android iOS
2.0 2.2 iPhone3GS
3.0 4.3 iPhone5S
3.1+AEP 5.0 -
3.2 6.0 -
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 15
最新のモバイルグラフィックスは何が出来るか?
→  ES  3.2  は DirectX11.0 世代と同等の機能を有している
• 機能⾯面だけで⾔言えば PC,  PS4,  XboxOne の世代に追いついている
• しかし性能⾯面では⼤大きな開きがあるため同等のグラフィックス表現は難しい
最新の OpenGL  ES  3.2  では、コンピュートシェーダーは勿論論、テッセレーション
とジオメトリシェーダーまでサポートされている。
モバイルグラフィクスの今
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 16
2012年年8⽉月リリース。ES2.0  からは実に5年年ぶりのアップデート。
主な機能
・レンダリングパイプラインの強化
-‐‑‒ Occlusion  Query
-‐‑‒ Transform  Feedback
-‐‑‒ Instanced  Rendering
-‐‑‒ Multiple  Render  Targets
・ETC2  テクスチャ圧縮形式のサポート
・and  more...
OpenGL  ES  3.0
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 17
2014年年3⽉月にリリースされた。
主な機能として、コンピュートシェーダ がサポートされた。
-‐‑‒ Vertex,  Fragment  オブジェクトの独⽴立立
-‐‑‒ Indirect  draw  Commands
-‐‑‒ and more...
ほぼ同時期に策定された Android  Extension  Pack というGL拡張も、
⼤大きな注⽬目を集めた
OpenGL  ES  3.1
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 18
AEP  とは 下記の GL 拡張のことを指します
GL_̲ANDROID_̲extension_̲pack_̲es31a
AEP  はメタ拡張と呼ばれ、開発者はこの GL  拡張が定義されている場合、後述す
る20以上の拡張がサポートされていると⾒見見なす。
この拡張を GPU  がサポートすることにより、DirectX11  世代のゲームを Android  
への移植を容易易にした。
Android  Extension  Pack  (AEP)
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 19
KHR_̲debug
KHR_̲texture_̲compression_̲astc_̲ldr
KHR_̲blend_̲equation_̲advanced
OES_̲sample_̲shading
OES_̲sample_̲variables
OES_̲shader_̲image_̲atomic
OES_̲shader_̲multisample_̲interpolation
OES_̲texture_̲stencil8  
OES_̲texture_̲storage_̲multisample_̲2d_̲array  
EXT_̲copy_̲image
Android  Extension  Pack  (AEP)
EXT_̲draw_̲buffers_̲indexed
EXT_̲geometry_̲shader
EXT_̲gpu_̲shader5  
EXT_̲primitive_̲bounding_̲box
EXT_̲shader_̲io_̲blocks
EXT_̲tessellation_̲shader
EXT_̲texture_̲border_̲clamp
EXT_̲texture_̲buffer
EXT_̲texture_̲cube_̲map_̲array
EXT_̲texture_̲sRGB_̲decode
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 20
OpenGL  ES  最新の策定。2015年年8⽉月に仕様がリリース。
-‐‑‒ Tessellation,  Geometry  Shader
-‐‑‒ ASTC  テクスチャ圧縮
-‐‑‒ Floating point render targets
-‐‑‒ and more...
OpenGL  ES  3.2
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 21
• モバイルグラフィックスAPI進化
-‐‑‒ 現在、主流流となっているのは ES2.0。最新は ES3.2
-‐‑‒ ES3.2 は DirectX11.0  世代と同等の機能を有している
まとめ
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 22
グラフィックスAPI  のパラダイムシフト
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 23
従来のグラフィックスAPI  と GPU  の関係について。
まずは、アプリケーションから Draw  関数を呼び出すと何が起こるかを⾒見見る。
DrawCall とは?
グラフィックスAPI  の描画処理理に関する関数呼び出しのこと。
ドライバは Draw  関数を⼀一つの基準として処理理する。
glDrawElements()
D3D11DeviceContext::DrawIndexed()
GPUの描画
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 24
1:アプリケーションからグラフィックスAPI  の呼び出しを⾏行行うと、
ドライバがメインメモリ上のコマンドバッファに内容を蓄積する
2:DrawCall の呼び出しで コマンドバッファが⼀一杯になる、あるいは Flush,  Present  
が呼び出されるとドライバは GPU  へのフラッシュを準備する
3:ドライバが描画コマンドを GPU  が解釈できる命令令に変換し、同時に描画ステートの
バリデーションを⾏行行う
4:GPU  にコマンドが転送され処理理される
GPUの描画
※ ハードウェアにより実際の処理理は異異なるので留留意
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 25
基本的にドライバは Draw  関数を⼀一つの基準として処理理し、
描画に関するステートをパッケージ化してコマンドバッファに積み、GPU  転送時
にバリデーションしていた。これらの処理理はドライバが暗黙のうちに⾏行行う。
GPUの描画
glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindVertexArrayOES(_vertexArray);
glUseProgram(_program);
glDrawArrays(GL_TRIANGLES, 0, 36);
glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindVertexArrayOES(_vertexArray);
glUseProgram(_program);
glDrawArrays(GL_TRIANGLES, 0, 36);
Draw  Command
clearColor =  0.65f,  0.65f, …
clearFlag =  color  |  depth  …
vertexNum =  36  …
Draw  Command
clearColor =  0.65f,  0.65f, …
clearFlag =  color  |  depth  …
vertexNum =  36  …
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 26
OpenGL  ES  では⼀一部ベンダーの拡張を除いて、標準機能としては
シェーダーのオフラインコンパイルをサポートしていない。
シェーダーの字句句解析、構⽂文解析、最適化、命令令コードの⽣生成の全ては
ドライバがランタイム上で実⾏行行している。
グラフィックスAPIのオーバーヘッド
void main()
{
vec3 eyeNormal = normalize(normalMatrix * normal);
vec3 lightPosition = vec3(0.0, 0.0, 1.0);
vec4 diffuseColor = vec4(0.4, 0.4, 1.0, 1.0);
float nDotVP = max(0.0, dot(eyeNormal, normalize(light)));
colorVarying = diffuseColor * nDotVP;
gl_Position = modelViewProjectionMatrix * position;
}
実⾏行行時に
GPU  のマシンコードへ
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 27
余計なオーバーヘッドはCPU負荷を⽣生み、CPU負荷は発熱とバッテリー消費を招く
これが、スマートフォン上では⼤大きな問題となりえていた。
静的に解決できるものは静的に解決し、
効率率率化できるものは効率率率化し、
ランタイムでの CPU  負荷を削減することはできないか?
低レベルグラフィックスAPIが⽣生まれた
グラフィックスAPIのオーバーヘッド
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 28
2013年年以降降 グラフィックスAPI  に⼤大きな変⾰革が起きている。
AMD  Mantle,  Apple  Metal,  DirectX12,  Khronos Vulkan など、
新しい API  が登場した。
コンシューマゲーム機では⼀一般的であった、低レベルAPI  の思想が⼀一般化
より効率率率的に、より明⽰示的に CPU・GPU  を活⽤用する
→  CPU  のボトルネックを削減する
低レベルグラフィックスAPI
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 29
低レベルグラフィックスAPI
2013年年
2016年年2014年年
2015年年
AMD  Mantle
Apple  Metal
DirectX12
Khronos Vulkan
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 30
Metal,  Vulkan は最新のモバイルレンダリングアーキテクチャを最⼤大限に
活⽤用する機能も含まれている。例例えば⼀一般的な下記3つの GPU  に対応する。
• Immediate  Mode  Rendering  (IMR)
• Tile  Based  Rendering  (TBR)  -‐‑‒ Mali,  Adreno
• Tile  Based  Deffered  Rendering  (TBDR)  – PowerVR
詳細は後述。
低レベルグラフィックスAPI
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 31
Apple  が策定 2014年年9⽉月にリリース(iOS8〜~、OSX  El  Capitan〜~)
iOS  の対応が先⾏行行して⾏行行われ、翌年年に mac  OSX  のサポートも⾏行行われた。
2016年年6⽉月の WWDC2016  でも、Metal  のアップデートが発表された。
⼤大きな更更新としては、iOS  で初めて テッセレーション(※)  がサポートされる。
Apple  Metal
※  mac  OSX  sierra  /  iOS10  の iPhone6s,  iPhone6s  Plus,  iPhone  SE  以降降のデバイスが必須
A9プロセッサー(PowerVR 7XT) でないと、ハードウェアがテッセレータを搭載していないため
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 32
2016年年2⽉月に Vulkan 1.0  がリリース
モバイルからデスクトップまで幅広いプラットフォームをサポートしている
当初、glNext と呼ばれていた。
LunarG 社より Windows/Linux  の Vulkan SDK  が提供されている
Google  からも Vulkan ビルドに対応した、NDK  がリリースされています。
Khronos Vulkan
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 33
描画時はフレームバッファ(Color,  Depth,  Stencil)へのアクセスに注意。
フレームバッファのサイズが⼤大きい場合 Depth  /  Stencil  Buffer  など、
システムメモリアクセスに伴う、フレームバッファの転送の負荷が⼤大きい。
この負荷を下げるために、最新のモバイル GPU  の特徴として
Tile  Based  Rendering  アーキテクチャを採⽤用している。
Modern  mobile  architecture
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 34
Tile  Based  Rendering
Geometry
Processing
Tiling Rasterize
Visibility
Test
Fragment
Processing
Alpha  Test
Alpha  Blend
On-­Chip
Depth  Buffer
On-­Chip
Color  Buffer
Primitive  List
Vertex  Data Texture  Data Frame  Buffer
Geometry
Data
On-‐‑‒Chip Memory
System  Memory
レンダリング時は可能な限りシステムメモリへのアクセスを避ける。
⾼高速な On-‐‑‒Chip  上のメモリに置かれたタイルバッファへの読み書きを⾏行行う。
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 35
Metal,  Vulkan はこの TBR  アーキテクチャに最適化されている。
描画時に⾼高速な On-‐‑‒Chip  上のバッファだけでレンダリングを完結させることが出
来る。
そのため負荷の⾼高いシステムメモリへのアクセスを避けることが可能で、
これにより消費電⼒力力が削減できる。
Tile  Based  Rendering
On-­Chip
Depth  Buffer
On-­Chip
Color  Buffer
On-‐‑‒Chip  Memory
Frame  BufferSystem  Memory
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 36
レンダリング時におけるフレームバッファのアクセスは
Metal:MTLRenderPassDescriptor
Vulkan:VkAttachmentDescription 構造体に指定する。
それぞれ loadAction(op),  storeAction(op)  というメンバ変数を持っており、
レンダリングパス開始時、終了了時のフレームバッファの取り扱いを設定する。
Tile  Based  Rendering
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 37
loadAction(op)
-‐‑‒ Clear  …  フレームバッファの内容を指定の⾊色でクリア
-‐‑‒ Load …  フレームバッファの内容を読み込む (On-‐‑‒chip  へのコピー発⽣生)
-‐‑‒ DontCare …  全てのピクセルが更更新される際に指定
storeAction(op)
-‐‑‒ Store  …  フレームバッファへ書き出す
-‐‑‒ DontCare …  Depth/Stensil などフレームバッファへ書き出す必要がない場合
(プラットフォームごとに最適なパフォーマンス結果となる)
Tile  Based  Rendering
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 38
低レベルグラフィックスの思想として、静的に決定できる物は静的に解決する
→  ラインタイム時にかかる CPU  パワーを排除
• パイプラインステート
• シェーダーコンパイル
• 描画のバリデーション
静的に解決する
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 39
Pipeline  State Object  とは描画に関する情報のこと。
OpenGL  ES  世代では個々に指定されていたが、⼀一まとまりで定義されるようにな
った。ステートは⽣生成時に検証されるため、実⾏行行時のオーバーヘッドがない。
GPU  はこの Pipeline  State  オブジェクトを差し替えるだけで、次のレンダリング
に移ることができる。
Metal:MTLRenderPipelineState
Vulkan:VkPipeline オブジェクトに保持される。
パイプラインステート
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 40
Metal,  Vulkan ともにシェーダーのオフラインコンパイルをサポート
-‐‑‒ シェーダーはオフラインでコンパイルする
-‐‑‒ ランタイム時の⽣生成コストを排除
シェーダーコンパイル
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 41
OpenGL  API  呼び出しのエラーチェックはドライバで実装されており、
• 最後に発⽣生したエラーを glGetError()  
• Debug,  Release  問わず エラーチェック
Metal,  Vulkan 世代では、明⽰示的に Validation  Layer  を有効にすることで、
API  呼び出しのエラーチェックを実施する。
通常は開発時に有効にして、製品版では無効にし CPU  のオーバーヘッドを削減す
る。
バリデーション
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 42
• 従来の グラフィックスAPI  ではコマンドバッファ構築はドライバの仕事だった
• Metal,  Vulkan  世代ではアプリケーションマターへと変わった
• CommandBuffer に対してコマンドを追加
• CommandBuffer を CommandQueue にサブミットする
コマンドバッファ構築
Buffer Texture RenderPass Draw
CommandBuffer
CommandQueue
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 43
CommandBuffer はマルチスレッドで構築できる
空いた時間で更更に多くの Draw  を発⾏行行するか、またはCPUを休めれる
コマンドバッファ構築
Thread0
Thread1
Thread2
Thread3
0ms 5ms 10ms 15ms
CommandBuffer Thread0
Thread1
Thread2
Thread3
0ms 5ms 10ms 15ms
CB
CB
CB
CB
Single-‐‑‒Thread Multiple-‐‑‒Thread
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 44
Metal  と Vulkan において Queue  と Buffer  では使い⽅方が異異なるので注意
Metal  は基本的に⼀一つの Queue  上に Command  Buffer  を追加していく
Vulkan は graphics  と compute  で Queue  が分かれて個別にサブミットする
(VKSemaphore で Queue  の同期を取る)
コマンドバッファ構築
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 45
ブロック圧縮アルゴリズムの⼀一種。
iOS  であれば PVRTC、 Android  であれば ETC が⼀一般的に使われてきた。
Metal,  Vulkan 世代では ASTC という統⼀一的な圧縮フォーマットが使⽤用できる。
→  今までのように、プラットフォームごとに圧縮を分ける必要はない
Adaptive  Scalable  Texture  Compression  (ASTC)
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 46
Low-‐‑‒Overhead,  Low-‐‑‒Level  プログラミング
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 47
iOS,  macOS の Apple  プラットフォームのみサポート
開発環境も macOS 上の Xcode が必須となる。
開発環境:OSX  El  Capitan  /  Xcode7 以降降
実⾏行行環境:iOS 8  /  iPhoen5s  (Apple  A7)  /  以降降
2012年年以降降に発売された MacBook,  iMac  など
Metal  の環境
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 48
最新の macOS と Xcode と iOS デバイスがあれば開発出来る。
Xcode の新規プロジェクト作成より Game  -‐‑‒>  Metal  を選べば、
テンプレートプロジェクトが作成される。
Metal  の開発環境
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 49
Metal の開発環境
https://developer.apple.com/metal/
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 50
Validation  Layer
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 51
• MTLDevice
• MTLCommandQueue
• MTLLibrary
• MTLFunction(Shader)  
• MTLBuffer
• MTLRenderPipelineState
• MTLDepthStencilState
• MTLRenderPassDescriptor
• MTLRenderPassColorAttachmentDescriptor
• MTLRenderPassDepthAttachmentDescriptor
• MTLCommandBuffer
• MTLRenderCommandEncoder
Metal Programming
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 52
以降降のスライドで実際の Metal  のコードを記述していますが、
説明のため重要コードのみピックアップして記載している点に注意して下さい!
完全なソースは Apple Developer  のサンプルを参考にして下さい。
Metal Programming
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 53
ベースとなる初期化部分。
デバイスの取得、コマンドキュー、ライブラリは下記のコードで取得。
ライブラリはシェーダーのアーカイブ。
Metal Programming
id<MTLDevice> device = MTLCreateSystemDefaultDevice();
id<MTLCommandQueue> commandQueue = [device newCommandQueue];
id<MTLLibrary> defaultLibrary = [device newDefaultLibrary];
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 54
シェーダー作成。
Metal Programming
[defaultLibrary newFunctionWithName:@"lighting_fragment"];
[defaultLibrary newFunctionWithName:@"lighting_vertex"];
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 55
Metal  Programming
MTLRenderPipelineDescriptor *pipelineDescriptor = [MTLRenderPipelineDescriptor new];
pipelineDescriptor.vertexDescriptor = vertexDescriptor; // 頂点レイアウト
pipelineDescriptor.vertexFunction = vertexFunction; // Vertexシェーダー
pipelineDescriptor.fragmentFunction = fragmentFunction; // Fragmentシェーダー
pipelineDescriptor.colorAttachments[0].pixelFormat = MTLPixelFormatBGRA8Unorm;
pipelineDescriptor.depthAttachmentPixelFormat = MTLPixelFormatDepth32Float;
パイプラインステートを設定
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 56
Metal  Programming
id<MTLRenderPassDescriptor> _renderPassDescriptor = [MTLRenderPassDescriptor renderPassDescriptor];
MTLRenderPassColorAttachmentDescriptor *colorAttachment = _renderPassDescriptor.colorAttachments[0];
colorAttachment.loadAction = MTLLoadActionClear;
colorAttachment.storeAction = MTLStoreActionStore;
colorAttachment.clearColor = MTLClearColorMake(0.65f, 0.65f, 0.65f, 1.0f);
MTLRenderPassDepthAttachmentDescriptor *depthAttachment = _renderPassDescriptor.depthAttachment;
depthAttachment.loadAction = MTLLoadActionClear;
depthAttachment.storeAction = MTLStoreActionDontCare;
depthAttachment.clearDepth = 1.0;
パイプラインパスを設定
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 57
コマンドバッファの構築
Metal  は CommandEncoder という仕組みで、コマンドバッファに追加
Metal  Programming
id <MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer];
id <MTLRenderCommandEncoder> renderEncoder =
[commandBuffer renderCommandEncoderWithDescriptor:desc];
[renderEncoder setDepthStencilState:_depthState];
[renderEncoder setRenderPipelineState:_pipelineState];
[renderEncoder setVertexBuffer:_vertexBuffer offset:0 atIndex:0 ];
[renderEncoder drawPrimitives:MTLPrimitiveTypeTriangle vertexStart:0 vertexCount:36];
[renderEncoder endEncoding];
[commandBuffer presentDrawable:view.currentDrawable];
[commandBuffer commit];
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 58
Metal Programming
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 59
Vulkan はクロスプラットフォームに対応する。
2016年年8⽉月現在、Windows,  Linux,  Android,  Tizen と⾔言った、
各種プラットフォームをサポートしている。
Windows  /  Linux  の SDK  が LunarG 社より提供されている。
Vulkan の環境
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 60
Android 7.0  (Nougat)  以降降でサポート
• 2016年年3⽉月より開発者向け Preview  と NDK がリリース
• 2016年年8⽉月23⽇日に正式版リリース
• 現時点の対応端末は Nexus  6,  Nexus  5X,  Nexsus 6P,  Nexsus 9.
• Android  Studio  にインポートできるサンプルが提供されている
Vulkan-‐‑‒basic-‐‑‒samples
https://github.com/googlesamples/vulkan-‐‑‒basic-‐‑‒samples
Vulkan の実⾏行行環境
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 61
Vulkan は SPIR-‐‑‒V  と呼ばれる、
中間バイナリーデータをサポートしている。
→  Graphics  Shader,  Compute  Kernel  などは SPIR-‐‑‒V  でロードする
GLSL/HLSL  でシェーダーを記述し、ビルド時に SPIR-‐‑‒V  を⽣生成する
SPIR-‐‑‒V
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 62
Vulkan は vkInstance を⽣生成することから始める。
プラットフォームごとの描画サーフェスや、実⾏行行に必要なレイヤーなどシステムへ
のアクセスは vkInstance を通して⾏行行われる
Vulkan Programming
VkInstance inst;;
vkCreateInstance(&inst_info,  NULL,  &inst);;
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 63
vkInstance からシステムの物理理デバイスを取得する。
物理理デバイスからアプリで使う GPU  インターフェース VKDevice が作成できる。
Vulkan Programming
VkPhysicalDevice physical_devices;;
VkDevice device;;
vkEnumeratePhysicalDevices(inst,  &gpu_count,  &physical_devices);;
vkCreateDevice(physical_devices,  &deviceInfo,  NULL,  &device);;
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 64
vkCreateRenderPass
vkCreateShaderModule
vkCreateGraphicsPipelines
vkAllocateDescriptorSets
vkUpdateDescriptorSets
vkCreateCommandPool
vkAllocateCommandBuffers
vkCreateImage
vkCreateImageView
Vulkan Programming
vkCreateBuffer
vkBindBufferMemory
vkCreateDescriptorSetLayout
vkCreatePipelineLayout
vkCreateDescriptorPool
vkCreateFramebuffer
vkAllocateMemory
vkBindImageMemory
VKDevice を通して下記オブジェクト、リソースを⽣生成する。
⻑⾧長くなるので Draw の解説のみに割愛。
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 65
Vulkan のコマンドバッファは VkCommandBuffer
これは vkAllocateCommandBuffers を通してコマンドプールより確保される。
vkBeginCommandBuffer,    vkEndCommandBuffer でコマンドを構築し、
構築したコマンドを vkQueueSubmit でキューに追加する。
コマンドキューは Graphics,  Compute,  Transfer  ⽤用途ごとに分ける必要がある
Vulkan Programming
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 66
vkBeginCommandBuffer
vkCmdPipelineBarrier
vkCmdBeginRenderPass
vkCmdBindPipeline
vkCmdBindDescriptorSets
vkCmdSetViewport
vkCmdBindVertexBuffers
vkCmdDraw
vkCmdEndRenderPass
vkEndCommandBuffer
Vulkan Programming
⼀一度度作成したVulkan のコマンドバッファは
次フレームでも再利利⽤用が可能
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 67
Metal, Vulkna はアプローチが似ており、共通項⽬目が多い
• ⽚片⽅方を理理解すれば、もう⽚片⽅方を覚えるのもそこまで⼤大変ではない
• ⾔言語を覚えるというよりも、低レベルAPIの思想を知った⽅方が理理解が早い
Metal, Vulkan まとめ
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 68
Non-‐‑‒Photorealistic  Rendering  における⽔水彩画表現
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 69
Non-‐‑‒Photorealistic  Rendering  (NPR)  は、コンシューマゲームに代表される
フォトリアルな絵作りとは対を成すレンダリング技法。
トゥーンシェーダなどのアニメ調の表現も NPR  の技法に区分される
Non-‐‑‒Photorealistic  Rendering
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 70
フォトリアルな絵作りに必要な要素を考えてみる
• HDRレンダリング
• ⾼高解像度度テクスチャ/ハイレゾメッシュ
• Physically  Based  Rendering
• Global  Illumination
• ⾼高品質なアンチエイリアス
• カラーグレーディング
• Depth  of  Fields
• 多数の動的ライト
なぜNPRなのか?
これらの処理理をモバイルで実現?
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 71
モバイルが抱える問題にはバッテリー消費/発熱の問題がある。
演算⼀一回、メモリアクセス⼀一回にも僅かながらバッテリーを消費しており、時間と
ともに某⼤大なバッテリー消費へと発展する。
CPU/GPUに余裕があっても、追加のグラフィックス⽤用途を組み込む、
ということがやり⾟辛い環境にある。
モバイルのジレンマ
現実的なバッテリー消費と絵作りの品質について、そのトレードオフを考える
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 72
現実的なタスク量量で実現可能な絵作りとは。
コンシューマはハードウェアと技術の進歩により現実的なタスク量量での
フォトリアルレンダリングを実現する⼿手段を得た。
モバイルもフォトリアルな絵作りのために、ハードウェアの進化を待つか?
→  GPU  の性能向上は、画⾯面の⾼高解像度度化に相殺される可能性もある
それよりプラットフォームが異異なり、提供できるゲームの形が異異なるのだから
絵作りの⽅方向性もまた、コンシューマのリアルとは別路路線に振り切切ってみる
NPRへのモチベーション
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 73
⽔水彩画を表現
※ 本物の⽔水彩画です
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 74
• 多彩なアプローチ
→ PBR 実装のような、物理理現象への依存が少ないため実装が容易易
→  視覚的効果が⾼高い実装の追求が可能
• オブジェクト描画時に、統⼀一的なマテリアルになることが期待できる
→  バッチ描画できる可能性が増える
→  質感はポストプロセスで掛ける。基本は1マテリアルで描画できる
NPRの利利点
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 75
• 質感をポストポロセスへ
→ 描画マテリアルの簡素化
→ 描画オブジェクト数に依存せずに、NPR に関する負荷を固定で⾒見見積もる
• 繊細な表現ではなく、視認性の⾼高さを評価し採⽤用
→ 例例えば、⽇日本アニメとの親和性の⾼高さなど
アニメ表現はほぼ⼀一般的に⾏行行われているため、
今回は同じ題材を選ぶよりは思考を変えて⽔水彩画に挑戦する。
NPRの利利点
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 76
• ⽔水彩画に使われる⽔水彩紙の表現
紙肌の粗⽬目による凹凸感、
• 絵の具のにじみ、ぼかし、かすれ表現
輪輪郭部分は他の⾊色と混ざり合い、グラデーションがかかる
• デジタル特有のポスト加⼯工処理理の追加
⽔水彩表現をベースとした上で、更更にゲームの世界観の向上へ
⽔水彩画の特徴
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 77
⽔水彩紙とは、透明⽔水彩や不不透明⽔水彩などの⽔水彩絵具
を⽤用いた描画に適した専⽤用紙の総称。
紙質によっては⾼高い吸⽔水性を保持しており、⽔水分量量
を調整することで、にじみやぼかし効果に⼤大きな影
響を与えることができる。
⽔水彩紙の表現
http://zokeifile.musabi.ac.jp/%E6%B0%B4%E5%BD%A9%E7%B4%99/
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 78
⽔水彩は絵の具に含まれる⽔水分と、⽔水彩紙特有の吸収
性により、にじみやぼかしが効果が起こる。
塗り⽅方によりエッジ部分は他の⾊色と薄く混ざり合う
絵の具のにじみぼかし
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 79
⽔水彩表現のアプローチ
Final  result
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 80
Final  result
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 81
⽔水彩表現のアプローチ
Texture  only
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 82
⽔水彩画表現のアプローチ
Final  resultTexture  only
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 83
• Multiple  Render  Target  で G-‐‑‒Buffer  にシェーディング情報の書き出し
• G-‐‑‒Buffer  は2枚使⽤用
• DiffuseMap と ハッチングを含むアウトライン線
• 絵の具のにじみ⽅方向を書き込んだ VectorMap
• Compute  Kernel  で⽔水彩表現を処理理
• コンポジット
⽔水彩画表現のアプローチ
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 84
G-‐‑‒Buffer  への書き出し
G-‐‑‒Buffer1
DiffuseMap Hatching  +  Outline
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 85
G-‐‑‒Buffer  への書き出し
G-‐‑‒Buffer2
VectorMap
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 86
モデルに適⽤用する VectorMap は FlowMapPainter を使⽤用して作成
G-‐‑‒Buffer  への書き出し
http://teckartist.com/?page_id=107
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 87
FlowMap の XY  には流流れの⽅方向が記述されている。
この 流流れ を、⽔水彩のストロークとして使⽤用
このベクトルの移動量量をにじみの⽅方向に
G-‐‑‒Buffer  への書き出し
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 88
G-‐‑‒Buffer への書き出し
float3 diffuseColor = diffuseTexture.sample(samplr, vert.texCoord).rgb;
float3 normal = normalize(vert.normal);
float3 eyeDirection = normalize(vert.eyePosition);
// NdotE
half NdotE = dot( normal, eyeDirection );
// hatching
half hatching = hatchingTexture.sample(samplr, vert.texCoord).x;
hatching = mix(hatching, half(1.0f), half(0.15f ));
// Outline
half4 edgeColor = half4( half3( 0.6f ), 1.0f );
half edgePower = 5.0f;
half4 outline = saturate( half4( NdotE * edgePower * hatching ) + edgeColor );
// Flowmap
float4 flowmap = flowmapTexture.sample(samplr, vert.texCoord);
flowmap.xy = (flowmap.xy * float2(0.5f) ) + float2(0.5f);
MX::FragOutput output;
output.albedo = float4( diffuseColor, outline.x );
output.normal = float4( flowmap.xyz, 1.0f );
return output;
Fragment  shader
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 89
G-‐‑‒Buffer  で書き出した2枚のテクスチャを Compute  Kernel  へ⼊入⼒力力する。
書き出した VectorMap の情報をもとに DiffuseMap のテクスチャ位置をずらして
サンプリングする。
Compute  Kernel
half4 inColor = inTexture.read(gid);
half4 inColor2 = inTexture2.read(gid);
half flowPower = 80.0f;
uint2 coord = uint2( gid.x + (int)( inColor2.x * flowPower ),
gid.y + (int)( inColor2.y * flowPower ));
half4 flow = inTexture.read( coord );
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 90
Compute  Kernel
VectorMap 適⽤用した結果
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 91
思ってた結果にならない…
もっとぐにゃっと曲がってほしい。
殆どのモデルの VectorMap  サンプリング位置が均⼀一になっている
→ VectorMap の⽅方向ベクトルとモデルの UV  位置が問題
Compute  Kernel
ただ、モデルごとに個別に VectorMap を⽤用意するのも、
UV  を修正するのもやりたくない。
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 92
回避策
• VectorMap にノイズで重み付けを⾏行行う
• サンプリングした VectorMap に揺らぎをつける
Compute  Kernel
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 93
ランタイム上の Compute  Kernel  で Perlin Noise  を⽣生成する
→ 起動時に⽣生成して G-‐‑‒Buffer  と⼀一緒に Kernel  へ⼊入⼒力力する
Compute  Kernel
half rand( half2 n ) {
return fract( sin( dot( n, half2(12.9898f, 4.1414f ) ) ) * 43758.5453f );
}
half perlinNoise( half2 p ){
half2 ip = floor(p);
half2 u = fract(p);
u = u * u * (3.0f - 2.0f * u );
half res = mix( mix( rand( ip ),
rand( ip + half2( 1.0f, 0.0f ) ), u.x ),
mix( rand( ip + half2( 0.0f, 1.0f ) ),
rand( ip + half2( 1.0f, 1.0f ) ), u.x ), u.y);
return res * res;
}
https://gist.github.com/patriciogonzalezvivo/670c22f3966e662d2f83
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 94
Compute  Kernel
VectorMap only VectorMap +  Perlin Noise
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 95
元の DiffuseColor と、ずらした DiffuseColor を合成する
合成時は Perlin Noise  の重み付けをもとに、⾊色を mix  する
Compute  Kernel
// パーリンノイズの強度をブレンドの強度にする
half flowBlend = noise;
half4 originMix = mix( inColor, flow, flowBlend );
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 96
Compute  Kernel
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 97
Compute  Kernel
Diffuse  only ブレンド結果
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 98
Compute  Kernel
half4 inColor = inTexture.read(gid);
half4 inColor2 = inTexture2.read(gid);
half flowPower = 80.0f;
uint2 coord = uint2( gid.x + (int)( inColor2.x * flowPower * noise ),
gid.y + (int)( inColor2.y * flowPower * noise ));
half4 flow = inTexture.read( coord );
// 輝度が高すぎるので、輝度を落とす
flow = mix( flow, half4( 1.0f ), (half)0.3f );
inColor = mix( inColor, half4( 1.0f ), (half)0.1f );
// パーリンノイズの強度をブレンドの強度にする
half flowBlend = noise;
half4 originMix = mix( inColor, flow, flowBlend );
// ハッチングとアウトラインを書き出す
originMix.w = inColor.w;
outTexture.write( half4( originMix ), gid );
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 99
Hatching  +  Outline  の線は、次のぼかしパスがあるため、
ComputeKernel からはテクスチャの w  要素に⼊入れて書き出しておく。
後のコンポジットパスで合成する。
Compute  Kernel
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 100
結果をさらに Compute  Kernel  で加⼯工する
• 1/2  にダウンサンプリング
• ガウスぼかし
Compute  Kernel
このぼかした結果を最終的なコンポジットパスで合成する
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 101
コンポジットの段階では3枚のテクスチャを利利⽤用する
• にじみテクスチャ
• ぼかしテクスチャ
• ⽔水彩紙テクスチャ
コンポジット
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 102
⽔水彩紙テクスチャ
事前に Photoshop  のフィルターで作成。
⽔水彩紙の凹凸を表現したテクスチャ
コンポジットで合成する
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 103
にじみテクスチャとぼかしテクスチャをブレンドする
コンポジット
half blendRate = 0.51f;
return mix( color0, color1, blendRate );
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 104
コンポジット
ソフトフォーカスのような効果が得られる
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 105
コンポジット
この時ブレンドする BlendRate が⾼高すぎるとぼやけた絵になるので注意
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 106
ブレンド前
コンポジット
ブレンド後
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 107
この結果に対して、スクリーン全体に⽔水彩紙テクスチャを追加する。
コンポジット
float2 screenUV = (inFrag.position.xy / uniforms.screenSize);
half4 paperTex = paperTex2D.sample(quadSampler, screenUV);
half4 color0 = tex2D.sample(quadSampler, inFrag.texCoord);
Half4 color1 = blurTex2D.sample(quadSampler, inFrag.texCoord);
half blendRate = 0.51f;
return mix( color0, color1, blendRate ) * paperTex;
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 108
コンポジット
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 109
更更にハッチングとアウトライン線を追加
コンポジット
float2 screenUV = (inFrag.position.xy / uniforms.screenSize);
half4 paperTex = paperTex2D.sample(quadSampler, screenUV);
half4 color0 = tex2D.sample(quadSampler, inFrag.texCoord);
Half4 color1 = blurTex2D.sample(quadSampler, inFrag.texCoord);
half blendRate = 0.51f;
return mix( color0, color1, blendRate ) * color0.w * paperTex;
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 110
コンポジット
Final  result
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 111
Final  result
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 112
• モバイルでも NPR  は現実的な負荷で処理理できる
• アイディア次第で全く新しいグラフィックス表現が実現できる可能性
• ベースとなる GPU  の機能強化と性能向上
• Metal,  Vulkan に対応する GPU  そのもののベース性能が向上している
• 各 GPU  機能の均⼀一化が進み、拡張に依存しない統⼀一的な実装環境
• Shader が書きやすい
• GLSLでは #include,  #define  が使えないため、複雑なシェーダーが書き⾟辛い
• MSL,  SPIR-‐‑‒V(変換前のシェーダー)  ではコンパイル時にプリプロセッサが働く
まとめ
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 113
• モバイルでは、処理理負荷の1msecを削減することに意味がある
• 低レベルグラフィックスAPIはモバイルにこそ価値がある
• バッテリー消費と発熱の問題を考える上で、僅かなオーバーヘッドの削減は、アプリ
全体の継続率率率にも影響を与える
• 今後の低レベルグラフィックスAPI
• 登場時期の速さから、今は Metal  が先⾏行行して普及している
• Vulkan も対応プラットフォーム数の多さから、いずれ Metal  に追いつく
• 2018年年頃には モバイルでの低レベルグラフィックスAPI  が⼀一般化している
まとめ
Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 114
ご清聴ありがとうございました。

Mais conteúdo relacionado

Mais procurados

Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編Unity Technologies Japan K.K.
 
[UE4]自動テストでもっと楽したい!
[UE4]自動テストでもっと楽したい![UE4]自動テストでもっと楽したい!
[UE4]自動テストでもっと楽したい!com044
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するTakahito Tejima
 
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術Unity Technologies Japan K.K.
 
UE4でTranslucencyやUnlitに影を落としたい!
UE4でTranslucencyやUnlitに影を落としたい!UE4でTranslucencyやUnlitに影を落としたい!
UE4でTranslucencyやUnlitに影を落としたい!com044
 
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動についてUE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動についてcom044
 
Unityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTipsUnityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTipsUnity Technologies Japan K.K.
 
HDR Theory and practicce (JP)
HDR Theory and practicce (JP)HDR Theory and practicce (JP)
HDR Theory and practicce (JP)Hajime Uchimura
 

Mais procurados (20)

Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編
 
UE4におけるレベル制作事例
UE4におけるレベル制作事例  UE4におけるレベル制作事例
UE4におけるレベル制作事例
 
UE4における大規模背景制作事例 最適化ワークフロー編
UE4における大規模背景制作事例 最適化ワークフロー編UE4における大規模背景制作事例 最適化ワークフロー編
UE4における大規模背景制作事例 最適化ワークフロー編
 
UE4におけるLoadingとGCのProfilingと最適化手法
UE4におけるLoadingとGCのProfilingと最適化手法UE4におけるLoadingとGCのProfilingと最適化手法
UE4におけるLoadingとGCのProfilingと最適化手法
 
[UE4]自動テストでもっと楽したい!
[UE4]自動テストでもっと楽したい![UE4]自動テストでもっと楽したい!
[UE4]自動テストでもっと楽したい!
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
 
UE4をレンダラとした趣味的スピード背景ルックデブ(UE4 Environment Art Dive)
UE4をレンダラとした趣味的スピード背景ルックデブ(UE4 Environment Art Dive)UE4をレンダラとした趣味的スピード背景ルックデブ(UE4 Environment Art Dive)
UE4をレンダラとした趣味的スピード背景ルックデブ(UE4 Environment Art Dive)
 
猫でも分かるUMG
猫でも分かるUMG猫でも分かるUMG
猫でも分かるUMG
 
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
 
UE4とBlenderでランニングコストを抑えるモダンなワークフロー
UE4とBlenderでランニングコストを抑えるモダンなワークフローUE4とBlenderでランニングコストを抑えるモダンなワークフロー
UE4とBlenderでランニングコストを抑えるモダンなワークフロー
 
Unity2018/2019における最適化事情
Unity2018/2019における最適化事情Unity2018/2019における最適化事情
Unity2018/2019における最適化事情
 
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
 
Mask Material only in Early Z-passの効果と仕組み
Mask Material only in Early Z-passの効果と仕組みMask Material only in Early Z-passの効果と仕組み
Mask Material only in Early Z-passの効果と仕組み
 
UE4でTranslucencyやUnlitに影を落としたい!
UE4でTranslucencyやUnlitに影を落としたい!UE4でTranslucencyやUnlitに影を落としたい!
UE4でTranslucencyやUnlitに影を落としたい!
 
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動についてUE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
 
UE4のローカライズ機能紹介 (UE4 Localization Deep Dive)
UE4のローカライズ機能紹介 (UE4 Localization Deep Dive)UE4のローカライズ機能紹介 (UE4 Localization Deep Dive)
UE4のローカライズ機能紹介 (UE4 Localization Deep Dive)
 
UE4における大規模背景制作事例(コリジョン編)
UE4における大規模背景制作事例(コリジョン編) UE4における大規模背景制作事例(コリジョン編)
UE4における大規模背景制作事例(コリジョン編)
 
猫でも分かる UE4の新しいサンプル「Action RPG」について
猫でも分かる UE4の新しいサンプル「Action RPG」について猫でも分かる UE4の新しいサンプル「Action RPG」について
猫でも分かる UE4の新しいサンプル「Action RPG」について
 
Unityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTipsUnityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTips
 
HDR Theory and practicce (JP)
HDR Theory and practicce (JP)HDR Theory and practicce (JP)
HDR Theory and practicce (JP)
 

Destaque

中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~ProjectAsura
 
CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜
CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜
CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜Drecom Co., Ltd.
 
Tabc vol3 テクニカルアーティストを始めるにあたって
Tabc vol3 テクニカルアーティストを始めるにあたってTabc vol3 テクニカルアーティストを始めるにあたって
Tabc vol3 テクニカルアーティストを始めるにあたってfumoto kazuhiro
 
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…Drecom Co., Ltd.
 
Q(キュー)サイトに学ぶ、 演出のためのHTML5
Q(キュー)サイトに学ぶ、 演出のためのHTML5Q(キュー)サイトに学ぶ、 演出のためのHTML5
Q(キュー)サイトに学ぶ、 演出のためのHTML5Yamato Honda
 
Application parallelisation Android - Klaas Vangend
Application parallelisation Android - Klaas VangendApplication parallelisation Android - Klaas Vangend
Application parallelisation Android - Klaas Vangendナム-Nam Nguyễn
 
Aiming 開発ゲームの裏側
Aiming 開発ゲームの裏側Aiming 開発ゲームの裏側
Aiming 開発ゲームの裏側Katsutoshi Makino
 
Unityのポストエフェクトで遊ぶ!
Unityのポストエフェクトで遊ぶ!Unityのポストエフェクトで遊ぶ!
Unityのポストエフェクトで遊ぶ!Yamato Honda
 
Weighted Blended Order Independent Transparency
Weighted Blended Order Independent TransparencyWeighted Blended Order Independent Transparency
Weighted Blended Order Independent Transparencyzokweiron
 
ACES 1.0 OpenColorIO config - Siggraph 2015
ACES 1.0 OpenColorIO config - Siggraph 2015ACES 1.0 OpenColorIO config - Siggraph 2015
ACES 1.0 OpenColorIO config - Siggraph 2015hpduiker
 
Unity & VR (Unity Roadshow 2016)
Unity & VR (Unity Roadshow 2016)Unity & VR (Unity Roadshow 2016)
Unity & VR (Unity Roadshow 2016)ozlael ozlael
 
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”Drecom Co., Ltd.
 
5年後のデータサイエンティスト
5年後のデータサイエンティスト5年後のデータサイエンティスト
5年後のデータサイエンティストDrecom Co., Ltd.
 
Penner pre-integrated skin rendering (siggraph 2011 advances in real-time r...
Penner   pre-integrated skin rendering (siggraph 2011 advances in real-time r...Penner   pre-integrated skin rendering (siggraph 2011 advances in real-time r...
Penner pre-integrated skin rendering (siggraph 2011 advances in real-time r...JP Lee
 
レイトレ合宿3!!! 5分間アピールプレゼン―Pocol
レイトレ合宿3!!! 5分間アピールプレゼン―Pocolレイトレ合宿3!!! 5分間アピールプレゼン―Pocol
レイトレ合宿3!!! 5分間アピールプレゼン―PocolProjectAsura
 
Kansai cedec 2015_fumoto
Kansai cedec 2015_fumotoKansai cedec 2015_fumoto
Kansai cedec 2015_fumotofumoto kazuhiro
 
Unity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだことUnity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだことKatsutoshi Makino
 
フライングゲットガチャ セミナー資料
フライングゲットガチャ セミナー資料フライングゲットガチャ セミナー資料
フライングゲットガチャ セミナー資料Drecom Co., Ltd.
 

Destaque (20)

中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~
 
CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜
CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜
CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜
 
Tabc vol3 テクニカルアーティストを始めるにあたって
Tabc vol3 テクニカルアーティストを始めるにあたってTabc vol3 テクニカルアーティストを始めるにあたって
Tabc vol3 テクニカルアーティストを始めるにあたって
 
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
 
Q(キュー)サイトに学ぶ、 演出のためのHTML5
Q(キュー)サイトに学ぶ、 演出のためのHTML5Q(キュー)サイトに学ぶ、 演出のためのHTML5
Q(キュー)サイトに学ぶ、 演出のためのHTML5
 
Application parallelisation Android - Klaas Vangend
Application parallelisation Android - Klaas VangendApplication parallelisation Android - Klaas Vangend
Application parallelisation Android - Klaas Vangend
 
Aiming 開発ゲームの裏側
Aiming 開発ゲームの裏側Aiming 開発ゲームの裏側
Aiming 開発ゲームの裏側
 
Unityのポストエフェクトで遊ぶ!
Unityのポストエフェクトで遊ぶ!Unityのポストエフェクトで遊ぶ!
Unityのポストエフェクトで遊ぶ!
 
Weighted Blended Order Independent Transparency
Weighted Blended Order Independent TransparencyWeighted Blended Order Independent Transparency
Weighted Blended Order Independent Transparency
 
ACES 1.0 OpenColorIO config - Siggraph 2015
ACES 1.0 OpenColorIO config - Siggraph 2015ACES 1.0 OpenColorIO config - Siggraph 2015
ACES 1.0 OpenColorIO config - Siggraph 2015
 
Unity & VR (Unity Roadshow 2016)
Unity & VR (Unity Roadshow 2016)Unity & VR (Unity Roadshow 2016)
Unity & VR (Unity Roadshow 2016)
 
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
 
GPU最適化入門
GPU最適化入門GPU最適化入門
GPU最適化入門
 
5年後のデータサイエンティスト
5年後のデータサイエンティスト5年後のデータサイエンティスト
5年後のデータサイエンティスト
 
Penner pre-integrated skin rendering (siggraph 2011 advances in real-time r...
Penner   pre-integrated skin rendering (siggraph 2011 advances in real-time r...Penner   pre-integrated skin rendering (siggraph 2011 advances in real-time r...
Penner pre-integrated skin rendering (siggraph 2011 advances in real-time r...
 
Aclt1
Aclt1Aclt1
Aclt1
 
レイトレ合宿3!!! 5分間アピールプレゼン―Pocol
レイトレ合宿3!!! 5分間アピールプレゼン―Pocolレイトレ合宿3!!! 5分間アピールプレゼン―Pocol
レイトレ合宿3!!! 5分間アピールプレゼン―Pocol
 
Kansai cedec 2015_fumoto
Kansai cedec 2015_fumotoKansai cedec 2015_fumoto
Kansai cedec 2015_fumoto
 
Unity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだことUnity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだこと
 
フライングゲットガチャ セミナー資料
フライングゲットガチャ セミナー資料フライングゲットガチャ セミナー資料
フライングゲットガチャ セミナー資料
 

Semelhante a CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介

ETロボコン2020 競技会場システムのおはなし
ETロボコン2020 競技会場システムのおはなしETロボコン2020 競技会場システムのおはなし
ETロボコン2020 競技会場システムのおはなしTetsuya Odashima
 
Abc2012spring robot sammit - Kurimoto
Abc2012spring robot sammit - KurimotoAbc2012spring robot sammit - Kurimoto
Abc2012spring robot sammit - KurimotoKenichi Kurimoto
 
初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウKentarou Mukunasi
 
MediaPipeの紹介
MediaPipeの紹介MediaPipeの紹介
MediaPipeの紹介emakryo
 
Hello, DirectCompute
Hello, DirectComputeHello, DirectCompute
Hello, DirectComputedasyprocta
 
ngCore engine for mobage platform
ngCore engine for mobage platformngCore engine for mobage platform
ngCore engine for mobage platformToru Yamaguchi
 
GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...
GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...
GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...Web Technology Corp.
 
熊本クラウド語ろう会 - Azure開発入門
熊本クラウド語ろう会 -  Azure開発入門熊本クラウド語ろう会 -  Azure開発入門
熊本クラウド語ろう会 - Azure開発入門Daiyu Hatakeyama
 
UnityによるAR/VR/MR 開発体験講座
UnityによるAR/VR/MR 開発体験講座UnityによるAR/VR/MR 開発体験講座
UnityによるAR/VR/MR 開発体験講座Yuichi Ishii
 
改めて注目される2D アニメーションツール SpriteStudio ~国産2Dツールが(舶来ゲームエンジンの力を借りながら)世界へ~
改めて注目される2D アニメーションツール SpriteStudio ~国産2Dツールが(舶来ゲームエンジンの力を借りながら)世界へ~改めて注目される2D アニメーションツール SpriteStudio ~国産2Dツールが(舶来ゲームエンジンの力を借りながら)世界へ~
改めて注目される2D アニメーションツール SpriteStudio ~国産2Dツールが(舶来ゲームエンジンの力を借りながら)世界へ~Web Technology Corp.
 
なぜGPUはディープラーニングに向いているか
なぜGPUはディープラーニングに向いているかなぜGPUはディープラーニングに向いているか
なぜGPUはディープラーニングに向いているかNVIDIA Japan
 
PBL1-v0-200j.pptx
PBL1-v0-200j.pptxPBL1-v0-200j.pptx
PBL1-v0-200j.pptxNAIST
 
2015年度GPGPU実践基礎工学 第11回 GPUでの並列 プログラミング(ベクトル和)
2015年度GPGPU実践基礎工学 第11回 GPUでの並列プログラミング(ベクトル和)2015年度GPGPU実践基礎工学 第11回 GPUでの並列プログラミング(ベクトル和)
2015年度GPGPU実践基礎工学 第11回 GPUでの並列 プログラミング(ベクトル和)智啓 出川
 
Azure Remote Renderingを試す
Azure Remote Renderingを試すAzure Remote Renderingを試す
Azure Remote Renderingを試すTakahiro Miyaura
 
HTML5開発最前線
HTML5開発最前線HTML5開発最前線
HTML5開発最前線yoshikawa_t
 

Semelhante a CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介 (20)

ETロボコン2020 競技会場システムのおはなし
ETロボコン2020 競技会場システムのおはなしETロボコン2020 競技会場システムのおはなし
ETロボコン2020 競技会場システムのおはなし
 
Abc2012spring robot sammit - Kurimoto
Abc2012spring robot sammit - KurimotoAbc2012spring robot sammit - Kurimoto
Abc2012spring robot sammit - Kurimoto
 
Abc2012spring slide
Abc2012spring slideAbc2012spring slide
Abc2012spring slide
 
初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ
 
MediaPipeの紹介
MediaPipeの紹介MediaPipeの紹介
MediaPipeの紹介
 
Hello, DirectCompute
Hello, DirectComputeHello, DirectCompute
Hello, DirectCompute
 
Android gameprogramming
Android gameprogrammingAndroid gameprogramming
Android gameprogramming
 
Decsx launcherv 2.5
Decsx launcherv 2.5Decsx launcherv 2.5
Decsx launcherv 2.5
 
Unreal Engine 4.27 ノンゲーム向け新機能まとめ
Unreal Engine 4.27 ノンゲーム向け新機能まとめUnreal Engine 4.27 ノンゲーム向け新機能まとめ
Unreal Engine 4.27 ノンゲーム向け新機能まとめ
 
ngCore engine for mobage platform
ngCore engine for mobage platformngCore engine for mobage platform
ngCore engine for mobage platform
 
GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...
GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...
GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...
 
Android/iOS端末におけるエッジ推論のチューニング
Android/iOS端末におけるエッジ推論のチューニングAndroid/iOS端末におけるエッジ推論のチューニング
Android/iOS端末におけるエッジ推論のチューニング
 
熊本クラウド語ろう会 - Azure開発入門
熊本クラウド語ろう会 -  Azure開発入門熊本クラウド語ろう会 -  Azure開発入門
熊本クラウド語ろう会 - Azure開発入門
 
UnityによるAR/VR/MR 開発体験講座
UnityによるAR/VR/MR 開発体験講座UnityによるAR/VR/MR 開発体験講座
UnityによるAR/VR/MR 開発体験講座
 
改めて注目される2D アニメーションツール SpriteStudio ~国産2Dツールが(舶来ゲームエンジンの力を借りながら)世界へ~
改めて注目される2D アニメーションツール SpriteStudio ~国産2Dツールが(舶来ゲームエンジンの力を借りながら)世界へ~改めて注目される2D アニメーションツール SpriteStudio ~国産2Dツールが(舶来ゲームエンジンの力を借りながら)世界へ~
改めて注目される2D アニメーションツール SpriteStudio ~国産2Dツールが(舶来ゲームエンジンの力を借りながら)世界へ~
 
なぜGPUはディープラーニングに向いているか
なぜGPUはディープラーニングに向いているかなぜGPUはディープラーニングに向いているか
なぜGPUはディープラーニングに向いているか
 
PBL1-v0-200j.pptx
PBL1-v0-200j.pptxPBL1-v0-200j.pptx
PBL1-v0-200j.pptx
 
2015年度GPGPU実践基礎工学 第11回 GPUでの並列 プログラミング(ベクトル和)
2015年度GPGPU実践基礎工学 第11回 GPUでの並列プログラミング(ベクトル和)2015年度GPGPU実践基礎工学 第11回 GPUでの並列プログラミング(ベクトル和)
2015年度GPGPU実践基礎工学 第11回 GPUでの並列 プログラミング(ベクトル和)
 
Azure Remote Renderingを試す
Azure Remote Renderingを試すAzure Remote Renderingを試す
Azure Remote Renderingを試す
 
HTML5開発最前線
HTML5開発最前線HTML5開発最前線
HTML5開発最前線
 

Mais de Drecom Co., Ltd.

コンテナで始める柔軟な AWS Lambda 生活
コンテナで始める柔軟な AWS Lambda 生活コンテナで始める柔軟な AWS Lambda 生活
コンテナで始める柔軟な AWS Lambda 生活Drecom Co., Ltd.
 
サービスのインシデントを解決するには.pdf
サービスのインシデントを解決するには.pdfサービスのインシデントを解決するには.pdf
サービスのインシデントを解決するには.pdfDrecom Co., Ltd.
 
ドリコムサマージョブ報告 by 佐々木 誠治
ドリコムサマージョブ報告 by 佐々木 誠治ドリコムサマージョブ報告 by 佐々木 誠治
ドリコムサマージョブ報告 by 佐々木 誠治Drecom Co., Ltd.
 
DRECOM Summer Internship 2019 成果発表 by 鹿内 裕介
DRECOM Summer Internship 2019 成果発表 by 鹿内 裕介DRECOM Summer Internship 2019 成果発表 by 鹿内 裕介
DRECOM Summer Internship 2019 成果発表 by 鹿内 裕介Drecom Co., Ltd.
 
HTML5 ゲームフレームワーク開発について
HTML5 ゲームフレームワーク開発についてHTML5 ゲームフレームワーク開発について
HTML5 ゲームフレームワーク開発についてDrecom Co., Ltd.
 
「AROW」お披露目(導入編)
「AROW」お披露目(導入編)「AROW」お披露目(導入編)
「AROW」お披露目(導入編)Drecom Co., Ltd.
 
「AROW」お披露目(実用編)
「AROW」お披露目(実用編)「AROW」お披露目(実用編)
「AROW」お披露目(実用編)Drecom Co., Ltd.
 
AROW の紹介 〜概要編〜
AROW の紹介 〜概要編〜AROW の紹介 〜概要編〜
AROW の紹介 〜概要編〜Drecom Co., Ltd.
 
AROW の紹介 〜実践編〜
AROW の紹介 〜実践編〜AROW の紹介 〜実践編〜
AROW の紹介 〜実践編〜Drecom Co., Ltd.
 
rails-developers-meetup-day4
rails-developers-meetup-day4rails-developers-meetup-day4
rails-developers-meetup-day4Drecom Co., Ltd.
 
html5conf2018-sponsor-session
html5conf2018-sponsor-sessionhtml5conf2018-sponsor-session
html5conf2018-sponsor-sessionDrecom Co., Ltd.
 
DApps のユーザ認証に web3.eth.personal.sign を使おう!
DApps のユーザ認証に web3.eth.personal.sign を使おう!DApps のユーザ認証に web3.eth.personal.sign を使おう!
DApps のユーザ認証に web3.eth.personal.sign を使おう!Drecom Co., Ltd.
 
3Dリアルマップを用いたモバイルゲーム開発における課題とその解決方法
3Dリアルマップを用いたモバイルゲーム開発における課題とその解決方法3Dリアルマップを用いたモバイルゲーム開発における課題とその解決方法
3Dリアルマップを用いたモバイルゲーム開発における課題とその解決方法Drecom Co., Ltd.
 
LoveChainのスマートコントラクトを見てみよう & 非中央集権なトークンのカタチ
LoveChainのスマートコントラクトを見てみよう & 非中央集権なトークンのカタチLoveChainのスマートコントラクトを見てみよう & 非中央集権なトークンのカタチ
LoveChainのスマートコントラクトを見てみよう & 非中央集権なトークンのカタチDrecom Co., Ltd.
 
今月のレッツゴー陰陽師!
今月のレッツゴー陰陽師!今月のレッツゴー陰陽師!
今月のレッツゴー陰陽師!Drecom Co., Ltd.
 
位置情報を常に取得するのはつらいよ
位置情報を常に取得するのはつらいよ位置情報を常に取得するのはつらいよ
位置情報を常に取得するのはつらいよDrecom Co., Ltd.
 
カンバンと朝会とわたくし
カンバンと朝会とわたくしカンバンと朝会とわたくし
カンバンと朝会とわたくしDrecom Co., Ltd.
 
エンジニア生存戦略
エンジニア生存戦略エンジニア生存戦略
エンジニア生存戦略Drecom Co., Ltd.
 
ソーシャルアプリを分析してみた
ソーシャルアプリを分析してみたソーシャルアプリを分析してみた
ソーシャルアプリを分析してみたDrecom Co., Ltd.
 
Railsによるワイルドなソフトウェア開発
Railsによるワイルドなソフトウェア開発Railsによるワイルドなソフトウェア開発
Railsによるワイルドなソフトウェア開発Drecom Co., Ltd.
 

Mais de Drecom Co., Ltd. (20)

コンテナで始める柔軟な AWS Lambda 生活
コンテナで始める柔軟な AWS Lambda 生活コンテナで始める柔軟な AWS Lambda 生活
コンテナで始める柔軟な AWS Lambda 生活
 
サービスのインシデントを解決するには.pdf
サービスのインシデントを解決するには.pdfサービスのインシデントを解決するには.pdf
サービスのインシデントを解決するには.pdf
 
ドリコムサマージョブ報告 by 佐々木 誠治
ドリコムサマージョブ報告 by 佐々木 誠治ドリコムサマージョブ報告 by 佐々木 誠治
ドリコムサマージョブ報告 by 佐々木 誠治
 
DRECOM Summer Internship 2019 成果発表 by 鹿内 裕介
DRECOM Summer Internship 2019 成果発表 by 鹿内 裕介DRECOM Summer Internship 2019 成果発表 by 鹿内 裕介
DRECOM Summer Internship 2019 成果発表 by 鹿内 裕介
 
HTML5 ゲームフレームワーク開発について
HTML5 ゲームフレームワーク開発についてHTML5 ゲームフレームワーク開発について
HTML5 ゲームフレームワーク開発について
 
「AROW」お披露目(導入編)
「AROW」お披露目(導入編)「AROW」お披露目(導入編)
「AROW」お披露目(導入編)
 
「AROW」お披露目(実用編)
「AROW」お披露目(実用編)「AROW」お披露目(実用編)
「AROW」お披露目(実用編)
 
AROW の紹介 〜概要編〜
AROW の紹介 〜概要編〜AROW の紹介 〜概要編〜
AROW の紹介 〜概要編〜
 
AROW の紹介 〜実践編〜
AROW の紹介 〜実践編〜AROW の紹介 〜実践編〜
AROW の紹介 〜実践編〜
 
rails-developers-meetup-day4
rails-developers-meetup-day4rails-developers-meetup-day4
rails-developers-meetup-day4
 
html5conf2018-sponsor-session
html5conf2018-sponsor-sessionhtml5conf2018-sponsor-session
html5conf2018-sponsor-session
 
DApps のユーザ認証に web3.eth.personal.sign を使おう!
DApps のユーザ認証に web3.eth.personal.sign を使おう!DApps のユーザ認証に web3.eth.personal.sign を使おう!
DApps のユーザ認証に web3.eth.personal.sign を使おう!
 
3Dリアルマップを用いたモバイルゲーム開発における課題とその解決方法
3Dリアルマップを用いたモバイルゲーム開発における課題とその解決方法3Dリアルマップを用いたモバイルゲーム開発における課題とその解決方法
3Dリアルマップを用いたモバイルゲーム開発における課題とその解決方法
 
LoveChainのスマートコントラクトを見てみよう & 非中央集権なトークンのカタチ
LoveChainのスマートコントラクトを見てみよう & 非中央集権なトークンのカタチLoveChainのスマートコントラクトを見てみよう & 非中央集権なトークンのカタチ
LoveChainのスマートコントラクトを見てみよう & 非中央集権なトークンのカタチ
 
今月のレッツゴー陰陽師!
今月のレッツゴー陰陽師!今月のレッツゴー陰陽師!
今月のレッツゴー陰陽師!
 
位置情報を常に取得するのはつらいよ
位置情報を常に取得するのはつらいよ位置情報を常に取得するのはつらいよ
位置情報を常に取得するのはつらいよ
 
カンバンと朝会とわたくし
カンバンと朝会とわたくしカンバンと朝会とわたくし
カンバンと朝会とわたくし
 
エンジニア生存戦略
エンジニア生存戦略エンジニア生存戦略
エンジニア生存戦略
 
ソーシャルアプリを分析してみた
ソーシャルアプリを分析してみたソーシャルアプリを分析してみた
ソーシャルアプリを分析してみた
 
Railsによるワイルドなソフトウェア開発
Railsによるワイルドなソフトウェア開発Railsによるワイルドなソフトウェア開発
Railsによるワイルドなソフトウェア開発
 

CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介

  • 1. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 1 Metal  と Vulkan を⽤用いた ⽔水彩画レンダリング技法の紹介 次世代のモバイルグラフィックスは Non-‐‑‒Photorealistic  Rendering  へと移⾏行行する 株式会社ドリコム 増野 健⼈人 川上 知成
  • 2. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 2 講演者紹介 川上 知成 -‐‑‒ 進⾏行行 株式会社ドリコム プログラムマネジメント室 サーバーサイドエンジニア、PMを担当し、現在は複数のプロジェクトに関与 CEDEC2014, 2015登壇 増野 健⼈人 -‐‑‒ メインスピーカー 株式会社ドリコム ゲームプロダクト部 コンシューマゲーム会社にてグラフィックスシステムやシェーダー開発に携わる ドリコム⼊入社後は3D・シェーダー技術のスキルボトムアップの活動を⾏行行う 本⽇日の発表について
  • 3. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 3 Vulkan and  the  Vulkan logo  are  trademarks  of  the  Khronos Group  Inc. OpenGL  is  a  registered  trademark  and  the  OpenGL  ES  logo  is  a  trademark  of  Silicon  Graphics  Inc.  used  by  permission  by  Khronos. SPIR  and  the  SPIR  logo  are  trademarks  of  the  Khronos Group  Inc. Apple,  Mac,  iMac,  MacBook,  iPhone,  Xcode,  macOS,  Metal  and  OS  X  are  trademarks  of  Apple  Inc.,  registered  in  the  U.S.  and  other  countries. iOS  is  a  trademark  or  registered  trademark  of  Cisco  in  the  U.S.  and  other  countries  and  is  used  under  license. Android™. DirectX®. FlowMap Painter  (c)2012  Teck  Lee  Tan  www.teckArtist.com Copyrights.
  • 4. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 4 ゲームエンジンと要素技術/基礎技術 はじめに 要素技術/基礎技術を⾒見見る理理由 • 対象事象の原理理原則を押さえる →⽐比較対象や⽐比較すべきポイントを選定出来、評価が可能 • 時代に乗る →市場、発表、研究、発⾒見見などの各段階で⾒見見極め必要な技術を取捨選択
  • 5. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 5 • 近年年のモバイルグラフィックス • グラフィックスAPI  のパラダイムシフト • Low-‐‑‒Overhead,  Low-‐‑‒Level  プログラミング • Non-‐‑‒Photorealistic  Rendering  における⽔水彩画表現 • まとめ、質疑応答 セッションの内容
  • 6. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 6 近年年のモバイルグラフィックス
  • 7. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 7 そもそもスマートフォンは多岐に渡る利利⽤用⽤用途がある。 • 電話、メール、メッセージアプリ • SNS  (コミュニケーション) • 動画視聴 • ゲーム ゲームはあくまでコンテンツの⼀一つ。 ユーザーはバッテリーリソースを消費しながらこれらコンテンツを利利⽤用している。 モバイルデバイスとゲーム
  • 8. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 8 現在、スマートフォン端末はフルHD(1920x1080px)  の画⾯面解像度度を持ったデバ イスが⼀一般的に普及している。総ピクセル数で⾔言えば約207万px あり、これを1秒 間に60回書き換えを⾏行行なっている。 この膨⼤大なピクセルの更更新を CPU を使⽤用して⾏行行うことも可能だが、リアルタイム 性を求めるゲームではレンダリング専⽤用のプロセッサ(GPU)を通して画⾯面更更新の⾼高 速化を図っている。 →  スマホゲーム通常は OpenGL  ES を通して GPU で描画が⾏行行われている。 ゲームの更更新とレンダリング
  • 9. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 9 OpenGL  ES OpenGL for  Embedded  System Khronos Group という標準化団体によって策定されている組み込み機器向けのグ ラフィックスAPI
  • 10. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 10 OpenGL  ES  は現在の iOS  /  Android  開発を⽀支える共通のグラフィックスAPI。 描画部分においては最も基本であり、最も重要なAPIの⼀一つ。 現在のスマホネイティブアプリは、iOS/Android  の両対応がほぼ⼀一般的になって いるが、プラットフォームが異異なるこの2つのデバイスにおいて、OpenGL  ES  で グラフィックスエンジンを記述すれば、両プラットフォームの対応を⾏行行うことがで きる。 モバイルゲームを⽀支えるAPI  
  • 11. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 11 グラフィックスAPI  の呼び出しにより CPU  で動作しているアプリケーションから GPU  に対してタスクの発⾏行行が⾏行行われる。(GPUドライバが制御する) A社 の GPU  と B社 の GPU  でアーキテクチャが異異なっても、この共通の API  に よりその違いを吸収している。 OpenGL  ES A_GPU_drawCall(Triangles,  0,  6) DrawCall(Triangles,  0,  6  ) A社 GPU  (SoC) B_GPU_drawCall(Triangles,  0,  6) B社 GPU  (SoC)ハードウェア ドライバ アプリケーション
  • 12. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 12 Khronos による仕様の策定 • 2015年年8⽉月には、最新バージョンとなる ES  3.2 がリリース • 現在のモバイルグラフィックスの多くは ES  2.0 をベースにしている 後述する、Metal,  Vulkan も、OpenGL  ES  と同じグラフィックスAPIの⼀一つ。 OpenGL  ES
  • 13. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 13 モバイルグラフィックスの推移 2003年 OpenGL ES 1.0 2004年 OpenGL ES 1.1 2007年 OpenGL ES 2.0 2012年 OpenGL ES 3.0 2014年 OpenGL ES 3.1 2015年 OpenGL ES 3.2 固定パイプライン時代 第一世代グラフィックス プログラマブルパイプライン時代 第二世代グラフィックス 低レベルグラフィックスAPI時代 第三世代(次世代)グラフィックス 2016年年 Metal,Vulkan
  • 14. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 14 グラフィックスAPIを選ぶ基準としては、OSサポートは勿論論、端末に搭載される GPU  (ドライバ)  の対応が必須となる。 後述する、Metal,  Vulkan も端末によってサポートが異異なるため留留意 グラフィックスAPI OpenGL ES Android iOS 2.0 2.2 iPhone3GS 3.0 4.3 iPhone5S 3.1+AEP 5.0 - 3.2 6.0 -
  • 15. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 15 最新のモバイルグラフィックスは何が出来るか? →  ES  3.2  は DirectX11.0 世代と同等の機能を有している • 機能⾯面だけで⾔言えば PC,  PS4,  XboxOne の世代に追いついている • しかし性能⾯面では⼤大きな開きがあるため同等のグラフィックス表現は難しい 最新の OpenGL  ES  3.2  では、コンピュートシェーダーは勿論論、テッセレーション とジオメトリシェーダーまでサポートされている。 モバイルグラフィクスの今
  • 16. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 16 2012年年8⽉月リリース。ES2.0  からは実に5年年ぶりのアップデート。 主な機能 ・レンダリングパイプラインの強化 -‐‑‒ Occlusion  Query -‐‑‒ Transform  Feedback -‐‑‒ Instanced  Rendering -‐‑‒ Multiple  Render  Targets ・ETC2  テクスチャ圧縮形式のサポート ・and  more... OpenGL  ES  3.0
  • 17. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 17 2014年年3⽉月にリリースされた。 主な機能として、コンピュートシェーダ がサポートされた。 -‐‑‒ Vertex,  Fragment  オブジェクトの独⽴立立 -‐‑‒ Indirect  draw  Commands -‐‑‒ and more... ほぼ同時期に策定された Android  Extension  Pack というGL拡張も、 ⼤大きな注⽬目を集めた OpenGL  ES  3.1
  • 18. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 18 AEP  とは 下記の GL 拡張のことを指します GL_̲ANDROID_̲extension_̲pack_̲es31a AEP  はメタ拡張と呼ばれ、開発者はこの GL  拡張が定義されている場合、後述す る20以上の拡張がサポートされていると⾒見見なす。 この拡張を GPU  がサポートすることにより、DirectX11  世代のゲームを Android   への移植を容易易にした。 Android  Extension  Pack  (AEP)
  • 19. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 19 KHR_̲debug KHR_̲texture_̲compression_̲astc_̲ldr KHR_̲blend_̲equation_̲advanced OES_̲sample_̲shading OES_̲sample_̲variables OES_̲shader_̲image_̲atomic OES_̲shader_̲multisample_̲interpolation OES_̲texture_̲stencil8   OES_̲texture_̲storage_̲multisample_̲2d_̲array   EXT_̲copy_̲image Android  Extension  Pack  (AEP) EXT_̲draw_̲buffers_̲indexed EXT_̲geometry_̲shader EXT_̲gpu_̲shader5   EXT_̲primitive_̲bounding_̲box EXT_̲shader_̲io_̲blocks EXT_̲tessellation_̲shader EXT_̲texture_̲border_̲clamp EXT_̲texture_̲buffer EXT_̲texture_̲cube_̲map_̲array EXT_̲texture_̲sRGB_̲decode
  • 20. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 20 OpenGL  ES  最新の策定。2015年年8⽉月に仕様がリリース。 -‐‑‒ Tessellation,  Geometry  Shader -‐‑‒ ASTC  テクスチャ圧縮 -‐‑‒ Floating point render targets -‐‑‒ and more... OpenGL  ES  3.2
  • 21. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 21 • モバイルグラフィックスAPI進化 -‐‑‒ 現在、主流流となっているのは ES2.0。最新は ES3.2 -‐‑‒ ES3.2 は DirectX11.0  世代と同等の機能を有している まとめ
  • 22. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 22 グラフィックスAPI  のパラダイムシフト
  • 23. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 23 従来のグラフィックスAPI  と GPU  の関係について。 まずは、アプリケーションから Draw  関数を呼び出すと何が起こるかを⾒見見る。 DrawCall とは? グラフィックスAPI  の描画処理理に関する関数呼び出しのこと。 ドライバは Draw  関数を⼀一つの基準として処理理する。 glDrawElements() D3D11DeviceContext::DrawIndexed() GPUの描画
  • 24. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 24 1:アプリケーションからグラフィックスAPI  の呼び出しを⾏行行うと、 ドライバがメインメモリ上のコマンドバッファに内容を蓄積する 2:DrawCall の呼び出しで コマンドバッファが⼀一杯になる、あるいは Flush,  Present   が呼び出されるとドライバは GPU  へのフラッシュを準備する 3:ドライバが描画コマンドを GPU  が解釈できる命令令に変換し、同時に描画ステートの バリデーションを⾏行行う 4:GPU  にコマンドが転送され処理理される GPUの描画 ※ ハードウェアにより実際の処理理は異異なるので留留意
  • 25. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 25 基本的にドライバは Draw  関数を⼀一つの基準として処理理し、 描画に関するステートをパッケージ化してコマンドバッファに積み、GPU  転送時 にバリデーションしていた。これらの処理理はドライバが暗黙のうちに⾏行行う。 GPUの描画 glClearColor(0.65f, 0.65f, 0.65f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindVertexArrayOES(_vertexArray); glUseProgram(_program); glDrawArrays(GL_TRIANGLES, 0, 36); glClearColor(0.65f, 0.65f, 0.65f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindVertexArrayOES(_vertexArray); glUseProgram(_program); glDrawArrays(GL_TRIANGLES, 0, 36); Draw  Command clearColor =  0.65f,  0.65f, … clearFlag =  color  |  depth  … vertexNum =  36  … Draw  Command clearColor =  0.65f,  0.65f, … clearFlag =  color  |  depth  … vertexNum =  36  …
  • 26. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 26 OpenGL  ES  では⼀一部ベンダーの拡張を除いて、標準機能としては シェーダーのオフラインコンパイルをサポートしていない。 シェーダーの字句句解析、構⽂文解析、最適化、命令令コードの⽣生成の全ては ドライバがランタイム上で実⾏行行している。 グラフィックスAPIのオーバーヘッド void main() { vec3 eyeNormal = normalize(normalMatrix * normal); vec3 lightPosition = vec3(0.0, 0.0, 1.0); vec4 diffuseColor = vec4(0.4, 0.4, 1.0, 1.0); float nDotVP = max(0.0, dot(eyeNormal, normalize(light))); colorVarying = diffuseColor * nDotVP; gl_Position = modelViewProjectionMatrix * position; } 実⾏行行時に GPU  のマシンコードへ
  • 27. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 27 余計なオーバーヘッドはCPU負荷を⽣生み、CPU負荷は発熱とバッテリー消費を招く これが、スマートフォン上では⼤大きな問題となりえていた。 静的に解決できるものは静的に解決し、 効率率率化できるものは効率率率化し、 ランタイムでの CPU  負荷を削減することはできないか? 低レベルグラフィックスAPIが⽣生まれた グラフィックスAPIのオーバーヘッド
  • 28. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 28 2013年年以降降 グラフィックスAPI  に⼤大きな変⾰革が起きている。 AMD  Mantle,  Apple  Metal,  DirectX12,  Khronos Vulkan など、 新しい API  が登場した。 コンシューマゲーム機では⼀一般的であった、低レベルAPI  の思想が⼀一般化 より効率率率的に、より明⽰示的に CPU・GPU  を活⽤用する →  CPU  のボトルネックを削減する 低レベルグラフィックスAPI
  • 29. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 29 低レベルグラフィックスAPI 2013年年 2016年年2014年年 2015年年 AMD  Mantle Apple  Metal DirectX12 Khronos Vulkan
  • 30. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 30 Metal,  Vulkan は最新のモバイルレンダリングアーキテクチャを最⼤大限に 活⽤用する機能も含まれている。例例えば⼀一般的な下記3つの GPU  に対応する。 • Immediate  Mode  Rendering  (IMR) • Tile  Based  Rendering  (TBR)  -‐‑‒ Mali,  Adreno • Tile  Based  Deffered  Rendering  (TBDR)  – PowerVR 詳細は後述。 低レベルグラフィックスAPI
  • 31. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 31 Apple  が策定 2014年年9⽉月にリリース(iOS8〜~、OSX  El  Capitan〜~) iOS  の対応が先⾏行行して⾏行行われ、翌年年に mac  OSX  のサポートも⾏行行われた。 2016年年6⽉月の WWDC2016  でも、Metal  のアップデートが発表された。 ⼤大きな更更新としては、iOS  で初めて テッセレーション(※)  がサポートされる。 Apple  Metal ※  mac  OSX  sierra  /  iOS10  の iPhone6s,  iPhone6s  Plus,  iPhone  SE  以降降のデバイスが必須 A9プロセッサー(PowerVR 7XT) でないと、ハードウェアがテッセレータを搭載していないため
  • 32. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 32 2016年年2⽉月に Vulkan 1.0  がリリース モバイルからデスクトップまで幅広いプラットフォームをサポートしている 当初、glNext と呼ばれていた。 LunarG 社より Windows/Linux  の Vulkan SDK  が提供されている Google  からも Vulkan ビルドに対応した、NDK  がリリースされています。 Khronos Vulkan
  • 33. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 33 描画時はフレームバッファ(Color,  Depth,  Stencil)へのアクセスに注意。 フレームバッファのサイズが⼤大きい場合 Depth  /  Stencil  Buffer  など、 システムメモリアクセスに伴う、フレームバッファの転送の負荷が⼤大きい。 この負荷を下げるために、最新のモバイル GPU  の特徴として Tile  Based  Rendering  アーキテクチャを採⽤用している。 Modern  mobile  architecture
  • 34. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 34 Tile  Based  Rendering Geometry Processing Tiling Rasterize Visibility Test Fragment Processing Alpha  Test Alpha  Blend On-­Chip Depth  Buffer On-­Chip Color  Buffer Primitive  List Vertex  Data Texture  Data Frame  Buffer Geometry Data On-‐‑‒Chip Memory System  Memory レンダリング時は可能な限りシステムメモリへのアクセスを避ける。 ⾼高速な On-‐‑‒Chip  上のメモリに置かれたタイルバッファへの読み書きを⾏行行う。
  • 35. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 35 Metal,  Vulkan はこの TBR  アーキテクチャに最適化されている。 描画時に⾼高速な On-‐‑‒Chip  上のバッファだけでレンダリングを完結させることが出 来る。 そのため負荷の⾼高いシステムメモリへのアクセスを避けることが可能で、 これにより消費電⼒力力が削減できる。 Tile  Based  Rendering On-­Chip Depth  Buffer On-­Chip Color  Buffer On-‐‑‒Chip  Memory Frame  BufferSystem  Memory
  • 36. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 36 レンダリング時におけるフレームバッファのアクセスは Metal:MTLRenderPassDescriptor Vulkan:VkAttachmentDescription 構造体に指定する。 それぞれ loadAction(op),  storeAction(op)  というメンバ変数を持っており、 レンダリングパス開始時、終了了時のフレームバッファの取り扱いを設定する。 Tile  Based  Rendering
  • 37. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 37 loadAction(op) -‐‑‒ Clear  …  フレームバッファの内容を指定の⾊色でクリア -‐‑‒ Load …  フレームバッファの内容を読み込む (On-‐‑‒chip  へのコピー発⽣生) -‐‑‒ DontCare …  全てのピクセルが更更新される際に指定 storeAction(op) -‐‑‒ Store  …  フレームバッファへ書き出す -‐‑‒ DontCare …  Depth/Stensil などフレームバッファへ書き出す必要がない場合 (プラットフォームごとに最適なパフォーマンス結果となる) Tile  Based  Rendering
  • 38. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 38 低レベルグラフィックスの思想として、静的に決定できる物は静的に解決する →  ラインタイム時にかかる CPU  パワーを排除 • パイプラインステート • シェーダーコンパイル • 描画のバリデーション 静的に解決する
  • 39. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 39 Pipeline  State Object  とは描画に関する情報のこと。 OpenGL  ES  世代では個々に指定されていたが、⼀一まとまりで定義されるようにな った。ステートは⽣生成時に検証されるため、実⾏行行時のオーバーヘッドがない。 GPU  はこの Pipeline  State  オブジェクトを差し替えるだけで、次のレンダリング に移ることができる。 Metal:MTLRenderPipelineState Vulkan:VkPipeline オブジェクトに保持される。 パイプラインステート
  • 40. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 40 Metal,  Vulkan ともにシェーダーのオフラインコンパイルをサポート -‐‑‒ シェーダーはオフラインでコンパイルする -‐‑‒ ランタイム時の⽣生成コストを排除 シェーダーコンパイル
  • 41. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 41 OpenGL  API  呼び出しのエラーチェックはドライバで実装されており、 • 最後に発⽣生したエラーを glGetError()   • Debug,  Release  問わず エラーチェック Metal,  Vulkan 世代では、明⽰示的に Validation  Layer  を有効にすることで、 API  呼び出しのエラーチェックを実施する。 通常は開発時に有効にして、製品版では無効にし CPU  のオーバーヘッドを削減す る。 バリデーション
  • 42. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 42 • 従来の グラフィックスAPI  ではコマンドバッファ構築はドライバの仕事だった • Metal,  Vulkan  世代ではアプリケーションマターへと変わった • CommandBuffer に対してコマンドを追加 • CommandBuffer を CommandQueue にサブミットする コマンドバッファ構築 Buffer Texture RenderPass Draw CommandBuffer CommandQueue
  • 43. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 43 CommandBuffer はマルチスレッドで構築できる 空いた時間で更更に多くの Draw  を発⾏行行するか、またはCPUを休めれる コマンドバッファ構築 Thread0 Thread1 Thread2 Thread3 0ms 5ms 10ms 15ms CommandBuffer Thread0 Thread1 Thread2 Thread3 0ms 5ms 10ms 15ms CB CB CB CB Single-‐‑‒Thread Multiple-‐‑‒Thread
  • 44. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 44 Metal  と Vulkan において Queue  と Buffer  では使い⽅方が異異なるので注意 Metal  は基本的に⼀一つの Queue  上に Command  Buffer  を追加していく Vulkan は graphics  と compute  で Queue  が分かれて個別にサブミットする (VKSemaphore で Queue  の同期を取る) コマンドバッファ構築
  • 45. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 45 ブロック圧縮アルゴリズムの⼀一種。 iOS  であれば PVRTC、 Android  であれば ETC が⼀一般的に使われてきた。 Metal,  Vulkan 世代では ASTC という統⼀一的な圧縮フォーマットが使⽤用できる。 →  今までのように、プラットフォームごとに圧縮を分ける必要はない Adaptive  Scalable  Texture  Compression  (ASTC)
  • 46. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 46 Low-‐‑‒Overhead,  Low-‐‑‒Level  プログラミング
  • 47. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 47 iOS,  macOS の Apple  プラットフォームのみサポート 開発環境も macOS 上の Xcode が必須となる。 開発環境:OSX  El  Capitan  /  Xcode7 以降降 実⾏行行環境:iOS 8  /  iPhoen5s  (Apple  A7)  /  以降降 2012年年以降降に発売された MacBook,  iMac  など Metal  の環境
  • 48. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 48 最新の macOS と Xcode と iOS デバイスがあれば開発出来る。 Xcode の新規プロジェクト作成より Game  -‐‑‒>  Metal  を選べば、 テンプレートプロジェクトが作成される。 Metal  の開発環境
  • 49. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 49 Metal の開発環境 https://developer.apple.com/metal/
  • 50. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 50 Validation  Layer
  • 51. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 51 • MTLDevice • MTLCommandQueue • MTLLibrary • MTLFunction(Shader)   • MTLBuffer • MTLRenderPipelineState • MTLDepthStencilState • MTLRenderPassDescriptor • MTLRenderPassColorAttachmentDescriptor • MTLRenderPassDepthAttachmentDescriptor • MTLCommandBuffer • MTLRenderCommandEncoder Metal Programming
  • 52. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 52 以降降のスライドで実際の Metal  のコードを記述していますが、 説明のため重要コードのみピックアップして記載している点に注意して下さい! 完全なソースは Apple Developer  のサンプルを参考にして下さい。 Metal Programming
  • 53. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 53 ベースとなる初期化部分。 デバイスの取得、コマンドキュー、ライブラリは下記のコードで取得。 ライブラリはシェーダーのアーカイブ。 Metal Programming id<MTLDevice> device = MTLCreateSystemDefaultDevice(); id<MTLCommandQueue> commandQueue = [device newCommandQueue]; id<MTLLibrary> defaultLibrary = [device newDefaultLibrary];
  • 54. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 54 シェーダー作成。 Metal Programming [defaultLibrary newFunctionWithName:@"lighting_fragment"]; [defaultLibrary newFunctionWithName:@"lighting_vertex"];
  • 55. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 55 Metal  Programming MTLRenderPipelineDescriptor *pipelineDescriptor = [MTLRenderPipelineDescriptor new]; pipelineDescriptor.vertexDescriptor = vertexDescriptor; // 頂点レイアウト pipelineDescriptor.vertexFunction = vertexFunction; // Vertexシェーダー pipelineDescriptor.fragmentFunction = fragmentFunction; // Fragmentシェーダー pipelineDescriptor.colorAttachments[0].pixelFormat = MTLPixelFormatBGRA8Unorm; pipelineDescriptor.depthAttachmentPixelFormat = MTLPixelFormatDepth32Float; パイプラインステートを設定
  • 56. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 56 Metal  Programming id<MTLRenderPassDescriptor> _renderPassDescriptor = [MTLRenderPassDescriptor renderPassDescriptor]; MTLRenderPassColorAttachmentDescriptor *colorAttachment = _renderPassDescriptor.colorAttachments[0]; colorAttachment.loadAction = MTLLoadActionClear; colorAttachment.storeAction = MTLStoreActionStore; colorAttachment.clearColor = MTLClearColorMake(0.65f, 0.65f, 0.65f, 1.0f); MTLRenderPassDepthAttachmentDescriptor *depthAttachment = _renderPassDescriptor.depthAttachment; depthAttachment.loadAction = MTLLoadActionClear; depthAttachment.storeAction = MTLStoreActionDontCare; depthAttachment.clearDepth = 1.0; パイプラインパスを設定
  • 57. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 57 コマンドバッファの構築 Metal  は CommandEncoder という仕組みで、コマンドバッファに追加 Metal  Programming id <MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer]; id <MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:desc]; [renderEncoder setDepthStencilState:_depthState]; [renderEncoder setRenderPipelineState:_pipelineState]; [renderEncoder setVertexBuffer:_vertexBuffer offset:0 atIndex:0 ]; [renderEncoder drawPrimitives:MTLPrimitiveTypeTriangle vertexStart:0 vertexCount:36]; [renderEncoder endEncoding]; [commandBuffer presentDrawable:view.currentDrawable]; [commandBuffer commit];
  • 58. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 58 Metal Programming
  • 59. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 59 Vulkan はクロスプラットフォームに対応する。 2016年年8⽉月現在、Windows,  Linux,  Android,  Tizen と⾔言った、 各種プラットフォームをサポートしている。 Windows  /  Linux  の SDK  が LunarG 社より提供されている。 Vulkan の環境
  • 60. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 60 Android 7.0  (Nougat)  以降降でサポート • 2016年年3⽉月より開発者向け Preview  と NDK がリリース • 2016年年8⽉月23⽇日に正式版リリース • 現時点の対応端末は Nexus  6,  Nexus  5X,  Nexsus 6P,  Nexsus 9. • Android  Studio  にインポートできるサンプルが提供されている Vulkan-‐‑‒basic-‐‑‒samples https://github.com/googlesamples/vulkan-‐‑‒basic-‐‑‒samples Vulkan の実⾏行行環境
  • 61. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 61 Vulkan は SPIR-‐‑‒V  と呼ばれる、 中間バイナリーデータをサポートしている。 →  Graphics  Shader,  Compute  Kernel  などは SPIR-‐‑‒V  でロードする GLSL/HLSL  でシェーダーを記述し、ビルド時に SPIR-‐‑‒V  を⽣生成する SPIR-‐‑‒V
  • 62. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 62 Vulkan は vkInstance を⽣生成することから始める。 プラットフォームごとの描画サーフェスや、実⾏行行に必要なレイヤーなどシステムへ のアクセスは vkInstance を通して⾏行行われる Vulkan Programming VkInstance inst;; vkCreateInstance(&inst_info,  NULL,  &inst);;
  • 63. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 63 vkInstance からシステムの物理理デバイスを取得する。 物理理デバイスからアプリで使う GPU  インターフェース VKDevice が作成できる。 Vulkan Programming VkPhysicalDevice physical_devices;; VkDevice device;; vkEnumeratePhysicalDevices(inst,  &gpu_count,  &physical_devices);; vkCreateDevice(physical_devices,  &deviceInfo,  NULL,  &device);;
  • 64. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 64 vkCreateRenderPass vkCreateShaderModule vkCreateGraphicsPipelines vkAllocateDescriptorSets vkUpdateDescriptorSets vkCreateCommandPool vkAllocateCommandBuffers vkCreateImage vkCreateImageView Vulkan Programming vkCreateBuffer vkBindBufferMemory vkCreateDescriptorSetLayout vkCreatePipelineLayout vkCreateDescriptorPool vkCreateFramebuffer vkAllocateMemory vkBindImageMemory VKDevice を通して下記オブジェクト、リソースを⽣生成する。 ⻑⾧長くなるので Draw の解説のみに割愛。
  • 65. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 65 Vulkan のコマンドバッファは VkCommandBuffer これは vkAllocateCommandBuffers を通してコマンドプールより確保される。 vkBeginCommandBuffer,    vkEndCommandBuffer でコマンドを構築し、 構築したコマンドを vkQueueSubmit でキューに追加する。 コマンドキューは Graphics,  Compute,  Transfer  ⽤用途ごとに分ける必要がある Vulkan Programming
  • 66. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 66 vkBeginCommandBuffer vkCmdPipelineBarrier vkCmdBeginRenderPass vkCmdBindPipeline vkCmdBindDescriptorSets vkCmdSetViewport vkCmdBindVertexBuffers vkCmdDraw vkCmdEndRenderPass vkEndCommandBuffer Vulkan Programming ⼀一度度作成したVulkan のコマンドバッファは 次フレームでも再利利⽤用が可能
  • 67. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 67 Metal, Vulkna はアプローチが似ており、共通項⽬目が多い • ⽚片⽅方を理理解すれば、もう⽚片⽅方を覚えるのもそこまで⼤大変ではない • ⾔言語を覚えるというよりも、低レベルAPIの思想を知った⽅方が理理解が早い Metal, Vulkan まとめ
  • 68. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 68 Non-‐‑‒Photorealistic  Rendering  における⽔水彩画表現
  • 69. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 69 Non-‐‑‒Photorealistic  Rendering  (NPR)  は、コンシューマゲームに代表される フォトリアルな絵作りとは対を成すレンダリング技法。 トゥーンシェーダなどのアニメ調の表現も NPR  の技法に区分される Non-‐‑‒Photorealistic  Rendering
  • 70. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 70 フォトリアルな絵作りに必要な要素を考えてみる • HDRレンダリング • ⾼高解像度度テクスチャ/ハイレゾメッシュ • Physically  Based  Rendering • Global  Illumination • ⾼高品質なアンチエイリアス • カラーグレーディング • Depth  of  Fields • 多数の動的ライト なぜNPRなのか? これらの処理理をモバイルで実現?
  • 71. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 71 モバイルが抱える問題にはバッテリー消費/発熱の問題がある。 演算⼀一回、メモリアクセス⼀一回にも僅かながらバッテリーを消費しており、時間と ともに某⼤大なバッテリー消費へと発展する。 CPU/GPUに余裕があっても、追加のグラフィックス⽤用途を組み込む、 ということがやり⾟辛い環境にある。 モバイルのジレンマ 現実的なバッテリー消費と絵作りの品質について、そのトレードオフを考える
  • 72. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 72 現実的なタスク量量で実現可能な絵作りとは。 コンシューマはハードウェアと技術の進歩により現実的なタスク量量での フォトリアルレンダリングを実現する⼿手段を得た。 モバイルもフォトリアルな絵作りのために、ハードウェアの進化を待つか? →  GPU  の性能向上は、画⾯面の⾼高解像度度化に相殺される可能性もある それよりプラットフォームが異異なり、提供できるゲームの形が異異なるのだから 絵作りの⽅方向性もまた、コンシューマのリアルとは別路路線に振り切切ってみる NPRへのモチベーション
  • 73. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 73 ⽔水彩画を表現 ※ 本物の⽔水彩画です
  • 74. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 74 • 多彩なアプローチ → PBR 実装のような、物理理現象への依存が少ないため実装が容易易 →  視覚的効果が⾼高い実装の追求が可能 • オブジェクト描画時に、統⼀一的なマテリアルになることが期待できる →  バッチ描画できる可能性が増える →  質感はポストプロセスで掛ける。基本は1マテリアルで描画できる NPRの利利点
  • 75. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 75 • 質感をポストポロセスへ → 描画マテリアルの簡素化 → 描画オブジェクト数に依存せずに、NPR に関する負荷を固定で⾒見見積もる • 繊細な表現ではなく、視認性の⾼高さを評価し採⽤用 → 例例えば、⽇日本アニメとの親和性の⾼高さなど アニメ表現はほぼ⼀一般的に⾏行行われているため、 今回は同じ題材を選ぶよりは思考を変えて⽔水彩画に挑戦する。 NPRの利利点
  • 76. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 76 • ⽔水彩画に使われる⽔水彩紙の表現 紙肌の粗⽬目による凹凸感、 • 絵の具のにじみ、ぼかし、かすれ表現 輪輪郭部分は他の⾊色と混ざり合い、グラデーションがかかる • デジタル特有のポスト加⼯工処理理の追加 ⽔水彩表現をベースとした上で、更更にゲームの世界観の向上へ ⽔水彩画の特徴
  • 77. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 77 ⽔水彩紙とは、透明⽔水彩や不不透明⽔水彩などの⽔水彩絵具 を⽤用いた描画に適した専⽤用紙の総称。 紙質によっては⾼高い吸⽔水性を保持しており、⽔水分量量 を調整することで、にじみやぼかし効果に⼤大きな影 響を与えることができる。 ⽔水彩紙の表現 http://zokeifile.musabi.ac.jp/%E6%B0%B4%E5%BD%A9%E7%B4%99/
  • 78. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 78 ⽔水彩は絵の具に含まれる⽔水分と、⽔水彩紙特有の吸収 性により、にじみやぼかしが効果が起こる。 塗り⽅方によりエッジ部分は他の⾊色と薄く混ざり合う 絵の具のにじみぼかし
  • 79. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 79 ⽔水彩表現のアプローチ Final  result
  • 80. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 80 Final  result
  • 81. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 81 ⽔水彩表現のアプローチ Texture  only
  • 82. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 82 ⽔水彩画表現のアプローチ Final  resultTexture  only
  • 83. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 83 • Multiple  Render  Target  で G-‐‑‒Buffer  にシェーディング情報の書き出し • G-‐‑‒Buffer  は2枚使⽤用 • DiffuseMap と ハッチングを含むアウトライン線 • 絵の具のにじみ⽅方向を書き込んだ VectorMap • Compute  Kernel  で⽔水彩表現を処理理 • コンポジット ⽔水彩画表現のアプローチ
  • 84. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 84 G-‐‑‒Buffer  への書き出し G-‐‑‒Buffer1 DiffuseMap Hatching  +  Outline
  • 85. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 85 G-‐‑‒Buffer  への書き出し G-‐‑‒Buffer2 VectorMap
  • 86. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 86 モデルに適⽤用する VectorMap は FlowMapPainter を使⽤用して作成 G-‐‑‒Buffer  への書き出し http://teckartist.com/?page_id=107
  • 87. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 87 FlowMap の XY  には流流れの⽅方向が記述されている。 この 流流れ を、⽔水彩のストロークとして使⽤用 このベクトルの移動量量をにじみの⽅方向に G-‐‑‒Buffer  への書き出し
  • 88. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 88 G-‐‑‒Buffer への書き出し float3 diffuseColor = diffuseTexture.sample(samplr, vert.texCoord).rgb; float3 normal = normalize(vert.normal); float3 eyeDirection = normalize(vert.eyePosition); // NdotE half NdotE = dot( normal, eyeDirection ); // hatching half hatching = hatchingTexture.sample(samplr, vert.texCoord).x; hatching = mix(hatching, half(1.0f), half(0.15f )); // Outline half4 edgeColor = half4( half3( 0.6f ), 1.0f ); half edgePower = 5.0f; half4 outline = saturate( half4( NdotE * edgePower * hatching ) + edgeColor ); // Flowmap float4 flowmap = flowmapTexture.sample(samplr, vert.texCoord); flowmap.xy = (flowmap.xy * float2(0.5f) ) + float2(0.5f); MX::FragOutput output; output.albedo = float4( diffuseColor, outline.x ); output.normal = float4( flowmap.xyz, 1.0f ); return output; Fragment  shader
  • 89. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 89 G-‐‑‒Buffer  で書き出した2枚のテクスチャを Compute  Kernel  へ⼊入⼒力力する。 書き出した VectorMap の情報をもとに DiffuseMap のテクスチャ位置をずらして サンプリングする。 Compute  Kernel half4 inColor = inTexture.read(gid); half4 inColor2 = inTexture2.read(gid); half flowPower = 80.0f; uint2 coord = uint2( gid.x + (int)( inColor2.x * flowPower ), gid.y + (int)( inColor2.y * flowPower )); half4 flow = inTexture.read( coord );
  • 90. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 90 Compute  Kernel VectorMap 適⽤用した結果
  • 91. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 91 思ってた結果にならない… もっとぐにゃっと曲がってほしい。 殆どのモデルの VectorMap  サンプリング位置が均⼀一になっている → VectorMap の⽅方向ベクトルとモデルの UV  位置が問題 Compute  Kernel ただ、モデルごとに個別に VectorMap を⽤用意するのも、 UV  を修正するのもやりたくない。
  • 92. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 92 回避策 • VectorMap にノイズで重み付けを⾏行行う • サンプリングした VectorMap に揺らぎをつける Compute  Kernel
  • 93. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 93 ランタイム上の Compute  Kernel  で Perlin Noise  を⽣生成する → 起動時に⽣生成して G-‐‑‒Buffer  と⼀一緒に Kernel  へ⼊入⼒力力する Compute  Kernel half rand( half2 n ) { return fract( sin( dot( n, half2(12.9898f, 4.1414f ) ) ) * 43758.5453f ); } half perlinNoise( half2 p ){ half2 ip = floor(p); half2 u = fract(p); u = u * u * (3.0f - 2.0f * u ); half res = mix( mix( rand( ip ), rand( ip + half2( 1.0f, 0.0f ) ), u.x ), mix( rand( ip + half2( 0.0f, 1.0f ) ), rand( ip + half2( 1.0f, 1.0f ) ), u.x ), u.y); return res * res; } https://gist.github.com/patriciogonzalezvivo/670c22f3966e662d2f83
  • 94. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 94 Compute  Kernel VectorMap only VectorMap +  Perlin Noise
  • 95. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 95 元の DiffuseColor と、ずらした DiffuseColor を合成する 合成時は Perlin Noise  の重み付けをもとに、⾊色を mix  する Compute  Kernel // パーリンノイズの強度をブレンドの強度にする half flowBlend = noise; half4 originMix = mix( inColor, flow, flowBlend );
  • 96. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 96 Compute  Kernel
  • 97. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 97 Compute  Kernel Diffuse  only ブレンド結果
  • 98. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 98 Compute  Kernel half4 inColor = inTexture.read(gid); half4 inColor2 = inTexture2.read(gid); half flowPower = 80.0f; uint2 coord = uint2( gid.x + (int)( inColor2.x * flowPower * noise ), gid.y + (int)( inColor2.y * flowPower * noise )); half4 flow = inTexture.read( coord ); // 輝度が高すぎるので、輝度を落とす flow = mix( flow, half4( 1.0f ), (half)0.3f ); inColor = mix( inColor, half4( 1.0f ), (half)0.1f ); // パーリンノイズの強度をブレンドの強度にする half flowBlend = noise; half4 originMix = mix( inColor, flow, flowBlend ); // ハッチングとアウトラインを書き出す originMix.w = inColor.w; outTexture.write( half4( originMix ), gid );
  • 99. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 99 Hatching  +  Outline  の線は、次のぼかしパスがあるため、 ComputeKernel からはテクスチャの w  要素に⼊入れて書き出しておく。 後のコンポジットパスで合成する。 Compute  Kernel
  • 100. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 100 結果をさらに Compute  Kernel  で加⼯工する • 1/2  にダウンサンプリング • ガウスぼかし Compute  Kernel このぼかした結果を最終的なコンポジットパスで合成する
  • 101. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 101 コンポジットの段階では3枚のテクスチャを利利⽤用する • にじみテクスチャ • ぼかしテクスチャ • ⽔水彩紙テクスチャ コンポジット
  • 102. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 102 ⽔水彩紙テクスチャ 事前に Photoshop  のフィルターで作成。 ⽔水彩紙の凹凸を表現したテクスチャ コンポジットで合成する
  • 103. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 103 にじみテクスチャとぼかしテクスチャをブレンドする コンポジット half blendRate = 0.51f; return mix( color0, color1, blendRate );
  • 104. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 104 コンポジット ソフトフォーカスのような効果が得られる
  • 105. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 105 コンポジット この時ブレンドする BlendRate が⾼高すぎるとぼやけた絵になるので注意
  • 106. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 106 ブレンド前 コンポジット ブレンド後
  • 107. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 107 この結果に対して、スクリーン全体に⽔水彩紙テクスチャを追加する。 コンポジット float2 screenUV = (inFrag.position.xy / uniforms.screenSize); half4 paperTex = paperTex2D.sample(quadSampler, screenUV); half4 color0 = tex2D.sample(quadSampler, inFrag.texCoord); Half4 color1 = blurTex2D.sample(quadSampler, inFrag.texCoord); half blendRate = 0.51f; return mix( color0, color1, blendRate ) * paperTex;
  • 108. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 108 コンポジット
  • 109. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 109 更更にハッチングとアウトライン線を追加 コンポジット float2 screenUV = (inFrag.position.xy / uniforms.screenSize); half4 paperTex = paperTex2D.sample(quadSampler, screenUV); half4 color0 = tex2D.sample(quadSampler, inFrag.texCoord); Half4 color1 = blurTex2D.sample(quadSampler, inFrag.texCoord); half blendRate = 0.51f; return mix( color0, color1, blendRate ) * color0.w * paperTex;
  • 110. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 110 コンポジット Final  result
  • 111. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 111 Final  result
  • 112. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 112 • モバイルでも NPR  は現実的な負荷で処理理できる • アイディア次第で全く新しいグラフィックス表現が実現できる可能性 • ベースとなる GPU  の機能強化と性能向上 • Metal,  Vulkan に対応する GPU  そのもののベース性能が向上している • 各 GPU  機能の均⼀一化が進み、拡張に依存しない統⼀一的な実装環境 • Shader が書きやすい • GLSLでは #include,  #define  が使えないため、複雑なシェーダーが書き⾟辛い • MSL,  SPIR-‐‑‒V(変換前のシェーダー)  ではコンパイル時にプリプロセッサが働く まとめ
  • 113. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 113 • モバイルでは、処理理負荷の1msecを削減することに意味がある • 低レベルグラフィックスAPIはモバイルにこそ価値がある • バッテリー消費と発熱の問題を考える上で、僅かなオーバーヘッドの削減は、アプリ 全体の継続率率率にも影響を与える • 今後の低レベルグラフィックスAPI • 登場時期の速さから、今は Metal  が先⾏行行して普及している • Vulkan も対応プラットフォーム数の多さから、いずれ Metal  に追いつく • 2018年年頃には モバイルでの低レベルグラフィックスAPI  が⼀一般化している まとめ
  • 114. Copyright  Drecom Co.,  Ltd.  All  Rights  Reserved. 114 ご清聴ありがとうございました。