如何在统一阴影图中将纹理与其他纹理混合,但仅在阴影一侧



我目前正在制作一款基于殖民行星的游戏,我想知道如何在球体上重叠地球的光照贴图纹理,但只能在阴影图中受阴影影响的位置。我正在使用统一2020.1.0a25通用渲染管道

球体上的光分布在最基本的水平上由曲面法线和朝向光的矢量之间的点积决定。这称为lambert着色。在着色器语言中,它会这样写:

float NdotL = dot(normal, lightDir);

我们可以以类似的方式将其合并到自定义函数中。创建一个自定义函数,其中包含两个名为Normal和WorldPos的输入变量,以及一个名为Shadow的输出变量。将此代码粘贴到其中:

#if SHADERGRAPH_PREVIEW
Shadow = 1 - saturate(dot(float3(0.707, 0.707, 0), Normal));
#else
Light mainLight = GetMainLight();
float lightAmount = saturate(dot(mainLight.direction, Normal));
#ifdef _ADDITIONAL_LIGHTS
uint pixelLightCount = GetAdditionalLightsCount();
for (uint lightIndex = 0u; lightIndex < pixelLightCount; ++lightIndex)
{
Light light = GetAdditionalLight(lightIndex, WorldPos);
lightAmount += saturate(dot(light.direction, Normal));
}
#endif
Shadow = saturate(1 - lightAmount);
#endif

这个函数的作用是将主光和所有附加光的光贡献相加,并返回其倒数。因为点积产生的值在-1和1之间,所以首先使用saturate((将其钳制在[0,1]范围内。

注意,从这个函数中得到的基本上是一个梯度,从终点的0到与太阳相反的点的1。您可能希望以某种方式重新映射该值以获得更清晰的边界,例如,您可以将其乘以100并将其钳制为[0,1],或者使用平方根。

最新更新