Share
Embed
Transcript
28 slides
-
シェーダー 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でサポートされています。 ??? -
「正確な頂点データレイアウト」 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); コード -
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が入っていないシェーダーの頂点データレイアウトが正しい -
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 -
// 記録する.graphicsstateアセット public GraphicsStateCollection graphicsStateCollection; // 記録開始 graphicsStateCollection.BeginTrace(); // 記録終了
graphicsStateCollection.EndTrace(); // アセット保存 graphicsStateCollection.SaveToFile(filePath); // Warmup! graphicsStateCollection.WarmUp(); // 終わり! カンタン! コード