tajourney tajourney
  • 首页
  • 渲染
    • PBR
    • NPR
  • 引擎
    • Unity
    • UE
  • DCC
    • Houdini
    • PhotoShop
    • Blender
  • 优化
  • 工具
  • 杂谈
    • 游戏
  • 友链
  • 关于
    • About Me
    • 网站公告
    • 维护记录
    • QA
  • 注册
  • 登录
首页 › 渲染 › PBR › Unity PBR轮子(1)SimpleLit

Unity PBR轮子(1)SimpleLit

糯米
2年前PBR阅读 1,842

本文是为了方便讲解PBR过程中的一些问题造的一个轮子,加深理解,毕竟实践才是最好的。

首页也给了github链接。

首先我们先构建类似URP一样自己的customLitData,用于在Fragment中渲染光照

    CustomLitData customLitData;
    InitializeCustomLitData(input,customLitData);

    CustomSurfacedata customSurfaceData;
    InitializeCustomSurfaceData(input,customSurfaceData);

在customLitData中,我们需要得到V、T、B、N相关的信息,用于后面的Vector等相关计算ScreenUV用于SSAO计算,不加也没关系,毕竟这只是一个simpleLit。

    customLitData.positionWS = input.positionWS;
    customLitData.V = GetWorldSpaceNormalizeViewDir(input.positionWS);
    customLitData.N = normalize(input.normalWS);
    customLitData.T = normalize(input.tangentWS.xyz);
    customLitData.B = normalize(cross(customLitData.N,customLitData.T) * input.tangentWS.w);    
    customLitData.ScreenUV = GetNormalizedScreenSpaceUV(input.positionCS);

在customSurfaceData,我们需要处理albedo、alpha、roughness、normal等信息,用于后面处理光照。

处理完各类信息后,我们需要计算光照:

albedo:

Unity PBR轮子(1)SimpleLit-tajourney

specular:

customSurfaceData.specular = lerp(float3(0.04,0.04,0.04),albedo,customSurfaceData.metallic);

roughness:

customSurfaceData.roughness = max(customSurfaceData.roughness,0.001f);

如果我们在URP中开启了SSAO,我们还要把这部分添加上

 #if defined(_SCREEN_SPACE_OCCLUSION)
   AmbientOcclusionFactor aoFactor = GetScreenSpaceAmbientOcclusion(customLitData.ScreenUV);
   customSurfaceData.occlusion = min(customSurfaceData.occlusion,aoFactor.indirectAmbientOcclusion);
 #endif

然后计算直接光照:

Unity PBR轮子(1)SimpleLit-tajourney

对应的BRDF,这部分我借鉴的UE5中的实现:

Diffuse:用lambert:

return DiffuseColor * (1 / PI);

D项,用UE5的GGX(大家可自行对比下Unity的GGX):

Unity PBR轮子(1)SimpleLit-tajourney

Unity URP GGX(实际上和UE5一样,但是比较繁琐):

Unity PBR轮子(1)SimpleLit-tajourney

V项:

    float Vis_Implicit()
    {
        return 0.25;
    }

F项:

    float3 F_None( float3 SpecularColor )
    {
        return SpecularColor;
    }

Specular:

float3 specularTerm = ((D * Vis) * F) * NoL * lightColor * shadow;
Unity PBR轮子(1)SimpleLit-tajourney
上:Unity的simpleLit,下:Custom SimpleLit

添加对点光源的支持:

Unity PBR轮子(1)SimpleLit-tajourney
Unity PBR轮子(1)SimpleLit-tajourney

对于移动端,URP提供了一个特别版本的D、V、F,移动端也可以采用这套拟合后的方案

Unity PBR轮子(1)SimpleLit-tajourney

由于这套SimpleLit方案漫反射采用了lambert(lambert无光的地方就是一片死黑),没有考虑间接光,所以和URP的效果肯定不一样。下一章写StandardLit,会重点讲一下间接光该如何写。

赞(6)
搜索
近期文章
  • 终末地人物渲染(更新中) 2025年3月17日
  • Unity APV体素化光栅化实现 2025年2月5日
  • Unity 不同 ReflectionProbe 打断 Instancing 解决方案 2025年1月15日
  • Renderdoc 原神截帧记录 2024年8月22日
  • Houdini VAT:Vellum Cltoh笔记 2 2024年7月17日
归档
  • 2025年3月 (1)
  • 2025年2月 (1)
  • 2025年1月 (1)
  • 2024年8月 (1)
  • 2024年7月 (2)
  • 2024年1月 (1)
  • 2023年10月 (3)
  • 2023年9月 (4)
  • 2023年8月 (5)
  • 2023年7月 (4)
  • 2023年6月 (4)
  • 2023年5月 (1)
  • 2023年4月 (3)
  • 2023年3月 (11)
  • 2023年2月 (11)
  • 2023年1月 (1)
  • 2022年7月 (1)
  • 2022年6月 (2)
  • 2022年5月 (1)
  • 2022年4月 (1)
  • 2022年3月 (1)
  • 2022年2月 (1)
  • 2022年1月 (7)
  • 6
Copyright © 2022-2025 tajourney. Dev by nuomi 版权所有.
鲁ICP备19015245号
  • 首页
  • 渲染
    • PBR
    • NPR
  • 引擎
    • Unity
    • UE
  • DCC
    • Houdini
    • PhotoShop
    • Blender
  • 优化
  • 工具
  • 杂谈
    • 游戏
  • 友链
  • 关于
    • About Me
    • 网站公告
    • 维护记录
    • QA
糯米
日语学习中
68
文章
15
评论
44
喜欢