subtactive
half4 bakedTex = UNITY_SAMPLE_TEX2D(unity_Lightmap, lightmapUV.xy);
half3 decodeColor = DecodeLightmap( bakedTex );
col *= decodeColor;
return col;
Shadowmask
첫 번째 베이킹 그림자는 unity_Lightmap 다이어그램의 unity_ShadowMask에 없습니다. 이것은 UnityShaderVariables에 정의되어 있습니다
inline fixed UnitySampleBakedOcclusion (float2 lightmapUV, float3 worldPos)
{
#if defined (SHADOWS_SHADOWMASK)
#if defined(LIGHTMAP_ON)
fixed4 rawOcclusionMask = UNITY_SAMPLE_TEX2D_SAMPLER(unity_ShadowMask, unity_Lightmap, lightmapUV.xy);
#else
fixed4 rawOcclusionMask = fixed4(1.0, 1.0, 1.0, 1.0);
#if UNITY_LIGHT_PROBE_PROXY_VOLUME
if (unity_ProbeVolumeParams.x == 1.0)
rawOcclusionMask = LPPV_SampleProbeOcclusion(worldPos);
else
rawOcclusionMask = UNITY_SAMPLE_TEX2D(unity_ShadowMask, lightmapUV.xy);
#else
rawOcclusionMask = UNITY_SAMPLE_TEX2D(unity_ShadowMask, lightmapUV.xy);
#endif
#endif
return saturate(dot(rawOcclusionMask, unity_OcclusionMaskSelector));
#else
//Handle LPPV baked occlusion for subtractive mode
#if UNITY_LIGHT_PROBE_PROXY_VOLUME && !defined(LIGHTMAP_ON) && !UNITY_STANDARD_SIMPLE
fixed4 rawOcclusionMask = fixed4(1.0, 1.0, 1.0, 1.0);
if (unity_ProbeVolumeParams.x == 1.0)
rawOcclusionMask = LPPV_SampleProbeOcclusion(worldPos);
return saturate(dot(rawOcclusionMask, unity_OcclusionMaskSelector));
#endif
return 1.0;
#endif
}
여기서는 unity_Lightmap을 직접 사용하는 샘플러 인 UNITY_SAMPLE_TEX2D_SAMPLER를 사용합니다. 그러나 unity_Lightmap을 먼저 정의하고 사용해야하며, 그렇지 않으면 컴파일러가 샘플러를 제거하고 오류를보고한다는 점에 유의해야합니다.
위의 예는 그림자 맵에 의해 계산 된 값과 유사한 감쇠 값을 반환하고 직접 색상을 곱하거나 색상을 lerp하는 데 사용합니다. 그래서 제빵의 그림자가 있습니다.
그러나 여전히 문제가 있습니다. 그림자 마스크 모드의 라이트 맵은 빼기 모드와 비교할 때 매우 어둡습니다.
Lightmap은 간접 조명이므로 실제 색상을 곱하는 대신 실시간 조명을 추가합니다.
따라서 Substractive 모드의 경우 라이트 맵에 확산을 곱하면됩니다.
하지만 그림자 마스크는 간접 조명이므로 직사광을 추가해야합니다.
4.4의 계수에 관해서는, 그것은 시험되고 나는 놀랐다. DecodeLightmap에 2를 곱한다고하는 것이 합리적입니다. 이것은 원칙에 대해 명확하지 않습니다.
필자는 섀도우 마스크 모드 쉐이더와 내장 된 모바일 / 확산의 비교를 작성했습니다.
또한 버그가 있습니다. 내장 된 Mobile / Unlit (SupportLightmap)은 Shadowmask를 지원하지 않으며 확산으로 확산되는 것처럼 어두워집니다.
마지막으로이 셰이더를 넣으면 #if LIGHTMAP_ON 및 #if SHADOWS_SHADOWMASK 매크로 컨트롤이 사용되지 않으므로 라이트 맵 아래에만 표시 할 수 있습니다
'Technical Report > R&D test' 카테고리의 다른 글
Unity Shader에서 if문 사용과 삼항 연산자 사용에서의 compile 코드 비교. (0) | 2021.02.17 |
---|---|
cook-Torrance (0) | 2020.04.08 |
Traditional subscattering (0) | 2018.03.21 |
Unity Sprites/Cheap Outer Glow Shader (0) | 2018.02.05 |
Unity SRP LightweightForward (0) | 2018.02.01 |