Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
1
Question by keblight · May 29, 2015 at 09:14 AM · 2dflipnormal

how do you flip a sprite that has a normal map material applied to it?

I try the basic -x scale flip, but the sprite just disappears after that. I was thinking it has something to do with the material, can these not be flipped this way? I'm asking because I want to use normal maps for lighting effects on my player character(and npcs) in a 2d game. I asked this same question over at the normal 2d forums, no reply, thought maybe the devs or more knowledgeable unity people could help. Thanks for your time!

Comment
Add comment · Show 1
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image $$anonymous$$ · May 29, 2015 at 11:51 AM 0
Share

Are you using one of the "sprite" materials or using another material type?

The sprite materials automatically render the image on both sides of the sprite so when you scale negatively it just displays the other side. If the material is not a sprite material then the object essentially rotates around the y-axis 180 degrees.

$$anonymous$$y guess is you're using a non-sprite material to achieve normal mapping. If you go into 3d view you'll be able to see the sprite on the backside.

Some possible options to achieve your desired affect:

  • Write a custom sprite shader (Requires knowledge of shaders)

  • Create flipped graphics/animations for each image (Results in more assets)

  • Use code to flip the sprite in LateUpdate ($$anonymous$$ore CPU intensive)

I have yet to try it but option 1 is probably the most preferable.

3 Replies

· Add your reply
  • Sort: 
avatar image
8

Answer by GiyomuGames · Jun 16, 2015 at 06:10 AM

Hi,

I modified a surface shader I found online and made it work for sprites regardless of their x scale. It's not optimized as both sides will always be drawn, but for a 2D game it should not be an issue. The shader will also add the sprite renderer color in case you use it.

 Shader "Sprites/Bumped Diffuse both sides with Shadows"
 {
     Properties
     {
         [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
         _BumpMap ("Normalmap", 2D) = "bump" {}
         _Color ("Tint", Color) = (1,1,1,1)
         [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
                 _Cutoff ("Alpha Cutoff", Range (0,1)) = 0.5
 
     }
 
     SubShader
     {
         Tags
         { 
             "Queue"="Transparent" 
             "IgnoreProjector"="True" 
             "RenderType"="TransparentCutOut" 
             "PreviewType"="Plane"
             "CanUseSpriteAtlas"="True"
             
         }
         LOD 300
 
         // Render back faces first
         Cull Front
         Lighting On
         ZWrite Off
         Fog { Mode Off }
         
         CGPROGRAM
         #pragma surface surf Lambert alpha vertex:vert addshadow alphatest:_Cutoff 
         #pragma multi_compile DUMMY PIXELSNAP_ON 
 
         sampler2D _MainTex;
         sampler2D _BumpMap;
         fixed4 _Color;
         float _ScaleX;
 
         struct Input
         {
             float2 uv_MainTex;
             float2 uv_BumpMap;
             fixed4 color : COLOR;
         };
         
         void vert (inout appdata_full v, out Input o)
         {
             #if defined(PIXELSNAP_ON) && !defined(SHADER_API_FLASH)
             v.vertex = UnityPixelSnap (v.vertex);
             #endif
             float3 normal = v.normal;
             
             v.normal = float3(0,0,-1);
             v.tangent =  float4(1, 0, 0, 1);
             
             UNITY_INITIALIZE_OUTPUT(Input, o);
             o.color += _Color;
         }
 
         void surf (Input IN, inout SurfaceOutput o)
         {
             fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * IN.color;
             o.Albedo = c.rgb;
             o.Alpha = c.a;
             o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
         }
         ENDCG
         
         // Now render front faces first
         Cull Back
         Lighting On
         ZWrite Off
         Fog { Mode Off }
         
         CGPROGRAM
         #pragma surface surf Lambert alpha vertex:vert addshadow alphatest:_Cutoff 
         #pragma multi_compile DUMMY PIXELSNAP_ON 
 
         sampler2D _MainTex;
         sampler2D _BumpMap;
         fixed4 _Color;
         float _ScaleX;
 
         struct Input
         {
             float2 uv_MainTex;
             float2 uv_BumpMap;
             fixed4 color: COLOR;
         };
         
         void vert (inout appdata_full v, out Input o)
         {
             #if defined(PIXELSNAP_ON) && !defined(SHADER_API_FLASH)
             v.vertex = UnityPixelSnap (v.vertex);
             #endif
             float3 normal = v.normal;
             
             v.normal = float3(0,0,1);
             v.tangent =  float4(1, 0, 0, 1);
             
             UNITY_INITIALIZE_OUTPUT(Input, o);
             o.color += _Color;
         }
 
         void surf (Input IN, inout SurfaceOutput o)
         {
             fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * IN.color;
             o.Albedo = c.rgb;
             o.Alpha = c.a;
             o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
             o.Normal.z *= -1;
         }
         ENDCG
     }
 
 Fallback "Transparent/Cutout/Diffuse"
 }
 
Comment
Add comment · Show 7 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Schminitz · Jul 07, 2015 at 08:33 PM 0
Share

$$anonymous$$an you saved my life so much with that!

avatar image dantamont · Aug 08, 2015 at 04:42 PM 0
Share

I'm new to shaders and this shader really helped me out. I turned off culling for both passes, and was able to have shadow casting for flipped sprites on the same side as my nonflipped sprites. However, I noticed there is no "Pass{}" statement in here. Is that not necessary for each pass? I'm trying to add a shadow collector to the shader, but it's not working, how would I go about doing this?

avatar image GiyomuGames · Aug 10, 2015 at 02:14 AM 0
Share

Hello dantamont,

I am actually quite new to shaders myself, but I think there are no "Pass {}" statements for surface shaders. They are generated automatically (you can see them if you open the generated code from Unity interface).

avatar image Cereal_Killa · Apr 03, 2016 at 08:46 AM 1
Share

This disabled order in layer and receiving shadows.

How do I get these back?

avatar image Graveyard-Studios · Aug 28, 2018 at 12:35 AM 0
Share

It worked for me! Until now is flawless, thank you very much!

avatar image GiyomuGames Graveyard-Studios · Aug 28, 2018 at 01:26 AM 0
Share

Glad I could help! :)

Show more comments
avatar image
1

Answer by keblight · May 30, 2015 at 07:05 PM

Thanks for the reply, I think you are right. I don't know any shader stuff, I think, if I want to go ahead with the normal map stuff I'll have to double up the assets(left/right facing player/npcs etc..) thanks.

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image
0

Answer by AKhan74 · Aug 14, 2017 at 02:36 PM

@GiyomuGames you saved my life also!!! Good Shader!

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

7 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

How to flip parent without flipping child game object? 0 Answers

2D game unity player flip problems 1 Answer

Seeing through mesh 1 Answer

Is there a cheap way to flip a collider´s normals in real time? 0 Answers

2D example: Flip character without moving 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges