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
0
Question by jamesflowerdew · Oct 30, 2014 at 02:12 PM · camerashadernormalssurface

Camera spaced normals for a surface shader

Hi All,

I wanted to get an object fading away from the edges that are not facing the camera. I'm trying to do this by comparing the view direction with the normals.

I've written this:

 Shader "gamevial/GasGiant" {
 
     Properties {
         _MainTex ("Base (RGB) Trans (A)", 2D) = "white"{}
         _BumpTex ("Bump (RGB) Trans (A)", 2D) = "bump" {}
         _RippleTex("Ripple (RGB) Trans (A)", 2D) = "black" {}
         _OffsetX("UV Offset X",Float)=.5
         _OffsetY("UV Offset Y",Float)=.5
         _Push1("Direction",Vector)=(0,0,1,1)
                 
         _Fade("Fade Edges", Range (0,10)) = 5
     }
     SubShader {
     Tags{"Queue"="Transparent-1"}
          Blend SrcAlpha OneMinusSrcAlpha
         //Blend One One
         Cull Back
         ZWrite Off
          CGPROGRAM
           #pragma surface surf Lambert  addshadow halfasview 
           struct Input {
                float2 uv_MainTex;
                float2 uv_RippleTex;
                float3 viewDir;
                float3 worldNormal;
           };
           
           uniform sampler2D _MainTex;
           uniform sampler2D _BumpTex;
           uniform sampler2D _RippleTex;
           float _OffsetX,_OffsetY;
           float _Fade;
           float4 _Push1;
           void surf (Input IN, inout SurfaceOutput o) {
              // float3 viewN = normalize( mul( UNITY_MATRIX_IT_MV, -o.Normal.xyzz).xyz );
               float3 viewN = mul ((float3x3)UNITY_MATRIX_IT_MV,IN.worldNormal);
               float2 ripuv1=IN.uv_RippleTex+_Push1.xy*_Time[0];
               float2 ripuv2=IN.uv_RippleTex+_Push1.zw*_Time[0];
               half4 vRip=tex2D(_RippleTex,ripuv1)+tex2D(_RippleTex,ripuv2)-half4(1,1,1,1);
               float2 uv=IN.uv_MainTex+float2((vRip.r)*_OffsetX,(vRip.g)*_OffsetY);
               float4 c=tex2D(_MainTex, uv);
             o.Albedo = c.rgb;
             o.Alpha = c.a*pow(max(0,dot(viewN,IN.viewDir)),_Fade);//;
             //o.Normal=UnpackNormal(tex2D(_BumpTex, uv));
           }
           
       
         ENDCG
     }
 
 }
     

but for some reason it seems (SEEMS) to be "pointing" or fading with the light instead (?)

Any ideas of where this is flawed?

Comment
Add comment
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

1 Reply

· Add your reply
  • Sort: 
avatar image
0
Best Answer

Answer by jamesflowerdew · Nov 04, 2014 at 10:52 AM

 shader "gamevial/gasgiant2" {
     properties{
         _MainTex ("Diffuse", 2D) = "white" {}
         _RippleTex("Ripple (RGB) Trans (A)", 2D) = "black" {}
 
         _Shininess ("Shininess",Float)=10 
         _OffsetX("UV Offset X",Float)=.5
         _OffsetY("UV Offset Y",Float)=.5
         _Push1("Direction",Vector)=(0,0,1,1)
         
         _Fade ("Fade Edges",Range(0,10))=.1
     
     }
 
        
         SubShader {
             Tags{ "RenderType" = "Transparent" "Queue" = "Transparent" }
                
             CGPROGRAM
            
             #pragma target 3.0
             #pragma surface surf Lambert alpha
             #include "UnityCG.cginc"
      
             uniform sampler2D _MainTex;
               uniform sampler2D _BumpTex;
               uniform sampler2D _RippleTex;
               float _OffsetX,_OffsetY;
               float _Fade;
               float4 _Push1;
             struct Input {
                 float2 uv_MainTex;
                 float2 uv_RippleTex;
                 float3 viewDir;
             };
                
             void surf (Input IN, inout SurfaceOutput o)
             {
                 float2 ripuv1=IN.uv_RippleTex+_Push1.xy*_Time[0];
                   float2 ripuv2=IN.uv_RippleTex+_Push1.zw*_Time[0];
                   half4 vRip=tex2D(_RippleTex,ripuv1)+tex2D(_RippleTex,ripuv2)-half4(1,1,1,1);
                   float2 uv=IN.uv_MainTex+float2((vRip.r)*_OffsetX,(vRip.g)*_OffsetY);
                   float4 c=tex2D(_MainTex, uv);
                 o.Albedo = c.rgb;
                 o.Alpha =  pow(dot (normalize(IN.viewDir),o.Normal),_Fade);
             }
             ENDCG
         }
      
 
 }

This works.

I'm afraid that I found the answer once on the generic unity forum but was unable to find it again (a humble nod in that lost stranger's direction). It was someone attempting to do a microscopic style shader and I inverted the logic.

the control leaves something to be desired, as it fades too fast or not at all, but it should be quite useful. Have already built a volume light version that gets rid of annoying stripes created when facing geometry used to fake rays of light at obtuse angles.

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

26 People are following this question.

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

Related Questions

Assigning vertex normal in Surface program to o.Normal brakes lighting? 0 Answers

Is _CameraDepthNormalsTexture accesible in a Surface Shader? 0 Answers

Shader based camera compositing. 2 Answers

Dividng clip space by "w" warps the output? 1 Answer

How to achieve diablo style walls? 4 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