- Home /
The question is answered, right answer was accepted
How can I overwrite the built-in grass shader?
I am trying to overwrite the built-in terrain grass shader so that I can edit it. I have imported the built-in grass shader to work off of, but my terrain seems to not be using the imported shader. No matter what I do with the shader, my grass still looks the same. I have no errors or warnings, and I have not renamed or changed the built-in shader that I downloaded.
(I am using Unity 5.3.1)
Thank you for your time, I would greatly appreciate any input.
This is the shader I downloaded (I am aware that non-billboarded grass uses a different shader, and my grass is set to billboard):
Shader "Hidden/TerrainEngine/Details/BillboardWavingDoublePass" {
Properties {
_WavingTint ("Fade Color", Color) = (.7,.6,.5, 0)
_MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
_WaveAndDistance ("Wave and distance", Vector) = (12, 3.6, 1, 1)
_Cutoff ("Cutoff", float) = 0.5
}
CGINCLUDE
#include "UnityCG.cginc"
#include "TerrainEngine.cginc"
struct v2f {
float4 pos : SV_POSITION;
fixed4 color : COLOR;
float4 uv : TEXCOORD0;
};
v2f BillboardVert (appdata_full v) {
v2f o;
WavingGrassBillboardVert (v);
o.color = v.color;
o.color.rgb *= ShadeVertexLights (v.vertex, v.normal);
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = v.texcoord;
return o;
}
ENDCG
SubShader {
Tags {
"Queue" = "Geometry+200"
"IgnoreProjector"="True"
"RenderType"="GrassBillboard"
"DisableBatching"="True"
}
Cull Off
LOD 200
ColorMask RGB
CGPROGRAM
#pragma surface surf Lambert vertex:WavingGrassBillboardVert addshadow exclude_path:deferred
sampler2D _MainTex;
fixed _Cutoff;
struct Input {
float2 uv_MainTex;
fixed4 color : COLOR;
};
void surf (Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * IN.color;
o.Albedo = c.rgb;
o.Alpha = c.a;
clip (o.Alpha - _Cutoff);
o.Alpha *= IN.color.a;
}
ENDCG
}
Fallback Off
}
Answer by phil_me_up · Mar 04, 2016 at 07:20 PM
EDIT: From the comments below: "I found that it needed to refresh the grass somehow. I noticed this because I painted some more grass then hit ctrl-z and my grass refreshed with the new shader."
OK, not sure what's going on here but here's what I did to test:
Made a basic terrain
Created a new 'grass' detail (billboard etc)
Painted it on to test. Everything is fine.
I then created a new shader file (I just called it "MyGrassShader")
Replaced the entire contents with what you provided above and everything was still fine
I then just added 'c.r =1.0'' on line 55 to force the r channel to 1
The detail changed to be more red.
If I make a deliberate mistake then I get errors in the console as you would expect
So, as far as I can see this all works and the only thing I've done different is to basically rename the file as "MyGrassShader".
To confirm, this was a completely new, empty project on unity 5.3.3f1
Not sure if that helps or not, but at least it's something!
Thanks for the answer. I tried playing with it some more and I found that it needed to refresh the grass somehow. I noticed this because I painted some more grass then hit ctrl-z and my grass refreshed with the new shader.
I accepted your answer...if you could edit it to specify that you may need to paint then undo to refresh your terrain I'd appreciate it and I'm sure others who see this later will appreciate it too ;)
Hi from future. Unity 2019.3, still confirmed has to paint detail and Ctrl+Z to refresh shader replacement, even restarting editor didn't help. :/