【问题标题】:Unity Silhouette ShaderUnity 剪影着色器
【发布时间】:2015-08-23 00:15:43
【问题描述】:

有谁知道一个免费的 Unity/ShaderLAB,它只是默认的精灵着色器,但是当你走在某物后面并且再也看不到玩家或它的一部分时,它会显示一个完全不透明的、一种颜色的轮廓,覆盖一切。

它应该看起来像这样:http://i.stack.imgur.com/iByV7.png(来自 Titan Souls)

【问题讨论】:

  • 您的游戏是否 1) 具有透明度和 2) 使用 Sprite 的“分层排序”功能?默认的 Sprite 着色器具有透明度,因此您不能只更改着色器并让一切正常运行(至少在我的技能水平上不行)
  • 看起来就像是玩家“面前”的物体充当了面具。使用该蒙版,您可以渲染透明;一切之上的黑色精灵。当玩家四处移动并且顶部没有精灵时;掩码将为空,因为没有掩码对象。反过来,不会渲染叠加的精灵。我会考虑一下,看看我是否可以回来回答:-)
  • 达尼特!我想不出一种优雅的方式。在我的脑海中,您需要一个始终位于播放器精灵之上的叠加精灵。此叠加层还应具有尽可能高的 z-index / sprite 层顺序,以确保它位于所有其他图像之上。然后每次玩家移动时检查玩家精灵边界内是否有物体(其他精灵)。然后将遮罩与您的玩家精灵一起应用到每个单独的对象上,并将遮罩显示为具有选择颜色的叠加层。一定有更好的方式使用着色器。

标签: unity3d shader


【解决方案1】:

您可以将此着色器应用于您的播放器对象。对于它绘制的每个像素,它将用 1 标记模板标志。

Shader "Custom/StencilHole" { //also used for silhouetted objects
Properties {}
SubShader {
    // Write the value 1 to the stencil buffer
    Stencil
    {
        Ref 1
        Comp Always
        Pass Replace
    }
    Tags { "Queue" = "Geometry-1" }  // Write to the stencil buffer before drawing any geometry to the screen
    ColorMask 0 // Don't write to any colour channels
    ZWrite Off // Don't write to the Depth buffer
    Pass {}
} 
FallBack "Diffuse"
}

然后你可以在“有色玻璃”上使用下面的着色器。它检查每个像素的模板值:如果等于 1,则使用轮廓颜色(示例中的黑色),否则使用主颜色(示例中的灰色)和纹理(示例中的无)的组合。注意:只有应用了 ABOVE 着色器的对象才会出现剪影 - 因此您可以选择使玻璃颜色透明并允许例如地面的花朵显示出来。

Shader "GUI/silhouetteStencil" 
{

    Properties {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Color", Color) = (1,1,1,1)
        _silhouetteColor ("silhouette Color", Color) = (0,1,0,1)
    }

    SubShader {
        Tags { "Queue"="Transparent-1" "IgnoreProjector"="True" "RenderType"="Transparent" }
        Lighting On Cull back ZWrite Off Fog { Mode Off }
        Blend SrcAlpha OneMinusSrcAlpha

        Pass 
        {
            // Only render texture & color into pixels when value in the stencil buffer is not equal to 1.
            Stencil 
            {
                Ref 1
                Comp NotEqual
            }
            ColorMaterial AmbientAndDiffuse
            SetTexture [_MainTex] 
            {
                constantColor [_Color]
                combine texture * constant
            }
        }

        Pass
        {
            // pixels whose value in the stencil buffer equals 1 should be drawn as _silhouetteColor
            Stencil {
              Ref 1
              Comp Equal
            }
            SetTexture [_MainTex] 
            {
                constantColor [_silhouetteColor]
                combine constant
            }

        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    相关资源
    最近更新 更多