shader入門精要読書ノート45 Untiyにおけるレンダリング最適化技術(二)


一、処理を必要とするチップの数を減らす
この部分の最適化戦略はoverdrawを減らすことであり、overdrawは1つの画素が複数回描画される.
  • は、描画順序を制御する深さテストの存在により、物体が前後に描画されることを保証できれば、overdrawを大幅に低減することができる.これは、後に描画された物体が深さテストに合格できないため、後のレンダリング処理が行われないためである.レンダリングキューが2500(Background、Geometry、AlphaTest)未満のオブジェクトは不透明なオブジェクトとみなされます.これらのオブジェクトは前後から描画されますが、使用される他のキュー(Transparent、Overlay)は後方から描画されます.つまり、オブジェクトを不透明なレンダリングキューに設定し、半透明キューの使用をできるだけ避ける必要があります.したがって、いくつかの特定の状況では、カスタムレンダリング順序を使用することもできます.これにより、多くの物体が多くの後でレンダリングされ、メタペイントの使用を節約することができます.
  • 透明物体半透明物体は、半透明物体にとって、深さ書き込みが開かれていないため、後からレンダリングするしかないので、半透明物体は必ずGUIの断面を含むoverdrawをもたらすなど、できるだけ多くの半透明の重複を避けるべきである.
  • リアルタイムの照明と影の多すぎる点光源を減らしたり、複数のPassのShaderを使用したりすると、性能が低下します.多くのゲームシーンでは、モバイルプラットフォームの画面には多くの点光源があるようですが、実際にはベイク処理技術を使用して、光を事前にテクスチャにベイク処理し、テクスチャサンプリングの結果に基づいて光の結果を得ることができます.また、God Rayは多くの小型光源をシミュレートすることができます.

  • 二、帯域幅の節約
  • テクスチャサイズテクスチャを最小限に抑えるには、できるだけ正方形、長さと幅が2の整数べき乗が望ましい.このとき、最適化を最大限に発揮することができ、マルチレベルの漸遠テクスチャ技術(具体的には)テクスチャ圧縮も帯域幅、すなわち各種圧縮フォーマットを節約することができる.
  • 解像度スケーリングを使用して、いくつかのローエンドデバイス(解像度が高い他のハードウェアではできない)をスケーリングすることができます.解像度を下げるには、Screen.SetResolutionを直接使用することができます.

  • 三、計算の複雑さを減らす
  • ShaderのLOD技術、この技術はShaderのLODレベルを制御することができて、ShaderのLOD値がある設定の値より小さい時だけ、このShaderはやっと使用されて、超えるならば、レンダリングされません.一般的にUnityに内蔵されているDiffuseのLODは200、Bumped SpecularのLODは400です.
  • SubShader
    {
    	Tags{"RenderType"="Opaque"}
    	LOD 200
    }
    
  • コードの最適化コードでは、サンプリング座標計算コードを頂点シェーダに配置したように、計算をできるだけオブジェクトまたは頂点に配置する必要があります.また、できるだけ低精度の浮動小数点値を使用して演算する必要があります.高精度のfloat/highpは頂点座標変数などの格納に適していますが、計算速度が最も遅く、チップシェーダでこの精度を使用することは避けなければなりません.half/mediumpは、floatの約2倍の計算速度を持つスカラー、テクスチャ座標などの変数に適しています.fixed/lowpは、ほとんどの色変数と正規化された方向ベクトルに適用されます.もう少し精度が要求されない計算をするときは、できるだけこれを使うべきです.その計算速度はfloatの4倍であるが,低精度変数の頻繁なswizzle操作(color.xwxwなど)を避けるには,多くの精度間の変換を避ける必要がある.また、floatのxy、zw変数に2つのテクスチャ座標が格納されているなど、異なるプラットフォームに基づいて変数を補間するかどうかを決定します.一部のプラットフォームも逆作用をもたらします.フルスクリーンのスクリーン後処理はできるだけできません.Bloom、ホットスクランブルなどの効果が必要な場合は、低精度(fixed)を使用して演算する必要があります.高精度な演算はルックアップテーブル(LUT)や頂点シェーダに移行して処理することができます.それ以外にも、できるだけ多くの特効を1つのShaderに移行し、ブランチやループ文を使用しないようにする必要があります.sin、tan、pow、logなどの複雑な数学演算をできるだけ避け、一部のハードウェアの最適化効果に影響を与えるため、discard操作をできるだけ使用しないでください.