Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Unity 6 シェーダーWarmupガイド
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
CyberAgent
PRO
January 27, 2025
1.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Unity 6 シェーダーWarmupガイド
CyberAgent
PRO
January 27, 2025
More Decks by CyberAgent
See All by CyberAgent
Databricks 導入から Genie 活用まで、全部やった話
cyberagentdevelopers
PRO
0
420
専任DEゼロからの データ基盤構築 - Databricks x IaC x AIで 進める「データの民主化」-
cyberagentdevelopers
PRO
0
250
「エンジニア進化論」2028年の開発完全自動化、エンジニアはどう進化するか
cyberagentdevelopers
PRO
9
8.4k
NAB Show 2026 動画技術関連レポート / NAB Show 2026 Report
cyberagentdevelopers
PRO
0
280
Local LLM Meetup #1 Opening
cyberagentdevelopers
PRO
0
410
LocalLLMで機密データを匿名化したい
cyberagentdevelopers
PRO
1
410
Vibe Fine-Tuning Version 2 — RunPod SSH で安く学習してみた
cyberagentdevelopers
PRO
0
400
2026年度新卒技術研修 サイバーエージェントのデータベース 活用事例とパフォーマンス調査入門
cyberagentdevelopers
PRO
10
11k
マッチングアプリにおけるユーザー構成の変化は、事業KPIにどう影響しているのか
cyberagentdevelopers
PRO
1
210
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
515
110k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
2
280
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
The browser strikes back
jonoalderson
0
1.3k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
450
Chasing Engaging Ingredients in Design
codingconduct
0
230
BBQ
matthewcrist
89
10k
Building Applications with DynamoDB
mza
96
7.1k
Mobile First: as difficult as doing things right
swwweet
225
10k
Transcript
2 0 2 4 Unity 6 シェーダー Warmupガイド
講演者 Unity Technologies Japan パートナーエンジニア ブーシェ ロビン晃
シェーダー Warmup やってますか?
オブジェクトの初回描画でシェーダーコンパイルスパイクが発生 Shader Compile よくある光景
シェーダー Warmup をしよう ShaderVariantCollection.WarmUpを使えばいいはず? // Warmupしたいシェーダーバリアントを含んだ ShaderVariantCollection public ShaderVariantCollection shaderVariantCollection;
// Warmup! shaderVariantCollection.WarmUp(); // 終わり! カンタン! 参考マニュアル • https://docs.unity3d.com/ScriptReference/ShaderVariantCollection.WarmUp.html
しかし、マニュアルをよく見ると・・・
Warning: 警告: この方法は DX11とOpenGLで完全にサポート されています。 DX12、Vulkan、および Metal では、頂 点レイアウトおよび/またはレンダー ターゲットの設定が、プリウォームに使用したデータと異なる場合、グ
ラフィックスドライ バはまだ作業を実行する必要があるかもしれません。 これは無駄な作業と GPU メモリの浪費につながり、アプリケーショ ンに目に見えるストールを残します。 ShaderWarmupはすべてのグラフィックスAPIでサポートされています。 ???
ShaderVariantCollection.WarmUp の罠 実は、Vulkan・Metal・DX12だとShaderVariantCollection.WarmUpは機能しない。 Android・iOSでシェーダーWarmupを行っているつもりなのにシェーダーコンパイルの スパイクがなくならない・・・という悩みがよくある。
Vulkan ・Metal ではどうする? Shader Loadingマニュアル Unity 2022.3以前) • https://docs.unity3d.com/2022.3/Documentation/Manual/shader-loading.html 「正確な頂点データレイアウト」がポイント
Vulkan・Metalでの シェーダー Warmup
「正確な頂点データレイアウト」 Vulkan・Metal・DX12でシェーダーWarmupを行う場合、実際に対象のオブジェクトが 描画される時の頂点データレイアウトを把握し、 Warmup実行時に指定する必要がある。 頂点データとは頂点シェーダーに渡されるデータのこと • POSITION • NORMAL •
UV0/1/2… • COLOR • etc… 間違った頂点データで Warmupした場合、描画時に正しいデータで改めて シェーダーコンパイルが実行されるため、結局スパイクが発生することになる。
ShaderWarmup API Experimental.Rendering.ShaderWarmup • Unity 2021.3より追加された新しいシェーダー Warmup API • Warmup時に頂点データを指定できる
◦ ShaderWarmupSetupより 参考マニュアル • https://docs.unity3d.com/ScriptReference/Experimental.Rendering.ShaderWarmup. html
頂点データの指定 頂点データはVertexAttributeDescriptorで定義する • https://docs.unity3d.com/ScriptReference/Rendering.VertexAttributeDescriptor.html Attribute • データタイプ POSITION・TEXCOORD・COLORなど) Format •
データの型 Float32・Float16・UNorm8など) Dimension • データの次元 2 XY、3 XYZ、4 XYZWなど) 例: POSITIONは Float32 3 XYZ で指定されることが多い
// 頂点データレイアウト指定 ShaderWarmupSetup setup = new ShaderWarmupSetup(); setup.vdecl = new
VertexAttributeDescriptor[] { new VertexAttributeDescriptor(VertexAttribute.Position, VertexAttributeFormat.Float32, 3), new VertexAttributeDescriptor(VertexAttribute.Normal, VertexAttributeFormat.Float32, 3), new VertexAttributeDescriptor(VertexAttribute.Color, VertexAttributeFormat.UNorm8, 4), new VertexAttributeDescriptor(VertexAttribute.TexCoord0, VertexAttributeFormat.Float32, 2), }; // Warmup実行 ShaderWarmup.WarmupShader(shader, setup); コード
肝心の頂点データは どこから取得できる?
頂点データの取得 正確な頂点データを Warmupに提供したい場合、 Warmup対象のシェーダーで描画されるすべてのオブジェクト Mesh等) の 頂点データレイアウトを把握している必要がある。 (プロジェクト規模によりますが、大体 20パターン以内のケースが多いです )
Meshの場合 Inspectorから確認 POSITION • Float32 3 XYZ NORMAL •
Float32 3 XYZ TANGENT • Float32 4 XYZW UV0 TEXCOORD0 • Float32 3 XY
ParticleSystem の場合 Renderer → Custom Vertex Streams から確認 POSITION •
Float32 3 XYZ NORMAL • Float32 3 XYZ COLOR • UNORM8 4 RGBA UV TEXCOORD0 • Float32 3 XY
struct Attributes { float3 positionOS : POSITION; float3 normalOS :
NORMAL; float2 uv : TEXCOORD0; // シェーダーでは Tangentが使われていない }; シェーダーも確認 頂点シェーダーのコードで実際に使用している頂点データのチェックも忘れずに! MeshのデータではTANGENTがあるが、シェーダーでは使っていないため、 TANGENTが入っていないシェーダーの頂点データレイアウトが正しい
確実に正確なデータを取得するには GPUデバッガーを活用する • RenderDocなどのツールからフレームのキャプチャーを取り、頂点データを確認する • Warmup対象オブジェクトすべての描画を地道に確認する R8G8B8A8_UNORM UNORM8
4 COLOR
めんどくさい!
GraphicsStateCollectionを使う
GraphicsStateCollection API Unity 6からGraphicsStateCollection APIが登場 • デバイスで実行中に描画の PSOを記録できる • 描画されたシェーダーバリアント・頂点データを自動的にトラッキング
• 記録したデータをアセット (.graphicsstate) として保存 • .graphicsstateアセットを元にWarmupができる 参考マニュアル • https://docs.unity3d.com/6000.0/Documentation/ScriptReference/Experimental.Ren dering.GraphicsStateCollection.html • https://discussions.unity.com/t/graphicsstatecollection-tracing-and-warmup-in-unit y-6/951031
PSOを記録 GraphicsStateCollection.BeginTrace GraphicsStateCollection.EndTrace GraphicsStateCollection.SaveToFile (通常通りゲームを実行 ) 記録開始 描画されるオブジェクトの シェーダーバリアント・頂点データを記録 記録終了
記録結果を.graphicsstateアセットに保存
.graphicsstate アセットと Warmup .graphicsstateアセットを元に GraphicsStateCollection.WarmUpで Warmupを行う 確実に正確な頂点データレイアウトで Warmupできる
// 記録する.graphicsstateアセット public GraphicsStateCollection graphicsStateCollection; // 記録開始 graphicsStateCollection.BeginTrace(); // 記録終了
graphicsStateCollection.EndTrace(); // アセット保存 graphicsStateCollection.SaveToFile(filePath); // Warmup! graphicsStateCollection.WarmUp(); // 終わり! カンタン! コード
すべてのプラットフォームで 正確なシェーダーWarmupが楽に!
2 0 2 4 Thank you