- Home /
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!
Answer by tanoshimi · Apr 24, 2014 at 03:28 PM
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.
You need to add the #pragma addshadow directive to add a shadow collector/caster pass (https://docs.unity3d.com/Documentation/Components/SL-SurfaceShaders.html)
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 } }