Unity3d 如何在unity shadergraph中将纹理与其他纹理混合,但仅在阴影侧?

Unity3d 如何在unity shadergraph中将纹理与其他纹理混合,但仅在阴影侧?,unity3d,shader,Unity3d,Shader,我目前正在制作一个基于殖民行星的游戏,我想知道我是如何在球体上重叠地球的光照贴图纹理的,但只在shadergraph中受阴影影响的位置。 我正在使用unity 2020.1.0a25与通用渲染管道一起使用球体上的光分布处于最基本的水平,由曲面法线和朝向光的矢量之间的点积决定。这称为lambert着色。在着色器语言中,它的编写方式如下: float NdotL = dot(normal, lightDir); 我们可以以类似的方式将其合并到自定义函数中。使用两个名为Normal和WorldPos

我目前正在制作一个基于殖民行星的游戏,我想知道我是如何在球体上重叠地球的光照贴图纹理的,但只在shadergraph中受阴影影响的位置。
我正在使用unity 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
#如果SHADERGRAPH#U预览
阴影=1-饱和(点(浮动3(0.707,0.707,0),正常));
#否则
Light mainLight=GetMainLight();
浮动光量=饱和(点(主光方向,正常));
#ifdef_附加_灯
uint pixelLightCount=GetAdditionalLightsCount();
对于(uint lightIndex=0u;lightIndex
此函数的作用是将主灯光和所有附加灯光的灯光贡献相加,并返回该值的倒数。由于点积产生的值介于-1和1之间,因此首先使用saturate()将其钳制到[0,1]范围


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

所以我认为它应该可以正常工作,但现在我得到了所有这些错误,在“Shadow=1”后面加了一个分号。这应该可以解决问题。分号修复了错误,谢谢。但是我试着使用阴影输出,像这样:为了使emmission,但现在它使emmission无处不在,独立于阴影对不起,我的问题,但我刚刚开始使用shadergraph,对不起,我的英语也很抱歉,我还在学习它。你能给我看剩下的图表吗?上述功能仅适用于主平行光,因此可能这就是问题所在(如果您使用的是点光源)?我使用的是点光源,但我也尝试了平行光,其工作原理与点光源相同。下面是图表的其余部分: