在 Substance Painter中实现Unity Standard Shader

这篇具有很好参考价值的文章主要介绍了在 Substance Painter中实现Unity Standard Shader。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

由于有需要在Substance Painter中显示什么样的效果,在Unity就要显示什么样的效果的需求,最近研究了几天,总算在Substance Painter中实现Unity standard的材质的渲染效果。具体效果如下:
在Unity中:
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图

Substance Painter中:
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
相识度能够达到百分之八九十吧。主要是Unity的项目使用的是Gamma颜色空间,还是有很大的出入,而且还不好修改。

这一篇不再讲基础的如何在Substance Painter中自定义Shader了,不了解的可以翻一翻我之前写的。

版本相关

Unity 2019.4.40 内置渲染管线 Gamma颜色空间
Substance Painter 9

痛点

  1. 阴影问题,在sp里面,阴影是取环境光里面最亮的点作为主光源位置,这个我的解决方案就是自己调,设置主光源朝向配置项,可以同步unity和sp里面的主光源朝向,那么自动生成的shadow也是一个方向的。
  2. 间接光源的镜面反射,其它文章里面也说这个问题了,大都没有很好的解决方案,我这里的解决方案是通过shader去实现动态Mipmap实现,作为调试最终效果时使用。

接下来梳理一下实现过程

模型朝向同步

两个软件使用的坐标系不同,unity是左手坐标系,而sp是右手坐标系,解决方案是,在unity里面在y轴旋转180度。
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图

保证天空球的位置正确

在unity里面,我专门搭建了一个测试环境,环境反射,直接设置了一张环境反射Cubemap
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
在sp里面,需要打开显示设置,然后设置背景贴图,背景曝光设置0,背景旋转设置为270,这样设置完,两个场景去采样环境全景图时,采样的位置是一致的。
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
贴图直接用的sp里面的,位置在项目文件夹下面
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图

相机同步

在unity里面使用默认的透视相机,Field of View 为60
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
在sp里面,视角设置60度,与unity相同,记得把后期特效关闭
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图

主光源同步

主光源同步我的思路是,在SP里面设置主光源参数,主光源参数需要一个旋转参数,主光源颜色,以及强度,主光源默认是方向光。
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
在SP里面,我们需要先在shader里面定义参数
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
显示效果
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
接下来比较重要的就是,在SP里面将主光源的旋转,修改为朝向,实现函数这里要感谢文心一言,它总算干了一件正事
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
由此获得主光源朝向。

定义一些Unity常量

要同步shader,需要将一些常量设置
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
SP是线性空间的,所以Standard里面一些Gamma相关的代码自动摒弃。
贴图直接使用内置的方法去获取
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
还有一些和Standard对应的参数
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
间接光漫反射的球谐光照参数,是直接写死在shader里面的
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
还有像在unity里面常用的一些函数,比如saturate和lerp,都直接定义出来
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图

从SP导出贴图设置

我的设置是导出四张贴图,以后需要再加,分别是Albedo贴图,Normal,Emissive,MRA
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
MRA贴图由三张贴图拼接而成,三个通道分别是Metallic,Roughness,AO

在unity里面,也重写了FragmentSetup函数,修改了里面一些逻辑
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
本来standard比较笨重,所以,我们可以将一些没必要的设置改掉,比如工作流我确定使用金属工作里,那就不需要判断了,直接使用金属工作流
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
在SP里面,直接使用内置库函数去获取贴图,思路直接按照standard的思路来即可。
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图

实现直接光照

直接光照在standard里面有多种方式,为了保证效果,我这里直接使用了效果最好,渲染最昂贵的双向表面分布函数实现,代码渲染逻辑没动,还是standard的哪一套
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
在SP里面,直接复制过来即可,除了一些没用的代码删除掉了,缺少什么函数,在unity复制过来改改就能用,glsl和cg区别不大。
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
最后,输出时,我只使用了内置diffuseShadingOutput函数输出渲染。
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
同样参数下,两个模型的渲染效果
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图

实现间接光漫反射

间接光漫反射都是直接使用SH球谐光照,我在SP里面是直接写死的参数,参数是在unityframedebug里面抄的
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
直接将它抄给SP
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
实现很简单,直接用standard的函数实现即可
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图

在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图

实现间接光镜面反射

间接光镜面反射是这里面最难实现的,主要还是mipmap的问题,如果粗糙度为0,也就是最光滑的平面的时候,可以看到,获取到的镜面反射的效果是一致的。
Unity Roughness=0
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
Substance Painter Roughness=0
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
如果Roughness加大,mipmap层级上去以后,区别就很明显了。
Unity Roughness=0.5
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
Substance Painter Roughness=0.5
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
造成这样的结果的原因是两个引擎内部的对Cubemap的mipmap采样造成的,看一下Roughness=1的结果,更加明显。
Unity Roughness= 1
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
Substance Painter Roughness=1
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
在这里,我还是先列一下实现方式,两个引擎都是通过采样环境反射球来实现的环境光的镜面反射。unity里面是通过Unity_GlossyEnvironment函数实现,支持两个Cubemap采样结果混合。
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
在Substance Painter里面,则是直接使用的SP内置的函数库 lib-env.glsl,里面有个方法envSample,传入方向和mipmap即可实现
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
粗糙度转Mipmap和Unity的也有所不同,这个代码抄至 nagnae blog

#define UNITY_SPECCUBE_LOD_STEPS_CUSTOM 6
real PerceptualRoughnessToMipmapLevel(real perceptualRoughness)
{
    half mip = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness);
	//mip = pow( mip, 0.53 );
	mip = pow( mip, 0.4 );
	//mip = pow( mip, 0.3 );
	mip *= 0.97;
	
	//float unity_environment_lod_count = float(unity_specularprobe_lod_count);

	#if 0
		 float mipmap_end = environment_max_lod - environment_mipmap_bias;
		 float mipmap_start = mipmap_end - UNITY_SPECCUBE_LOD_STEPS_CUSTOM;
	#elif 0	
		 float mipmap_start = max( 0, environment_max_lod - unity_environment_lod_count );
		 float mipmap_end = min( unity_environment_lod_count, mipmap_start + UNITY_SPECCUBE_LOD_STEPS_CUSTOM );
	#elif 0
		 float mipmap_start = 0;
		 float mipmap_scale = environment_max_lod / unity_environment_lod_count;
		 float mipmap_tail = ( unity_environment_lod_count - UNITY_SPECCUBE_LOD_STEPS_CUSTOM ) * mipmap_scale - 1;
		 float mipmap_end = min( environment_max_lod, environment_max_lod - mipmap_tail*1.2 );
	#elif 1
		 float mipmap_start = 0;
		 float mipmap_end = environment_max_lod - 1.5;
	#endif

	return mip * ( mipmap_end - mipmap_start ) + mipmap_start;
}

如果按照Substance Painter 默认的效果,结果是不理想的,环境反射越强烈,效果区别越明显,所以,我的解决方案,就是在shader里面进行一次mipmap,这是我在learnopengl学习的结果,地址:https://learnopengl.com/PBR/IBL/Specular-IBL,我实现的原理也是粗暴的进行多重采样
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
每个片元要进行1024次采样,这样性能很低,所以,我增加了一个配置项,可以进行一次采样,如果开启配置,实现多重采样,实现Unity内的那种顺滑的mipmap
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
在Roughness=0时,效果还是一致,这里不再展示。
Unity Roughness= 1
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
Substance Painter Roughness=1
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
可以看的出来,在Roughness为1时,颜色基本上相近了,只有高光范围还是有一些不同,那先这样,这也算一种解决方案。如果有更好的解决方案,欢迎小伙伴们告诉我。
Unity Roughness=0.5
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图

Substance Painter Roughness=0.5
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
最终,实现了所有的直接光漫反射,直接光镜面反射 和间接光漫反射 间接光镜面反射,我们最后按照Unity的standard将颜色合并到一起,就实现了对应的效果。
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图
Substance Painter Combie Roughness = 0.5 Metallic = 1
在 Substance Painter中实现Unity Standard Shader,unity,substance painter,unity,贴图文章来源地址https://www.toymoban.com/news/detail-715717.html

到了这里,关于在 Substance Painter中实现Unity Standard Shader的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在 ZBrush、Substance 3D Painter 和 UE5 中创作警探角色(P2)

    大家好,下篇分享咱们继续来说警探角色的重新拓扑、UV、材质贴图和渲染处理。 这是对我来说最不有趣的部分——重新拓扑。它显然是实时角色中非常重要的一部分,不容忽视,因为它会影响大量的 UV、绑定和后期渲染,这里没有真正的捷径,我只是在 Maya 中导入了装备的

    2024年02月09日
    浏览(53)
  • 在 ZBrush、Substance 3D Painter 和 UE5 中创作警探角色(P1)

    小伙伴们大家好,今天瑞云渲染小编给大家分享的是自由CG艺术家Jean Zoudi创建《极乐迪斯科》的警探角色的项目花絮,会解释身体和服装的建模方式,分享角色发型和面部毛发背后的工作流程,也会详细介绍渲染过程。 大家好,我叫 Jean Zoudi,法国人,是一名从事游戏行业的

    2024年02月09日
    浏览(55)
  • Unity中Shader的Standard材质解析(二)

    Unity中Shader的Standard材质解析(二),对 Standard 的 PBR 的 GI 进行解析 Unity中Shader的Standard材质解析(一) #include “CGInclude/MyPhysicallyBasedRendering.cginc” 整理 LightingStandard_GI1(o, giInput, gi); 中的数据 Unity_GlossyEnvironmentData表示GI中的反射准备数据 准备好反射数据后,计算得出GI中的

    2024年02月04日
    浏览(38)
  • Unity中Shader观察空间推导(在Shader中实现)

    在上篇文章中,我们是实现了Shader中的观察空间推导。 Unity中Shader观察空间推导 我们在这篇文章中,根据上篇文章的推导,在Shader中实现观察空间矩阵的推导。 P view = [W view ] * P world P view = [V world ] -1 * P world P view = [V world ] T * P world 在属性面板定义测试使用到的 摄像机坐标

    2024年01月24日
    浏览(38)
  • Unity中Shader裁剪空间推导(在Shader中实现)

    我们在上一篇文章中,进行了正交相机视图空间下转化到裁剪空间下的矩阵推导。 Unity中Shader裁剪空间推导(正交相机到裁剪空间的转化矩阵) 我们在这篇文章中,在Unity的Shader中实现一下。 OpenGL下: [ 2 w 0 0 0 0 2 h 0 0 0 0 2 n − f n + f n − f 0 0 0 1 ] begin{bmatrix} frac{2}{w} 0 0 0

    2024年02月03日
    浏览(40)
  • 【Unity大气渲染】Unity Shader中实现大气散射(半成品)

    写在前面 这是之前在做天空盒的时候同步写的分析博客,结果后面写到一半就忘了继续了,这里先贴出当时写的半成品,有小伙伴问我怎么做的,这里只能尽力把之前的半成品先放出来了(写得很乱,勿怪orz),,后面有机会会完善好的!希望能帮到大家~ 前置知识学习 【

    2024年02月08日
    浏览(49)
  • 使用 ZBrush 和 Substance 3D中创建逼真的露西(p2)

    今天瑞云渲染小编给带来了Rafael Benedicto 分享的 Lucy 项目背后工作流程,解释了头发是如何设置的,并回顾了在 Substance 3D Painter 中完成的纹理化过程。篇幅较长,分上下两篇来阐述幕后花絮。接下来接着讲述Lucy项目的纹理和渲染方面内容。 如果你熟悉赛博朋克,你就知道这

    2024年02月11日
    浏览(50)
  • 在 Maya、ZBrush 和 Substance 3D 中创建女枪手(P2)

    今天瑞云渲染小编给大家带来了Ivan Lim 的Female Gunslinger 项目的细目,讨论了他在 Think Tank 的教育过程,并解释了他为什么选择虚幻引擎来呈现这个角色。这篇接着上篇继续拓扑UV、灯光材质、渲染等方面的分享 我开始用一个块来处理头发,看看它在高多边形头上的样子。然后

    2024年02月12日
    浏览(50)
  • Adobe的3D材质扫描和重建工具Substance 3D Sampler 4.2.2版本下载与安装配置

    Adobe Substance 3D Sampler 是Adobe Substance Suite的一个组成部分,是一款功能强大的材质扫描和重建工具。它可以帮助用户从现实世界中捕捉物体并将其转化为高质量的数字材质。该工具提供了先进的算法和工作流程,使用户能够轻松创建逼真的材质,并在三维项目中使用。 注:文末

    2024年02月02日
    浏览(78)
  • Unity找不到标准资源包standard assets的真正解决方案

    Unity小白一枚,刚刚开始学习。遇到一些问题,感觉在网上搜索到的内容没有帮助,所以写出来希望能帮到大家。 很多Unity的入门教程,都提到了标准资源包standard assets,长这样。  但是我首先在电脑上找不到,然后网上查文章,根据文章提供的二个方法,也没有解决(笨)

    2024年02月02日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包