首页 > 其他分享 >unity urp 实现衣服上面片的效果

unity urp 实现衣服上面片的效果

时间:2023-01-30 17:02:52浏览次数:40  
标签:NoL NoH 衣服 float half3 unity urp 亮片 float3


在看模特秀的时候,有时候身上会有那种布灵布灵的面片效果。下面两张是我在丝绸的时装秀里面截取的两张模糊图,凑合看一下吧。

unity urp 实现衣服上面片的效果_泰森多边形

unity urp 实现衣服上面片的效果_#ifdef_02


如果需要在渲染里面去实现这种效果,该如何实现呢。

当然用我上一篇说到的泰森多边形了

​我们可以使用其进行noise扰动,实现面片分离的效果,然后再使用其的id的值转换成为法向,相同片的法向相同,但由于id不同,每个片生成的法向的朝向也不相同,然后用这个法向去做高光效果,你就会得到一个亮片一个亮片的效果。


就比如这种效果,心动了吗,那么,接下来进入实战。

首先,就是用voronoi生成法向。

//亮片
float2 idvoronoi = 0;
float2 uvvoronoi = 0;
voronoi(input.uv * _FlakesScale, _FlakesAngle, idvoronoi, uvvoronoi, 0);
half3 voronoiNormal = half3(idvoronoi * _FlakesRange, 1.0); //使用voronoi函数生成的id作为扰动法向的xy
half3 noiseNormalWS = TransformTangentToWorld(voronoiNormal, tangentToWorld); //转换到世界空间坐标系下面
noiseNormalWS = NormalizeNormalPerPixel(noiseNormalWS);

如果需要voronoi函数,去上一篇去拿即可。

我们还需要一个亮片的颜色,在这里,我们刚好可以使用voronoi生成的uv去随便拾取一张多颜色亮片,然后和一个颜色相乘,还可以控制强度,相乘的颜色如果为0,那么亮片将不显示。

half3 flakesBaseColor = _FlakesColor * SAMPLE_TEXTURE2D(_FlakesMap, sampler_FlakesMap, uvvoronoi).rgb;

接下来就是重头戏了,数据都完成了,需要生成亮片的函数了:

half3 flakesColor = FlakesSpecular(_FlakesRoughness1, _FlakesRoughness2, _FlakesRoughnessMix, flakesBaseColor, positionWS, noiseNormalWS, viewDirWS, shadowCoord, shadowMask);

这里用了两个粗糙度,然后进行混合出来的,给亮片增加了过渡的效果。计算出来的结果和最终颜色相加即可。

接下来,将函数的实现代码粘贴出来,就是主光源和附加光源进行亮片计算即可。

//实现双层的GGX,这个专门是亮片使用的,F项就不需要根据视角进行过渡的效果了
float3 DualSpecularGGXFlakes(float Lobe0Roughness, float Lobe1Roughness, float LobeMix, float3 SpecularColor, float NoH, float NoV, float NoL)
{
float Lobe0Alpha2 = Pow4(Lobe0Roughness);
float Lobe1Alpha2 = Pow4(Lobe1Roughness);
float AverageAlpha2 = Pow4((Lobe0Roughness + Lobe1Roughness) * 0.5);

// Generalized microfacet specular
float D = lerp(D_GGX_UE4(Lobe0Alpha2, NoH), D_GGX_UE4(Lobe1Alpha2, NoH), 1.0 - LobeMix);
float Vis = Vis_SmithJointApprox(AverageAlpha2, NoV, NoL);
float3 F = SpecularColor;

return(D * Vis) * F;
}

//亮片的实现函数
float3 FlakesSpecular(float Lobe0Roughness, float Lobe1Roughness, float LobeMix, float3 SpecularColor, float3 WorldPos,
float3 N, float3 V, float4 shadowCoord, float4 shadowMask)
{
//主光源
half3 DirectLighting_MainLight = half3(0, 0, 0);
{
Light mainLight = GetMainLight(shadowCoord, WorldPos, shadowMask);
half3 L = mainLight.direction;
half3 LightColor = mainLight.color;
half Shadow = mainLight.shadowAttenuation;

float3 H = normalize(L + V);
float NoH = saturate(dot(N, H));
float NoV = saturate(abs(dot(N, V)) + 1e-5);
float NoL = saturate(dot(N, L));

float3 Radiance = NoL * LightColor * Shadow * PI;
DirectLighting_MainLight = DualSpecularGGXFlakes(Lobe0Roughness, Lobe1Roughness, LobeMix, SpecularColor, NoH, NoV, NoL) * Radiance;
}
//附加光源
half3 DirectLighting_AddLight = half3(0, 0, 0);
#ifdef _ADDITIONAL_LIGHTS
uint pixelLightCount = GetAdditionalLightsCount();
for (uint lightIndex = 0; lightIndex < pixelLightCount; ++lightIndex)
{
Light light = GetAdditionalLight(lightIndex, WorldPos, shadowMask);
half3 L = light.direction;
half3 LightColor = light.color;
half Shadow = light.shadowAttenuation * light.distanceAttenuation;

float3 H = normalize(L + V);
float NoH = saturate(dot(N, H));
float NoV = saturate(abs(dot(N, V)) + 1e-5);
float NoL = saturate(dot(N, L));

float3 Radiance = NoL * LightColor * Shadow * PI;
DirectLighting_AddLight += DualSpecularGGXFlakes(Lobe0Roughness, Lobe1Roughness, LobeMix, SpecularColor, NoH, NoV, NoL) * Radiance;
}
#endif

return DirectLighting_MainLight + DirectLighting_AddLight;

}


标签:NoL,NoH,衣服,float,half3,unity,urp,亮片,float3
From: https://blog.51cto.com/u_15948039/6027348

相关文章

  • 在unity 2020 urp版本中实现 LensFlare功能
    这个官方里面没有支持,只能自己去解决。效果请查看地址:https://www.bilibili.com/video/BV1w24y1o7pY/下面说一下我的实现过程。找来找去,我找到了一篇不错的解决方案,还带源......
  • unity中实现ue眼球的渲染
    此图取至ue官方网站在shader里面我们还是需要使用英文,中英文对照:巩膜:sclera角膜缘:limbus虹膜:iris瞳孔:pupil角膜:cornea渲染效果。模型方面:使用一个突出的眼球模型来......
  • Unity 热更新方案
    一、Lua:内置一个Lua虚拟机。典型的框架有xLua,uLua。 二、ILRuntime:内置一个.net字节码解释器,解释执行.net字节码。三、puerts:内置一个JavaScript/TypeScrip......
  • The GPG keys listed for the "MySQL 5.7 Community Server" repository are already
    报错TheGPGkeyslistedforthe"MySQL5.7CommunityServer"repositoryarealreadyinstalledbuttheyarenotcorrectforthispackage.Checkthatthecorrec......
  • 关于blender导入到unity……
    我快被该死的左右手坐标轴搞疯了,于是做了个实验:我在blender里建了个箭头,让箭头朝向z轴,再在y轴正方向上写了个y,x轴正方向写了个x,然后ctrl+a应用全部。然后直接以blender文......
  • 2023 Cisco Designated VIP Program for Cisco Community
    从接触网络技术到现在,已将近10年的时间。岁月如斯,不知有多少技术大神,多少前辈在技术这条路上披星戴月。做技术容易,做好技术不容易!最开始接触网络技术,就是从Cisco开始的,最......
  • Unity中的网络同步解决方案
    网络同步的解决方案有三种:状态同步、帧同步、实时广播同步,实际使用中可以混合使用。网络同步概览知名游戏中的同步方案类型游戏名同步方案MMORPG魔兽世界状态同步+实时广播......
  • burpsuite抓https包的必要准备
    https的原理首先了解什么是https: HTTPS全称为HypertextTransferProtocolSecure,相当于是http协议的安全版本,跟http相比增加了加密这一环节 百度百科 https的具体......
  • VScode中调试Unity【Debugger for Unity】
    我遇到的情况:在点击运行和调试时,出现中间栏让你选择调试器,我点击UnityDebugger没反应。单击创建Launch文件也无效,没有UnityDebugger的选项删除.vscode/launch.json如......
  • Unity2D: 重新加载场景后场景暂停
    SceneManager.LoadSceneAsync(01);所有动画、脚本停止运行,改变timeScale没有用Time.timeScale=1;解决办法:SceneManager.LoadSceneAsync(01,LoadSceneMode.Single......