UnityShader地形系统Shader
依赖的shader
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"
vertex:SplatmapVert //修改地形的顶点信息
finalcolor:SplatmapFinalColor // 修改地形最后输出的颜色信息
decal:add //混合模式
在最终颜色中修改颜色分量,适应四季的变化
void SplatmapFinalColor(){
if(col.g-col.r>0.01){
col.rgb+=fixed3(1,0,0)*(col.g-col.r)* _GIndensity; //改写颜色分量
}
}
优化if语句
//秋天
col.rgb+=fixed3(1,0,0)*max(0,(col.g-col.r-0.01))* _GIndensity; //改写绿色颜色分量
col.rgb+=fixed3(1,0,0)*max(0,(col.g-0.1))* _RIndensity; //修改红色部分颜色分量
//冬天
//col.rgb+=fixed3(1,1,1) * max(0,(col.g-0.2)*_SnowIndensity;
//在某一个高度以上才有雪
col.rgb+=fixed3(1,1,1) * max(0,(col.g-0.2)*_SnowIndensity * max(0,IN.worldPos.y-1);
在finalColor和 surf 修改颜色有什么不一样
建议把颜色修改函数放到 surf 中, 然后再参与光照计算
如何修改草的颜色,渲染草的shader
"Hidden/TerrainEngine/Details/BillboardWavingDoublePass"
void surf (Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * IN.color;
c.rgb += fixed3(1, 0, 0)*max(0, c.g - 0.01); //改变草的颜色
//c.rgb = c.grb;
o.Albedo = c.rgb;
o.Alpha = c.a;
clip (o.Alpha - _Cutoff);
o.Alpha *= IN.color.a;
}
//TerrainEngine.cginc
void WavingGrassBillboardVert (inout appdata_full v)
{
TerrainBillboardGrass (v.vertex, v.tangent.xy);
// wave amount defined by the grass height
float waveAmount = v.tangent.y;
v.color = TerrainWaveGrass (v.vertex, waveAmount, v.color);
}
fixed4 TerrainWaveGrass (inout float4 vertex, float waveAmount, fixed4 color)
{
//修改草的顶点
float4 _waveXSize = float4(0.012, 0.02, 0.06, 0.024) * _WaveAndDistance.y;
float4 _waveZSize = float4 (0.006, .02, 0.02, 0.05) * _WaveAndDistance.y;
float4 waveSpeed = float4 (0.3, .5, .4, 1.2) * 4;
float4 _waveXmove = float4(0.012, 0.02, -0.06, 0.048) * 2;
float4 _waveZmove = float4 (0.006, .02, -0.02, 0.1);
float4 waves;
waves = vertex.x * _waveXSize;
waves += vertex.z * _waveZSize;
// Add in time to model them over time
waves += _WaveAndDistance.x * waveSpeed;
float4 s, c;
waves = frac (waves);
FastSinCos (waves, s,c);
s = s * s;
s = s * s;
float lighting = dot (s, normalize (float4 (1,1,.4,.2))) * .7;
s = s * waveAmount;
float3 waveMove = float3 (0,0,0);
waveMove.x = dot (s, _waveXmove);
waveMove.z = dot (s, _waveZmove);
vertex.xz -= waveMove.xz * _WaveAndDistance.z;
// apply color animation
// fix for dx11/etc warning
fixed3 waveColor = lerp (fixed3(0.5,0.5,0.5), _WavingTint.rgb, fixed3(lighting,lighting,lighting));
// Fade the grass out before detail distance.
// Saturate because Radeon HD drivers on OS X 10.4.10 don't saturate vertex colors properly.
float3 offset = vertex.xyz - _CameraPosition.xyz;
color.a = saturate (2 * (_WaveAndDistance.w - dot (offset, offset)) * _CameraPosition.w);
return fixed4(2 * waveColor * color.rgb, color.a);
}