franciscochonge 发表于 2022-11-24 16:31

风格化树--树叶分析与实现

感谢:

《原神》卡渲效果逆向还原 【一、风格化树】

[原神风格渲染01]URP下的树木建模+Shader还原

UnityShader 基础(53)风格化植物与面片模型

风格化渲染<树>:分析还原

一些关于风格化树的学习总结

卡通风格树叶渲染方案

打算整个稻妻的神樱树

最吸引我的是那屏幕空间边缘光,因为写过人物渲染,我想可以直接用。

花瓣效果,我猜是序列帧动画+粒子?还没玩过粒子呢


这里有光线,不知道是不是这张帖图??


这张较为整体

樱树的插片法。观察发现由两种方法组成。



r通道


g通道

b通道

游戏中爬树可知树高二十米左右,因此设定插片一片为1mx1m。

制作模型

制作树叶模型

呃,哈哈懒得去speed tree因为有现成模型,树叶也是有脚本,随机生成一下好了。

测试:

完成:上图为游戏模型,下图为自己建的。拿到的模型好像都是正在顶点动画的模型,而且整个树叶都是一体,uv都是一团,所以得自己搞树叶。

修改树叶法线

添加法线编辑修改器

阴影看起来干净很多。


进入unity,先把贴图改成tga,b通道移到a通道

URP SimpleLit是这个效果。

进入shader

定义tags

基础半兰伯特:(已对面片去色)
v2f vert(a2v a)         {            //结构体初始化                v2f v = (v2f)0;                ZERO_INITIALIZE(v2f, v);                v.posCS = TransformObjectToHClip(a.vertex);                v.uv.xy = TRANSFORM_TEX(a.texcoord, _DiffTex).xy;                              v.posWS = TransformObjectToWorld(a.vertex).xyz;//世界 顶点                v.normWS = TransformObjectToWorldNormal(a.normalOS);//世界 法线                return v;         }         half4 frag(v2f v) : SV_Target         {               Light light = GetMainLight(TransformWorldToShadowCoord(v.posWS));               half3 normalWS = normalize(v.normWS);               half3 lightWS = normalize(light.direction);               half4 diffColor = SAMPLE_TEXTURE2D(_DiffTex, sampler_DiffTex, v.uv.xy);               clip(diffColor-_CutOff);               half3 albedo = diffColor.rgb * (dot(normalWS, lightWS) * 0.5 + 0.5);               half3 finalColor = lerp(albedo, light.color * albedo, _WorldLightInfluence).rgb;               return half4(finalColor, 1.0);         }
添加沿y轴的渐变


中间有些阴影比较丑。

shadowCaster,需要对阴影也进行clip

阴影效果

增加实时阴影

0.5

0.27

可见插片感较重,参考另一个文章待会修复。但是阴影是按插片来的啊,会不会奇怪。

这角度真不错啊,再高一点草地就秃了。。

增加经典高光,树其实没什么高光,建议不加。


接下来!SSS!

半角向量,我一直叫半程向量的说。没咋学过数学,今日才醍醐灌顶:就是随便俩向量加起来归一!就是俩向量中间的那个单位向量!完全理解了一切()

然后去看这个链接

Fast Subsurface Scattering in Unity (Part 2)

就这么个小公式嗷


好哩,啥也别说了,回去改法线去了。。。我甚至要为此学雕刻

我爱平滑,从前不知道有这种东西!!

zei回合理了吧!!

哎呀妈,太完美了,同材质下左侧为法线修正后。


我这颜色本来就浅,再加透射就不礼貌了,所以只给了很小一个值。等调参吧

屏幕空间深度边缘光:

切记要在片元里裁剪嗷
Pass      {            Name "Depth Rim"            Tags            {"LightMode" = "DepthOnly"}            ZWrite On            ColorMask 0            Cull Off            HLSLPROGRAM            // Required to compile gles 2.0 with standard srp library            #pragma vertex DepthOnlyVertex            #pragma fragment DepthOnlyFragment            #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"            struct Attributes            {                float4 position   : POSITION;                float2 texcoord   : TEXCOORD0;                UNITY_VERTEX_INPUT_INSTANCE_ID            };            struct Varyings            {                float2 uv         : TEXCOORD0;                float4 positionCS   : SV_POSITION;                UNITY_VERTEX_INPUT_INSTANCE_ID                UNITY_VERTEX_OUTPUT_STEREO            };            Varyings DepthOnlyVertex(Attributes input)            {                Varyings output = (Varyings)0;                UNITY_SETUP_INSTANCE_ID(input);                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);                output.uv = TRANSFORM_TEX(input.texcoord, _DiffTex);                output.positionCS = TransformObjectToHClip(input.position.xyz);                return output;            }            half4 DepthOnlyFragment(Varyings input) : SV_TARGET            {                UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);                //Alpha(SampleAlbedoAlpha(input.uv, TEXTURE2D_ARGS(_BaseMap, sampler_BaseMap)).a, _BaseColor, _Cutoff);                  half4 diffColor = SAMPLE_TEXTURE2D(_DiffTex, sampler_DiffTex, input.uv);                clip(diffColor-_CutOff);                return 0;            }            ENDHLSL}
别的深度图套餐自己加嗷,给个效果。


有那味了奥。

差个减弱插片化的修正,先睡觉去了(满足

加个bloom和tint

减弱插片化:

对每个面片而言,面对v,接近1,接近白色,垂直v,接近0,接近黑色。

但由于我们修改过法线让他等于包裹球体,因此无法获取每个面真正的法线……呈现出来就成了这样。

毁灭吧,来个美术吧,不想回blender了

blender里三种法线的区别(up名字放了,链接懒得放了)

ok,我放弃了。

1.模型原来的法线不见了,blender alt+n计算出来的不知道是啥法线,每算一次都不一样。。

2.本来想把算出来的法线存进顶点色,但就是成功不了,在unity论坛与两个群询问无果,决定烘焙成贴图。有兴趣的帮我看看:

why cant I show vertex color in unity

3.贴图烘焙完了,如1所说,效果莫名其妙





4.可能我还是不懂吧。。原来的模型再次ctrl j之后的法线图全紫了??哦凑,这玩意按uv采的,单个面片而言。。确实这样
嗯,突兀地结束了。人生还是要留一点疑问,留一些不完美(我在说什么)
接下来尝试树干。

补一个樱树捏

页: [1]
查看完整版本: 风格化树--树叶分析与实现