当前位置: 首页 > news >正文

在 Substance Painter中实现Unity Standard Shader

由于有需要在Substance Painter中显示什么样的效果,在Unity就要显示什么样的效果的需求,最近研究了几天,总算在Substance Painter中实现Unity standard的材质的渲染效果。具体效果如下:
在Unity中:
在这里插入图片描述

Substance Painter中:
在这里插入图片描述
相识度能够达到百分之八九十吧。主要是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度。
在这里插入图片描述

保证天空球的位置正确

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

相机同步

在unity里面使用默认的透视相机,Field of View 为60
在这里插入图片描述
在sp里面,视角设置60度,与unity相同,记得把后期特效关闭
在这里插入图片描述

主光源同步

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

定义一些Unity常量

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

从SP导出贴图设置

我的设置是导出四张贴图,以后需要再加,分别是Albedo贴图,Normal,Emissive,MRA
在这里插入图片描述
MRA贴图由三张贴图拼接而成,三个通道分别是Metallic,Roughness,AO

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

实现直接光照

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

实现间接光漫反射

间接光漫反射都是直接使用SH球谐光照,我在SP里面是直接写死的参数,参数是在unityframedebug里面抄的
在这里插入图片描述
直接将它抄给SP
在这里插入图片描述
实现很简单,直接用standard的函数实现即可
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

实现间接光镜面反射

间接光镜面反射是这里面最难实现的,主要还是mipmap的问题,如果粗糙度为0,也就是最光滑的平面的时候,可以看到,获取到的镜面反射的效果是一致的。
Unity Roughness=0
在这里插入图片描述
Substance Painter Roughness=0
在这里插入图片描述
如果Roughness加大,mipmap层级上去以后,区别就很明显了。
Unity Roughness=0.5
在这里插入图片描述
Substance Painter Roughness=0.5
在这里插入图片描述
造成这样的结果的原因是两个引擎内部的对Cubemap的mipmap采样造成的,看一下Roughness=1的结果,更加明显。
Unity Roughness= 1
在这里插入图片描述
Substance Painter Roughness=1
在这里插入图片描述
在这里,我还是先列一下实现方式,两个引擎都是通过采样环境反射球来实现的环境光的镜面反射。unity里面是通过Unity_GlossyEnvironment函数实现,支持两个Cubemap采样结果混合。
在这里插入图片描述
在Substance Painter里面,则是直接使用的SP内置的函数库 lib-env.glsl,里面有个方法envSample,传入方向和mipmap即可实现
在这里插入图片描述
在这里插入图片描述
粗糙度转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 0float 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 0float 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 1float mipmap_start = 0;float mipmap_end = environment_max_lod - 1.5;#endifreturn mip * ( mipmap_end - mipmap_start ) + mipmap_start;
}

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

Substance Painter Roughness=0.5
在这里插入图片描述
最终,实现了所有的直接光漫反射,直接光镜面反射 和间接光漫反射 间接光镜面反射,我们最后按照Unity的standard将颜色合并到一起,就实现了对应的效果。
在这里插入图片描述
Substance Painter Combie Roughness = 0.5 Metallic = 1
在这里插入图片描述

相关文章:

在 Substance Painter中实现Unity Standard Shader

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

第二证券:个人开证券账户要开户费吗?

随着互联网和移动端东西的遍及,越来越多的人开端涉足股票投资,开立证券账户也成为一个热门话题。但是,许多初学者或许会有疑问,个人开证券账户是否需求支付开户费呢?这个问题的答案并不是那么简略,需求考虑…...

大厂面试-16道面试题

1 java集合类有哪些? List是有序的Collection,使用此接口能够精确的控制每个元素的插入位置,用户能根据索引访问List中元素。常用的实现List的类有LinkedList,ArrayList,Vector,Stack。 ArrayList是容量…...

搭建GraphQL服务

js版 GraphQL在 NodeJS 服务端中使用最多 安装graphql-yoga: npm install graphql-yoga 新建index.js: const {GraphQLServer} require("graphql-yoga")const server new GraphQLServer({ typeDefs: type Query { hello(name:String):String! …...

数据仓库介绍及应用场景

数据仓库(Data Warehouse)是一个用于存储、管理、检索和分析大量结构化数据的集中式数据库系统。与传统的事务处理数据库不同,数据仓库是为了支持决策支持系统(Decision Support Systems, DSS)和业务智能(B…...

代码随想录算法训练营Day56 | 动态规划(16/17) LeetCode 583. 两个字符串的删除操作 72. 编辑距离

动态规划马上来到尾声了,当时还觉得动态规划内容很多,但是也这么过来了。 第一题 583. Delete Operation for Two Strings Given two strings word1 and word2, return the minimum number of steps required to make word1 and word2 the same. In on…...

HTML+CSS+JavaScript 大学生网页设计制作作业实例代码 200套静态响应式前端网页模板(全网最全,建议收藏)

目录 1.介绍2.这样的响应式页面这里有200套不同风格的 1.介绍 资源链接 📚web前端期末大作业 (200套) 集合 Web前端期末大作业通常是一个综合性的项目,旨在检验学生在HTML、CSS和JavaScript等前端技术方面的能力和理解。以下是一些可能的Web前端期末大…...

CFimagehost私人图床本地部署结合cpolar内网穿透实现公网访问

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测…...

uniapp瀑布流布局写法

首先我们要清楚瀑布流是什么? 瀑布流布局(Waterfall Flow Layout),也称为瀑布流式布局,是一种常见的网页或移动应用布局方式,特点是元素以不规则的方式排列,就像瀑布中的流水一样,每…...

蓝桥杯 题库 简单 每日十题 day8

01 扫雷 题目描述 在一个n行列的方格图上有一些位置有地雷,另外一些位置为空。 请为每个空位置标一个整数,表示周围八个相邻的方格中有多少个地雷。 输入描述 输入的第一行包含两个整数n,m。 第2行到第n1行每行包含m个整数,相邻整…...

Keepalived 高可用(附带配置实例,联动Nginx和LVS)

Keepalived 一、Keepalived相关知识点概述1.1 单服务的风险(单点故障问题)1.2 一个合格的集群应该具备的特性1.3 VRRP虚拟路由冗余协议1.4 健康检查1.5 ”脑裂“现象 二、Keepalived2.1 Keepalived是什么?2.2 Keepalived体系主要模块及其作用…...

第二证券:今年来港股回购金额超700亿港元 9月近200家公司获增持

本年以来,港股上市公司回购力度不断增强。据恒生指数公司计算,到9月15日,本年以来港股回购金额到达735亿港元,占去年全年总额的70%。该公司预测,2023年港股回购金额可能到达929亿港元,是前5年年度平均水平的…...

Autosar基础——RTE简介

AutoSAR文章目录 AUTomotive Open System Architecture Autosar-简介和历史发展 Autosar-软件架构 Autosar软件组件-Application Layer介绍和SWC(Software Component)类型 Autosar-Runnables(可运行实体) Autosar-OS配置 Autosar IOC机制(核间通信) Autosar实践-CANTp Auto…...

几个国内可用的强大的GPT工具

前言: 人工智能发布至今,过去了九个多月,已经成为了我们不管是工作还是生活中一个重要的辅助工具,大大提升了效率,作为一个人工智能的自然语言处理工具,它给各大行业的提供了一个巨大的生产工具&#xff0c…...

《Python等级考试(1~6级)历届真题解析》专栏总目录

❤️ 专栏名称:《Python等级考试(1~6级)历届真题解析》 🌸 专栏介绍:中国电子学会《全国青少年软件编程等级考试》Python编程(1~6级)历届真题解析。 🚀 订阅专栏:订阅后可…...

在IntelliJ IDEA 中安装阿里P3C以及使用指南

在IntelliJ IDEA 中安装阿里P3C以及使用指南 1.关于阿里p3c1.1说明1.2什么是P3C插件1.3p3c的作用是什么 2 如何在IDEA中安装p3c2.1 插件安装2.2 插件使用 3.参考连接 1.关于阿里p3c 1.1说明 代码规范检查插件P3C,是根据《阿里巴巴java开发手册(黄山版)》转化而成的…...

Java集成支付宝沙箱支付,详细教程(SpringBoot完整版)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、开发前准备?二、使用步骤1、引入库2、配置在 application.yml 里面进行配置:3、alipay的java配置:AplipayConfig.java4、支付…...

详解Nacos和Eureka的区别

文章目录 Eureka是什么Nacos是什么Nacos的实现原理 Nacos和Eureka的区别CAP理论连接方式服务异常剔除操作实例方式自我保护机制 Eureka是什么 Eureka 是Spring Cloud 微服务框架默认的也是推荐的服务注册中心, 由Netflix公司与2012将其开源出来,Eureka基于REST服务开发,主要用…...

在Vue中实现组件间的通信(父子通信,非父子通信,通用通信)

在vue中实现组件间的通信 文章目录 在vue中实现组件间的通信1、组件通信1.1、不同的组件关系和组件通信方案分类1.2、组件通信的解决方案1.3、非父子通信- event bus事件总线 2、prop2.1、prop详解2.2、prop校验2.3、prop & data、单向数据流 3、v-mdoel原理 1、组件通信 …...

LLaMA参数微调方法

1.Adapter Tuning:嵌入在transformer中 新增了一个名为adapter的结构,其核心思想是保持模型其他原始参数不变,只改变adapter的参数,其结构如下图所示: 1.在每一个transformer模块最后都加入一层adapter。 2.adapter首…...

NSSCTF之Misc篇刷题记录(17)

NSSCTF之Misc篇刷题记录(17) [闽盾杯 2021]DNS协议分析[GFCTF 2021]pikapikapika NSSCTF平台:https://www.nssctf.cn/ PS:所有FLAG改为NSSCTF [闽盾杯 2021]DNS协议分析 数据包提示给得是DNS数据包 直接过滤一下 发现 数据里面存…...

红与黑(bfs + dfs 解法)(算法图论基础入门)

红与黑问题 文章目录 红与黑问题前言问题描述bfs 解法dfs 解法 前言 献给阿尔吉侬的花束( 入门级bfs查找 模版解读 错误示范 在之前的博客当中,详细地介绍了这类题目的解法,今天为大家带来一道类似的题目练练手,后续还会更新更有挑战的题目…...

为何学linux及用处

目前企业使用的操作系统无非就是国产类的,windows和linux类。我们要提升自己的技能,需要学习这两款。我记得在大学时期,学习过windows以及linux,但当时觉得又不常用,就学的模棱两可。毕业之后,你会发现&…...

ChatGPT高级数据分析功能

目录 只需上传数据集,系统即可自动进行分析。我们首先进行了一次测试。准备了一份关于二手车的数据,其格式如下: 接下来调用,GPT中的高级数据分析功能,上传数据,并要求进行分析 第一步:自动对数据字段进行详细的解释: 第二步,对数据进行预处理,比如缺失值,基本的…...

共享WiFi贴项目怎么实施与运营,微火为你提供高效解答!

共享WiFi贴是一项有前景的商业项目,不仅可以满足用户对网络的需求,还可以为创业者带来盈利的机会。那么,我们来看看如何有效地开展共享WiFi贴项目。 最重要的是选择合适的位置。共享WiFi贴项目的成功与否很大程度上取决于位置选择。优先选择人…...

计算机组成原理——基础入门总结(二)

上一期的路径:基础入门总结(一) 目录 一.输入输出系统和IO控制方式 二.存储系统的基本概念 三.cache的基本概念和原理 四.CPU的功能和基本结构 五.总线概述 一.输入输出系统和IO控制方式 IO设备又可以被统一称为外部设备~ IO接口&…...

腾讯mini项目-【指标监控服务重构】2023-08-06

今日已办 feature/client_traces_profile 修改 consumer 4个阶段的 spankind将 profile 的 span 作为 root span,保持与 venus 的 follows from 的 link feature/profile-otelclient-metric 将 metric 部分使用新分支 push go.opentelemetry.io/otel/propagatio…...

ruoyi菜单折叠,菜单收缩

问题描述 VUE菜单有一个BUG,当我们点击其它按钮或者首页的时候,已经展示的一级菜单是不会自动收缩的。这个问题也导致很多开发者把一级菜单都换成了二级菜单。 错误展示 错误的效果请看下图。 解决方法 1、寻找菜单文件 因为我使用的是ruoyi的前端框…...

Linux 用户和用户组

Linux中关于权限的管控级别有2个级别,分别是: 针对用户的权限控制 针对用户组的权限控制 比如,针对某文件,可以控制用户的权限,也可以控制用户组的权限。 1、用户组管理 1.1、创建用户组 groupadd 用户组名 1.2、删除用户组 groupdel 用户…...

JavaBean文字格斗游戏(面向对象编程)的个人重写以及个人解释

题目和个人思路: 先写role类(对象)和构造方法(要按照标准的JavaBean来写) 根据题意,类中要有一个行为(方法)->攻击 开始进入main中, 首先当然是要创建两个对象,然后调用(攻击)attack方法 以上都是个人经过学习后重新又写的代码. 望各位指出不足....

网站跳转站代码/baidu百度

作为一个专业玩越狱的能手,配置一些有用的工具和插件那是必不可少的。所以,这篇文章主要介绍安装一下安装和使用一些插件。打开你的越狱手机,映射端口,连接手机,如果有疑问,请查看我的文章:iOS逆…...

设计网站做的工作步骤是/2345纯净版推广包

【摘要】 计算机应用基础课是每所院校必须开设的一门强调实践性的基础课程,对其设计科学合理的考核模式,才能够真正的反应学生在计算机基础理论和基本操作技能上的真实能力和水平。对此进行了理论探讨,并设计了相应的考核模式及其组成。【关键词】 计算机应用基础;考核模式;上机…...

wordpress 过滤图片/seo网站优化是什么

Written with StackEdit. Description 一家餐厅有 \(n\) 道菜,编号 \(1...n\) ,大家对第 \(i\) 道菜的评价值为 \(a_i(1≤i≤n)\)。 有 \(m\) 位顾客,第 \(i\) 位顾客的期望值为 \(b_i\),而他的偏好值为 \(x_i\) 。因此&#xff0…...

一个网站的开发周期/最有效的恶意点击软件

RedHat Linux 6.2下Oracle10g安装配置手册以下都是root用户操作1. 安装准备1.1 RedHatLinux Server 6.2安装文件RatHatLinuxServer-6.2-x86_64.iso1.2 Oracle10g Linux安装文件10201_database_linux_x86_64.cpio.gz1.3 检查安装包rpm -qa |grep makeautomake-1.11.1-1.2.el6.n…...

网站建设 概念/磁力猫

比较基础的一个特效&#xff0c;毕业设计要做一些记录&#xff0c;就把这些都记下来吧&#xff0c;万一用到的时候忘了呢 1 function changeTab() {2 let navs document.getElementsByTagName("li");3 for (let i 0; i < navs.length; i) {4 (f…...

青海公司网站建设/网络营销和网上销售的区别

那是使用的一样是VS 2003了在HTML种添加下面一行就可以ile!<meta name"vs_targetSchema" content"http://schemas.microsoft.com/intellisense/ie5"> 作为一个验证属性的标准 其实有很多属性在html是可用的,只不过微软没把它作到提示里来, …...