S03 卡通草地渲染思路

本文介绍了卡通草地渲染的基本思路和实现细节,包括通过地面网格顶点生成随机方向的三角形,利用流向图模拟风吹效果,对三角形进行细分以形成草的形状,并添加阴影和光照。同时,分享了在实现过程中应用DRY原则简化代码和切线空间在构建坐标系中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

码上效果图:
在这里插入图片描述

官方教程链接:https://roystan.net/articles/grass-shader.html

个人能力有限,就不再班门弄斧了,下面简单介绍一下基本思路与个人经验总结,仅供学习参考_(:з」∠)_


1、基本思路

  1. 通过地面网格顶点生成三角形
  2. 调整三角形的方向随机
  3. 细分网格,调整草地疏密
  4. 利用流向图Flow Map)来添加风
  5. 对生成的三角形进行细分,使其能够弯曲成草的样子
  6. 添加阴影接收与阴影投射
  7. 加入光照

——————完成


2、代码展示

MyGrass.shader

Shader "MayoHa/MyGrass"
{
    Properties
    {
        _BottomColor("Bottom Color",Color) = (1,1,1,1)
        _TopColor("Top Color",Color) = (1,1,1,1)
        _BendRotationRandom("Bend Rotation Random",Range(0,1)) = 0.2
        _BladeWidth("Blade Width", Float) = 0.05
        _BladeWidthRandom("Blade Width Random", Float) = 0.02
        _BladeHeight("Blade Height", Float) = 0.5
        _BladeHeightRandom("Blade Height Random", Float) = 0.3
        _TessellationUniform("Tessellation Uniform",Range(1,64)) = 1
        _WindDistortionMap("Wind Distortion Map", 2D) = "white" {}
        _WindFrequency("Wind Frequency", Vector) = (0.05, 0.05, 0, 0)
        _WindStrength("Wind Strength", Float) = 1
        _BladeForward("Blade Forward Amount", Float) = 0.38
        _BladeCurve("Blade Curvature Amount", Range(1, 4)) = 2
        _TranslucentGain("Translucent Gain", Range(0,1)) = 0.5


    }

    CGINCLUDE

    #include "UnityCG.cginc"
    #include "Autolight.cginc"
    #include "CustomTessellation.cginc"

    #define BLADE_SEGMENTS 3
    

    fixed4 _BottomColor,_TopColor;
    half _BendRotationRandom;
    float _BladeHeight;
    float _BladeHeightRandom;	
    float _BladeWidth;
    float _BladeWidthRandom;
    sampler2D _WindDistortionMap;
    float4 _WindDistortionMap_ST;
    float2 _WindFrequency;
    float _WindStrength;
    float _BladeForward;
    float _BladeCurve;
    float _TranslucentGain;
    



    //to frag Shader
    struct geometryOutput{
        float4 pos : SV_POSITION;
        float2 uv : TEXCOORD0;
        float3 normal : NORMAL;
        unityShadowCoord4 _ShadowCoord : TEXCOORD1;


    };

    //DRY
    geometryOutput DRY(float3 pos,float2 uv,float3 localNormal){
        geometryOutput o;
        o.pos = UnityObjectTo
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值