Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Unity 6 シェーダーWarmupガイド

CyberAgent
January 27, 2025
7

Unity 6 シェーダーWarmupガイド

CyberAgent

January 27, 2025
Tweet

More Decks by CyberAgent

Transcript

  1. シェーダー Warmup をしよう ShaderVariantCollection.WarmUpを使えばいいはず? // Warmupしたいシェーダーバリアントを含んだ ShaderVariantCollection public ShaderVariantCollection shaderVariantCollection;

    // Warmup! shaderVariantCollection.WarmUp(); // 終わり! カンタン! 参考マニュアル • https://docs.unity3d.com/ScriptReference/ShaderVariantCollection.WarmUp.html
  2. Warning: 警告: この方法は DX11とOpenGLで完全にサポート されています。 DX12、Vulkan、および Metal では、頂 点レイアウトおよび/またはレンダー ターゲットの設定が、プリウォームに使用したデータと異なる場合、グ

    ラフィックスドライ バはまだ作業を実行する必要があるかもしれません。 これは無駄な作業と GPU メモリの浪費につながり、アプリケーショ ンに目に見えるストールを残します。 ShaderWarmupはすべてのグラフィックスAPIでサポートされています。 ???
  3. ShaderWarmup API Experimental.Rendering.ShaderWarmup • Unity 2021.3より追加された新しいシェーダー Warmup API • Warmup時に頂点データを指定できる

    ◦ ShaderWarmupSetupより 参考マニュアル • https://docs.unity3d.com/ScriptReference/Experimental.Rendering.ShaderWarmup. html
  4. 頂点データの指定 頂点データは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 で指定されることが多い
  5. // 頂点データレイアウト指定 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); コード
  6. Meshの場合 Inspectorから確認 POSITION • Float32  3 XYZ NORMAL •

    Float32  3 XYZ TANGENT • Float32  4 XYZW UV0 TEXCOORD0 • Float32  3 XY
  7. ParticleSystem の場合 Renderer → Custom Vertex Streams から確認 POSITION •

    Float32  3 XYZ NORMAL • Float32  3 XYZ COLOR • UNORM8  4 RGBA UV TEXCOORD0 • Float32  3 XY
  8. struct Attributes { float3 positionOS : POSITION; float3 normalOS :

    NORMAL; float2 uv : TEXCOORD0; // シェーダーでは Tangentが使われていない }; シェーダーも確認 頂点シェーダーのコードで実際に使用している頂点データのチェックも忘れずに! MeshのデータではTANGENTがあるが、シェーダーでは使っていないため、 TANGENTが入っていないシェーダーの頂点データレイアウトが正しい
  9. 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
  10. // 記録する.graphicsstateアセット public GraphicsStateCollection graphicsStateCollection; // 記録開始 graphicsStateCollection.BeginTrace(); // 記録終了

    graphicsStateCollection.EndTrace(); // アセット保存 graphicsStateCollection.SaveToFile(filePath); // Warmup! graphicsStateCollection.WarmUp(); // 終わり! カンタン! コード