【问题标题】:How do I blend texture over other texture in unity shadergraph but only on the shadow side?如何在统一着色图中将纹理与其他纹理混合,但仅在阴影侧?
【发布时间】:2020-03-08 14:53:18
【问题描述】:

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

【问题讨论】:

    标签: unity3d shader


    【解决方案1】:

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

    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],或使用平方根。

    【讨论】:

    • 所以我认为它应该可以正常工作,但现在我得到了所有这些错误Errors
    • 在“Shadow = 1”之后添加分号。那应该可以解决它。
    • 分号修复了错误,谢谢。但我尝试使用这样的阴影输出:shader 进行发射,但现在它使发射无处不在,独立于阴影 earth我还在学习它
    • 你能告诉我图表的其余部分吗?上面的函数只适用于主方向光,所以可能是这个问题(如果你使用的是点光源)?
    • 我使用的是点光源,但我也尝试使用定向光源,它的工作原理与使用点光源一样。下面是图表的其余部分:shader
    猜你喜欢
    • 1970-01-01
    • 2020-10-05
    • 2013-04-21
    • 2021-09-08
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多