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 Willium_Bob_Cole · Apr 23, 2014 at 05:58 PM · shadershadersshadowsvertex shaderrunner

Need to get lighting to work on bending vertex shader...

I used the code here http://answers.unity3d.com/questions/288835/how-to-make-plane-look-curved.html# to make a curving vertex shader, which is being applied to a row of planes, making a runner type game like subway surfers, and the effect is really good, however, his example is unlit. I have been messing around for hours and have got the shader to finally compile, containing the parts for both the vertex shader and the default diffuse shader, without errors, however, it now just renders as a default shader with no vertex shading being applied... It seems I can only get one or the other... the code is here:

 Shader "Custom/CurvedLit"
 {
     Properties
     {
         _MainTex ("Base (RGB)", 2D) = "white" {}
         _QOffset ("Offset", Vector) = (0,0,0,0)
         _Dist ("Distance", Float) = 100.0
         _Color ("Main Color", Color) = (1,1,1,1)
     }
     
     SubShader
     {
         Tags { "RenderType"="Opaque" }
         LOD 200
 
         CGPROGRAM
         #pragma surface surf Lambert vertex:vert
         #include "UnityCG.cginc"
         
 
         sampler2D _MainTex;
         fixed4 _Color;
         float4 _QOffset;
         float _Dist;
 
         struct Input
         {
             float2 uv_MainTex;
         };
         
         struct v2f
         {
             float4 pos : SV_POSITION;
             float4 uv : TEXCOORD0;
         };
         
         v2f vert (inout appdata_full v)
         {
             v2f o;
             float4 vPos = mul (UNITY_MATRIX_MV, v.vertex);
             float zOff = vPos.z/_Dist;
             vPos += _QOffset*zOff*zOff;
             o.pos = mul (UNITY_MATRIX_P, vPos);
             o.uv = v.texcoord;
             return o;
         }
         
         void surf (Input IN, inout SurfaceOutput o)
         {
             fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
             o.Albedo = c.rgb;
             o.Alpha = c.a;
         }
         
         
         
     ENDCG
     }
     Fallback "VertexLit"
 }


Please help as soon as possible, I just want a curved plane that accepts shadows. The shader can then be applied to all objects, but it needs to work on just planes first! Thanks in advance!

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

Answer by tanoshimi · Apr 24, 2014 at 03:28 PM

  1. Get rid of Fallback "VertexLit" - you don't want a fallback when doing shader development - only for production, and that's probably one of the causes why you are getting confused between the effects you're seeing.

  2. You need to add the #pragma addshadow directive to add a shadow collector/caster pass (https://docs.unity3d.com/Documentation/Components/SL-SurfaceShaders.html)

  3. I wrote an example of this sort of shader in this blog post from last year (I use a slightly different curvature calculation, but the effect is similar):

    Shader "Custom/CurvedWorld" { Properties { // Diffuse texture _MainTex ("Base (RGB)", 2D) = "white" {} // Degree of curvature _Curvature ("Curvature", Float) = 0.001 } SubShader { Tags { "RenderType"="Opaque" } LOD 200

          CGPROGRAM
             // Surface shader function is called surf, and vertex preprocessor function is called vert
             #pragma surface surf Lambert vertex:vert addshadow
      
             // Access the shaderlab properties
             uniform sampler2D _MainTex;
             uniform float _Curvature;
      
             // Basic input structure to the shader function
             // requires only a single set of UV texture mapping coordinates
             struct Input {
                 float2 uv_MainTex;
             };
      
             // This is where the curvature is applied
             void vert( inout appdata_full v)
             {
                 // Transform the vertex coordinates from model space into world space
                 float4 vv = mul( _Object2World, v.vertex );
      
                 // Now adjust the coordinates to be relative to the camera position
                 vv.xyz -= _WorldSpaceCameraPos.xyz;
      
                 // Reduce the y coordinate (i.e. lower the "height") of each vertex based
                 // on the square of the distance from the camera in the z axis, multiplied
                 // by the chosen curvature factor
                 vv = float4( 0.0f, (vv.z * vv.z) * - _Curvature, 0.0f, 0.0f );
      
                 // Now apply the offset back to the vertices in model space
                 v.vertex += mul(_World2Object, vv);
             }
      
             // This is just a default surface shader
             void surf (Input IN, inout SurfaceOutput o) {
                 half4 c = tex2D (_MainTex, IN.uv_MainTex);
                 o.Albedo = c.rgb;
                 o.Alpha = c.a;
             }
             ENDCG
         }
     }
    
    
    
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

21 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

Related Questions

Shadow artifacts on vertex animation shader 1 Answer

Mobile performance of splat map shader with distance blending 0 Answers

What is the meaning of a vertex shader for a post-processing shader? 1 Answer

Adding shadows to custom shader 1 Answer

Plugging in screenPosition node`s A channel gives different result then plugging in an identical float value in shader graph. 1 Answer


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