Unity3D精灵。。。但是单边的?

Unity3D精灵。。。但是单边的?,unity3d,shader,unity3d-2dtools,Unity3d,Shader,Unity3d 2dtools,Unity出色的Sprites(),以及其他有价值的优势,实际上是双面的 在2D或3D用例中,您可以翻转这些小混蛋,但仍然可以从后面看到它们——它们是从两侧渲染的 我还喜欢在它们上使用的未照明着色器(即,精灵默认值,而不是精灵漫反射) 然而,我需要一个老式的单面Sprite 幸运的是,您可以免费下载Unity使用的优秀着色器的源代码。。。令人困惑的是,你不能仅仅在编辑器中打开它,而是可以看到它 在花费了相当多的精力(包括便宜的威士忌)之后,我对着色器进行了两(2)次修改 我将文件第一行中的名称改

Unity出色的
Sprite
s(),以及其他有价值的优势,实际上是双面的


在2D或3D用例中,您可以翻转这些小混蛋,但仍然可以从后面看到它们——它们是从两侧渲染的

我还喜欢在它们上使用的未照明着色器(即,精灵默认值,而不是精灵漫反射)

然而,我需要一个老式的单面
Sprite

幸运的是,您可以免费下载Unity使用的优秀着色器的源代码。。。令人困惑的是,你不能仅仅在编辑器中打开它,而是可以看到它

在花费了相当多的精力(包括便宜的威士忌)之后,我对着色器进行了两(2)次修改

  • 我将文件第一行中的名称改为“DefaultSingle”,而不是“Default”

  • 我注释掉了行
    Cull Off

  • (然后我制作了一个新的
    材质
    ,称之为“Sprite Single Side”,将着色器设置为这个新材质,然后在
    Sprite
    s上,我用新材质替换材质槽。)

    事实上,我做了这个修改,有没有搞砸了着色器中的任何东西?一个人能愉快地评论掉“剔除”而不引起进一步的问题吗?在改变Sprite使用的常用材料时是否有一些怪癖(你看不见,所以我不知道)。更广泛地说,是否有更正确的方法来实现单面
    Sprite

    // file "Sprites-DefaultSingle.shader"
    Shader "Sprites/DefaultSingle"
    {
      Properties
      {
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
        _Color ("Tint", Color) = (1,1,1,1)
        [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
      }
    
      SubShader
      {
        Tags
        { 
          "Queue"="Transparent" 
          "IgnoreProjector"="True" 
          "RenderType"="Transparent" 
          "PreviewType"="Plane"
          "CanUseSpriteAtlas"="True"
        }
    
      ///  Cull Off
        Lighting Off
        ZWrite Off
        Blend One OneMinusSrcAlpha
    
        Pass
        {
        CGPROGRAM
          #pragma vertex vert
          #pragma fragment frag
          #pragma multi_compile _ PIXELSNAP_ON
          #pragma shader_feature ETC1_EXTERNAL_ALPHA
          #include "UnityCG.cginc"
          
          struct appdata_t
          {
            float4 vertex   : POSITION;
            float4 color    : COLOR;
            float2 texcoord : TEXCOORD0;
          };
    
          struct v2f
          {
            float4 vertex   : SV_POSITION;
            fixed4 color    : COLOR;
            float2 texcoord  : TEXCOORD0;
          };
          
          fixed4 _Color;
    
          v2f vert(appdata_t IN)
          {
            v2f OUT;
            OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
            OUT.texcoord = IN.texcoord;
            OUT.color = IN.color * _Color;
            #ifdef PIXELSNAP_ON
            OUT.vertex = UnityPixelSnap (OUT.vertex);
            #endif
    
            return OUT;
          }
    
          sampler2D _MainTex;
          sampler2D _AlphaTex;
    
          fixed4 SampleSpriteTexture (float2 uv)
          {
            fixed4 color = tex2D (_MainTex, uv);
    
    #if ETC1_EXTERNAL_ALPHA
            // get the color from an external texture ..
            color.a = tex2D (_AlphaTex, uv).r;
    #endif //ETC1_EXTERNAL_ALPHA
    
            return color;
          }
    
          fixed4 frag(v2f IN) : SV_Target
          {
            fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
            c.rgb *= c.a;
            return c;
          }
        ENDCG
        }
      }
    }
    

    据我所知,除了您所希望的效果之外,这些更改都没有任何其他效果。此外,这是实现这一目标的最正确的方法-这是Cull唯一的目标。

    这不会导致任何问题,是正确的做法。如果你真的想表达清楚,你可以将行改为
    Cull Back
    ,而不是注释掉它,但是背面消隐被定义为默认行为,所以只需删除它就可以了。

    “可以翻转小混蛋,仍然可以从后面看到他们”哈哈……很遗憾,我对着色器一无所知。不是我的东西。几年后,我需要这个,在这里找到了:)啊!好消息。这就解释了为什么
    Cull-On
    不起作用。非常好,ThanksPrite的着色器代码在最初的问题被问到后发生了更改。可在此处下载当前版本(展开下载下拉列表):