UnityShader地形系统Shader

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值