Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Unity 6 シェーダーWarmupガイド
Search
CyberAgent
PRO
January 27, 2025
1.2k
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
”AIを使う” から ”AIに任せる” へ ─ 開発プロセスを再設計してAIを組織標準にするまで
cyberagentdevelopers
PRO
2
370
Databricks 導入から Genie 活用まで、全部やった話
cyberagentdevelopers
PRO
0
1.7k
専任DEゼロからの データ基盤構築 - Databricks x IaC x AIで 進める「データの民主化」-
cyberagentdevelopers
PRO
1
1.3k
「エンジニア進化論」2028年の開発完全自動化、エンジニアはどう進化するか
cyberagentdevelopers
PRO
10
10k
NAB Show 2026 動画技術関連レポート / NAB Show 2026 Report
cyberagentdevelopers
PRO
1
710
Local LLM Meetup #1 Opening
cyberagentdevelopers
PRO
1
530
LocalLLMで機密データを匿名化したい
cyberagentdevelopers
PRO
2
590
Vibe Fine-Tuning Version 2 — RunPod SSH で安く学習してみた
cyberagentdevelopers
PRO
1
540
2026年度新卒技術研修 サイバーエージェントのデータベース 活用事例とパフォーマンス調査入門
cyberagentdevelopers
PRO
11
13k
Featured
See All Featured
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
530
The SEO Collaboration Effect
kristinabergwall1
1
570
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
Odyssey Design
rkendrick25
PRO
2
820
How to make the Groovebox
asonas
2
2.5k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
560
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
350
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
700
The World Runs on Bad Software
bkeepers
PRO
72
12k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
950
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