- Home /
Question by
Georgeh200 · Oct 01, 2014 at 07:05 PM ·
shaders
diffuse curve world shader
I try to make a my objects to appear curved like Subway game, so I use this Shader, it's working Editor, but doesn't produce any thing on Android device
Shader "Custom/CurvedWorld"
{
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 150
CGPROGRAM
#pragma surface surf Lambert noforwardadd vertex:vert
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
void vert( inout appdata_full v)
{
float4 _QOffset= float4(-5,-5,0,0);
float _Dist=100.0;
vv.xyz -= _WorldSpaceCameraPos.xyz;
float4 vPos = mul (UNITY_MATRIX_MV, v.vertex);
float zOff = vPos.z/_Dist;
vPos += _QOffset*zOff*zOff;
v.vertex = mul (vPos, UNITY_MATRIX_IT_MV);
v.texcoord = mul( UNITY_MATRIX_TEXTURE0, v.texcoord );
}
ENDCG
}
}
Comment
Answer by tanoshimi · Feb 14, 2015 at 09:55 AM
Your shader looks like a slightly mashed up version of the one at https://alastaira.wordpress.com/2013/10/25/animal-crossing-curved-world-shader/ . Try this code instead:
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
// addshadow used to add shadow collector and caster passes following vertex modification
#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
}
// FallBack "Diffuse"
}
Your answer
![](https://koobas.hobune.stream/wayback/20220613164159im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
How Can I Avoid Full Shader Recompilation? 0 Answers
UV Deformation 1 Answer
Why my shaders are not working on MacBook Pro? 1 Answer
Looking for a transparent shader 0 Answers
A problem with cutting holes in objects (terrains) using depth mask 0 Answers