これはグラフィック理論やURPブランチ(他の2つのブランチ:組み込み、HDRP)の違いについてではなく、最後にカスタムプログラミングパイプラインについて話したいと思います(カスタマイズはレンダリングエンジン全体を実装することと同等になります) )、後で言いますが、今はカスタムプログラミングの時間ではありません
実際、以下はまだHLSLプログラミング、シェーダーコード(URPテンプレートでカバーされているだけ)です。
コンテンツ
UnityのShadowMaskの原則
グラフィックスレンダリングレンダラーの多くの初心者、特に入力ツールはUnityのクラスメートです。
さまざまなシャドウの概念を混同するのは簡単です。
このコードを初めて見たとき:Pass {"ShadowCaster"、これがシャドウをレンダリングするためのコードであると先入観を持っていました
投射の基本原理は
1.光源
2.オクルーダー(投影ソース)
3.シャドウレンダリング(オブジェクトレンダリング)
実際、ShadowCaster Passは投影ソースであり(主にエンジン、配置方法、シャドウの粒度、オフセットするかどうかを指示し、エンジンは特定の時間に対応するシャドウマップをベイクします)、シャドウの描画と色の描画は貧弱ではありません。実際、すべてForwardPass(または次の記事で説明するDefferPass)にあります。
void InitializeInputData(Varyings input, half3 normalTS, out InputData inputData)
{
//。。。。。。。。。。。
inputData.shadowMask = SAMPLE_SHADOWMASK(input.lightmapUV);
上記のコードにより、.shadowMaskがinputDataに格納されていることがわかります
それで、
half4 UniversalFragmentPBR(InputData inputData, SurfaceData surfaceData)
{
//。。。。。。。
// To ensure backward compatibility we have to avoid using shadowMask input, as it is not present in older shaders
#if defined(SHADOWS_SHADOWMASK) && defined(LIGHTMAP_ON)
half4 shadowMask = inputData.shadowMask;
#elif !defined (LIGHTMAP_ON)
half4 shadowMask = unity_ProbesOcclusion;
#else
half4 shadowMask = half4(1, 1, 1, 1);
#endif
Light mainLight = GetMainLight(inputData.shadowCoord, inputData.positionWS, shadowMask);
このコードから、shadowMaskは実際にはメインライト(平行光)を混合して計算されることがわかります。実際、light == 1、shadow == 0、light ++、shadow--;理解するのはそれほど難しくありません。
しかし、ポイントライトには影が必要ではありませんか?
#ifdef _ADDITIONAL_LIGHTS
uint pixelLightCount = GetAdditionalLightsCount();
for (uint lightIndex = 0u; lightIndex < pixelLightCount; ++lightIndex)
{
Light light = GetAdditionalLight(lightIndex, inputData.positionWS, shadowMask);
このコードのおかげで、ポイントライトのシャドウが指向性ライトのシャドウと同じであることがわかります。
//平行光(其他工具类似的名字:Main Lit,主光源,直接光源)
light.shadowAttenuation = MainLightShadow(shadowCoord, positionWS, shadowMask, _MainLightOcclusionProbes);
//点光源,聚光灯 (其他工具类似的名字:Other Lit,辅助光,间接光源)
light.shadowAttenuation = AdditionalLightShadow(perObjectLightIndex, positionWS, shadowMask, occlusionProbeChannels);
別のコードを見てください。
#ifdef CALCULATE_BAKED_SHADOWS
half bakedShadow = BakedShadow(shadowMask, occlusionProbeChannels);
#else
half bakedShadow = 1.0h;
#endif
したがって、shadowMaskはベイクモードでのみ機能し、指定するキーワードはocclusionProbeChannelsであることがわかります。
いろいろな名前、コンセプトがばかげて不明瞭
<具体的な分析、後で追加します>
結論は前の記事の結論です:
本を信じるよりも本を持っていない方がいい
それほど深くはありません
世界の理論をマスターする(実際、それらすべてをマスターすることは不可能です)、それはコードほど良くありません
実際のシェーダーシャドウの「魔法の変化」。。。。??
1.影なし
前の投稿のコード(ポイントライトとスポットライトが実装されています)によると、影??
最初はそれが問題だと思いました
後で、私はそれが非難するコード(公式)であることに気づきました。
#if !defined(ADDITIONAL_LIGHT_CALCULATE_SHADOWS)
return 1.0h;
#endif
<私は役人に何度も穴をあけられたので、多くの時間を無駄にすることはなく、コードを直接見るだけで、コードから解決策を見つけることができます>
2.影があります
// 官方建议的打开宏写法,_ADDITIONAL_LIGHT_SHADOWS_CASCADE不知道什么作用
//#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
//#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
//#define _ADDITIONAL_LIGHT_SHADOWS_CASCADE
//#define _ADDITIONAL_LIGHT_SHADOWS;
//目测,_ADDITIONAL_LIGHT_SHADOWS开了,就会把ADDITIONAL_LIGHT_CALCULATE_SHADOWS打开
//所以光是 ADDITIONAL_LIGHT_CALCULATE_SHADOWS 也就可以了,_ADDITIONAL_LIGHT_SHADOWS_CASCADE暂时作用不明
#define ADDITIONAL_LIGHT_CALCULATE_SHADOWS 0;
//测试宏是否有打开,需要某付费IDE支持
#if !defined(ADDITIONAL_LIGHT_CALCULATE_SHADOWS)
abc = 1 //ADDITIONAL_LIGHT_CALCULATE_SHADOWS已定义,所以即使这行错误不完整的代码,也不会报错
#endif
//Light light = GetAdditionalLight(lightIndex, positionWS);
float4 shadowMask = SAMPLE_SHADOWMASK(i.uv.zw);//lightmapUV
Light light = GetAdditionalLight(lightIndex,positionWS,shadowMask);
//现在这个light结构体就会带着阴影信息
3.影が再び消えた
それを変えましょう、もう(私たちが欲しいものは?)
4.ええ、またあります
<最後に、あなたはまだキャラクターのオーディオとビデオが利用できないことに気づきます>
ここで、シャドウとシャドウの違いは、静的オブジェクトがチェックされているかどうか、MeshRendererがチェックされているかどうかです。
ただし、SkinnedMeshRendererには、このオプション「Unity2020」はありません。
参考
Unityリアルタイムシャドウの実装-シャドウマッピング-プログラマーが求める
ShadowmaskvsDistanceShadowmask-Unityフォーラム
UnityのURPの下でシャドウを実装する方法-HuangLangのブログ-CSDNブログ-UnityurpShadow