- Home /
How to make terrain partially transparent (lower opacity)
Hey all, I have been through a few tutorials on how to make terrain transparent, but the only information most give is the code for a shader. What do I do with the shader and how do I use it to make the terrain transparent? Thanks for any answers.
Answer by dan_wipf · Feb 24, 2019 at 08:25 AM
Wehave you read this here? https://answers.unity.com/questions/1162779/unity-5-transparent-terrain-shader.html it replaces the standard terrain shader
Edit
as mentioned in the above article, copy paste this in a new created shader file
Shader "Terrain/Transparency"
{
Properties {
[HideInInspector] _Control ("Control (RGBA)", 2D) = "red" {}
[HideInInspector] _Splat3 ("Layer 3 (A)", 2D) = "white" {}
[HideInInspector] _Splat2 ("Layer 2 (B)", 2D) = "white" {}
[HideInInspector] _Splat1 ("Layer 1 (G)", 2D) = "white" {}
[HideInInspector] _Splat0 ("Layer 0 (R)", 2D) = "white" {}
[HideInInspector] _Normal3 ("Normal 3 (A)", 2D) = "bump" {}
[HideInInspector] _Normal2 ("Normal 2 (B)", 2D) = "bump" {}
[HideInInspector] _Normal1 ("Normal 1 (G)", 2D) = "bump" {}
[HideInInspector] _Normal0 ("Normal 0 (R)", 2D) = "bump" {}
// used in fallback on old cards & base map
[HideInInspector] _MainTex ("BaseMap (RGB) Trans (A)", 2D) = "white" {}
[HideInInspector] _Color ("Main Color", Color) = (1,1,1,1)
}
CGINCLUDE
#pragma surface surf Lambert alpha vertex:SplatmapVert finalcolor:SplatmapFinalColor finalprepass:SplatmapFinalPrepass finalgbuffer:SplatmapFinalGBuffer
#pragma multi_compile_fog
#include "TerrainSplatmapCommon.cginc"
void surf(Input IN, inout SurfaceOutput o)
{
half4 splat_control;
half weight;
fixed4 mixedDiffuse;
SplatmapMix(IN, splat_control, weight, mixedDiffuse, o.Normal);
o.Albedo = mixedDiffuse.rgb;
o.Alpha = mixedDiffuse.a;
}
ENDCG
Category {
Tags {
"Queue" = "Transparent+1"
"RenderType" = "Transparent"
}
// TODO: Seems like "#pragma target 3.0 _TERRAIN_NORMAL_MAP" can't fallback correctly on less capable devices?
// Use two sub-shaders to simulate different features for different targets and still fallback correctly.
SubShader { // for sm3.0+ targets
CGPROGRAM
#pragma target 3.0
#pragma multi_compile __ _TERRAIN_NORMAL_MAP
ENDCG
}
SubShader { // for sm2.0 targets
CGPROGRAM
ENDCG
}
}
Dependency "AddPassShader" = "Hidden/TerrainEngine/Splatmap/Diffuse-AddPass"
Dependency "BaseMapShader" = "Diffuse"
Dependency "Details0" = "Hidden/TerrainEngine/Details/Vertexlit"
Dependency "Details1" = "Hidden/TerrainEngine/Details/WavingDoublePass"
Dependency "Details2" = "Hidden/TerrainEngine/Details/BillboardWavingDoublePass"
Dependency "Tree0" = "Hidden/TerrainEngine/BillboardTree"
Fallback "Diffuse"
}
create a new Material and asign this shader to it. under the Terrain Settings, you’re able to asign the material under the Setting: Material to the Terrain.
now to paint Transparency to your Terrain you need to have a Transparent Image, this you asign just as normal teztures to the Terrain. the Trick is now, that your other Textures don’t have a Alpha Channel, unless you want the texture to have Transparency!
If you don’t want to have Transparency om the Textures you need to delete the Alpha Channel in a 3d Party Programm like Photoshop, Gimp.
Hi thanks for the reply, I'm still not exactly sure how this is supposed to work? I created a new standard shader, deleted all of its default code and pasted all of the code from that link into it and saved it. What do I do then? when I go to paint a texture on the terrain it still shows up 100% opacity.
EDIT: Don't worry, I have figured out a workaround, all I needed to do was create a material with low opacity and change my terrains material to that. Thanks for the help anyways!