风格化树--树叶分析与实现
感谢:《原神》卡渲效果逆向还原 【一、风格化树】
[原神风格渲染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]