Playing with shaders – isolines
World space isolines shader
The shaders in Unity still remain a myth for me. But when I have a goal, I would find a way to make it by modifying already existing ones, basing on the resources in the web.
This time I targeted myself at getting an isolines shader. Its demo is here. There is a slider provider for changing the heiht itervals relative to the centre of the sphere.
I usually find the shader examples from http://docs.unity3d.com/Documentation/Components/SL-SurfaceShaderExamples.html as a good starting point for most what I need.
This time I have started fom the “Slices via World Space Position” shader found there.
Shader "Custom/Isolines" { Properties { _MainTex ("Texture", 2D) = "white" {} _BumpMap ("Bumpmap", 2D) = "bump" {} _IsolinesColor ("IsolinesColor", Color) = (1,0,0,1) _heightInterval ("_heightInterval",float) = 1 _lineWidth ("_lineWidth",float) = 0.1 } SubShader { Tags { "RenderType" = "Opaque" } CGPROGRAM #pragma surface surf Lambert fixed4 _IsolinesColor; float _heightInterval; float _lineWidth; struct Input { float3 worldPos; float2 uv_MainTex; float2 uv_BumpMap; }; sampler2D _MainTex; sampler2D _BumpMap; void surf (Input IN, inout SurfaceOutput o) { float a1 = frac(IN.worldPos.y/_heightInterval) - 1 +_lineWidth/_heightInterval; if(a1>0){ o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb + _IsolinesColor.rgb; }else{ o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb; } o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap)); } ENDCG } Fallback "Diffuse" }
Below is the outcome:
Some measures have to be taken to provide the equal line width for all the sphere’s latitudes so our picture looked like here:
We just have to take the WorldSpace normal into account. That requires adding the vert function. Below is the final shader’s code and the file download is here:
Shader "Custom/Isolines" { Properties { _MainTex ("Texture", 2D) = "white" {} _BumpMap ("Bumpmap", 2D) = "bump" {} _IsolinesColor ("IsolinesColor", Color) = (1,0,0,1) _heightInterval ("_heightInterval",float) = 1 _lineWidth ("_lineWidth",float) = 0.1 _Up ("_Up (x, y, z)", vector) = (0,1,0) } SubShader { Tags { "RenderType" = "Opaque" } CGPROGRAM #pragma surface surf Lambert vertex:vert fixed4 _IsolinesColor; float _heightInterval; float _lineWidth; fixed3 _Up; struct Input { float3 worldPos; float2 uv_MainTex; float2 uv_BumpMap; float a11; }; sampler2D _MainTex; sampler2D _BumpMap; void vert (inout appdata_full v, out Input o) { UNITY_INITIALIZE_OUTPUT(Input,o); o.a11 = length(cross(v.normal, _Up)); } void surf (Input IN, inout SurfaceOutput o) { float a1 = frac(IN.worldPos.y/_heightInterval) - 1 +_lineWidth* IN.a11/_heightInterval; if(a1>0){ o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb + _IsolinesColor.rgb; }else{ o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb; } o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap)); } ENDCG } Fallback "Diffuse" }
1 Comment
Leave a Reply
You must be logged in to post a comment.
Thanks a lot!