前のセクションLitShader我々は最適化することが行われてきたまさにPBR URPを見て、このセクションに答えるために、PBR関連の質問を残して、大体どのような作品を学びました。
最適化を行うことを知っているために、あなたはPBRはそれがどのように見えるかであることを知っている必要があります。
ユニティオリジナルの標準は次のように書かれています:
half4 BRDF1_Unity_PBS(half3 diffColor、half3 specColor、半oneMinusReflectivity、半平滑性が、 正常するfloat3、VIEWDIR、するfloat3 UnityLight光、UnityIndirectのGI) { フロート perceptualRoughness = SmoothnessToPerceptualRoughness(平滑性)。 するfloat3 halfDir = Unity_SafeNormalize(するfloat3(light.dir)+ VIEWDIR)。 #define UNITY_HANDLE_CORRECTLY_NEGATIVE_NDOTV 0 の#if UNITY_HANDLE_CORRECTLY_NEGATIVE_NDOTV // 我々はビューベクトルに向かって通常のシフト量は、ドット積によって定義されます。 半shiftAmount = ドット(通常、VIEWDIR)。 ノーマル = shiftAmount < は0.0f ?ノーマル+ VIEWDIR *(-shiftAmount + 1E-5F ):ノーマル; // A再正規化は、ここで適用されるべきであるが、シフトが小さいよう、私たちはALUを保存するためにそれをしません。 // 正常=正規化(正常); 半NV =飽和(ドット(通常、VIEWDIR))。// TODO:この飽和はありませんここでは必要であるべき #elseの 半分NV = ABS(ドット(通常、VIEWDIR)); // このABSは、アーチファクトを制限することを可能にする #endifの 半分NL = 飽和(ドット(通常、light.dirを)); フロート NH = 飽和(ドット(通常、halfDir))。 半分LV =飽和(ドット(light.dir、VIEWDIR))。 半LH = 飽和(ドット(light.dir、halfDir))。 // びまん用語 半分diffuseTerm = DisneyDiffuse(NV、NL、LH、perceptualRoughness)* NL; // 鏡面用語 // HACK:理論的には、我々はパイでdiffuseTermを分割しないで乗算specularTerm必要があります! // しかし従来のものよりもシェーダ見大幅に暗くなります1) // と2)をエンジン側の「非重要」ライトは、彼らが周囲のSHに注入されたときのケースでは、あまりにもパイで割られなければなら フロート粗さ= (PerceptualRoughnessToRoughness perceptualRoughness); #if UNITY_BRDF_GGX // 0にroughtnessとGGXはHDrenderloop roughtness再マッピングを一致させるために、ここでMAX(粗さ、0.002)を使用して、全く鏡面を意味しないだろう。 粗= MAX(粗、0.002 )。 ハーフV = SmithJointGGXVisibilityTerm(NL、NV、粗)。 フロート D = GGXTerm(NH、粗)。 #else // レガシー 半分V = SmithBeckmannVisibilityTerm(NL、NV、粗)。 ハーフD = NDFBlinnPhongNormalizedTerm(NH、PerceptualRoughnessToSpecPower(perceptualRoughness))。 #endifの 半分specularTerm = V * D * UNITY_PI。//トーランス-Sparrowモデルは、フレネルは、後で適用さ UNITY_COLORSPACE_GAMMA IFDEF位 specularTerm = SQRT(MAX(1E- 4H、specularTerm))。 #ENDIF // specularTerm * NLは、必ずそれがまともな値です作るために)(、いくつかのケースでは、使用最大の金属のNaNにすることができ specularTerm = MAX(0、specularTerm * NL); #ifの定義(_SPECULARHIGHLIGHTS_OFF) specularTerm = 0.0 。 #endifの // surfaceReduction =のInt D(NdotH)* NdotH * ID(NdotL> 0)のdH = 1 /(粗^ 2 + 1) ハーフsurfaceReduction。 #UNITY_COLORSPACE_GAMMA IFDEF surfaceReduction =1.0 - 0.28 *粗* perceptualRoughness。 // 1から0.28 * X ^ 3の近似として(1 /(X ^ 4 + 1))ドメイン上^(1 / 2.2)[0; 1] # 他 surfaceReduction = 1.0 /(粗*粗+ 1.0) ; // フェード\にある[0.5; 1] #endifの // 真ランバート照明を提供するために、我々は完全に鏡面殺すことができるようにする必要があります。 specularTerm * =任意の(specColor)?1.0:0.0 ; 半grazingTerm =飽和(滑らか+(1 - oneMinusReflectivity))。 half3色= diffColor *(gi.diffuse + light.color * diffuseTerm) + specularTerm * light.color * FresnelTerm(specColor、LH) + surfaceReduction * gi.specular * FresnelLerp(specColor、grazingTerm、NV); 戻り half4(色1 )。 }
私たちは、直接の最終的な色を計算になります:
*色=拡散色+高光反射率項目*反射フレネル用語+ GI低減パラメータの色光面*鏡面フレネル補間(光GI * +拡散拡散アイテムの色)
アイテムは、拡散反射DisneyDiffuse、高い光反射率と次の項目は、フレネル用語D(NDF)によってV(可視性)は、コアBRDF、GI高い光反射色パラメータにより高い周囲光から構成されており、フレネル反射面を減少させるために、前記補間(F0、F90としてgrazingTermとしてspecularColor)ジョイント決定。
2人のコード読取著者が算出周囲光が変化なしURP上に実質的であることを比較した、キーは、大きな変化のBRDFを作ることです。
まず、と元のラインの拡散反射がディズニーで、URPはDirectBRDFの拡散及び輝度を乗じた全ての鏡面反射、放射輝度代表単位断片放射線、特定の計算は光であり、光の減衰及びndotl(キー)、NdotLによって結果として生じるであろう項目は(もちろん、これは理解を容易にするため、実際にはより良い放射線量に応じて理解されている)拡散反射BRDFランバートあります。
そして、BRDFは、URPの最適化行わ項目の強調表示が計算されます。BRDF最も重要な3つの因子D、Vは、F、V及びFはURP最適化で行われ、URP VFの積が簡単に統合(V Gを合わせ統一用語と分母項があります)式は、私たちが式を比較することができ、最適な結果を達成するために:
内蔵のパイプラインの可視性:
URPのVF:
もちろんモバイルグラフィックを動かすシーグラフ2015年から「Mobile用の最適化PBR」を参照してください:URPは、この最適化をベースとしたものと同様に、非常に大規模な最適化を行うために、それがVで見ることができ、統一政府はまた、ポイントを与えています
それは、シーグラフ2015の記事であるべき記事は少し大きなファイルで、ここにリンクを入れます。http://s2015.siggraph.org/sites/default/files/firstpages.reduced.pdf
興味ジュニアパートナーは、あなたが行くと見ることができます。これは、ライトへのコンテンツの多くを感じているはず、後で(ない多くの概要〜はないが)、この記事では、約純粋にあるコードは、ここでとても良い上、自分の要約のうち、または直接、それを読んだ後の知覚に影響を与えます掲載しているましたアウトURP Litshader一時的な膨張過程の後、あなたはそれの記録は、次のセクションを作るとき、私たちは長い間考えて、何を学ぶのか、それがテーマに集中すべきであることがわかったので、私たちはどのように拡張し、RenderFeature URP URP(を見て、次のセクションLitShaderとして言っても必要性を渡していないことを決めた一方は、一方では時間が非常に豊富ではありません、そして学ぶために一緒に動作するはずです:)他のシリーズで)。
あなたは小さなパートナーやコメントがあれば、あなたは記事の下にコメントを残すことができますああ〜