PBR工作流实现与对比

news2024/11/6 9:38:18

工作流实现

工作流中的核心内容便是贴图,不论是UE4还是Unity都支持将PBR的参数以贴图的形式传入引擎,我们可以根据一个物体同一mesh或不同mesh的不同区域的属性差异来控制贴图上的属性产生不同,而没有贴图的话,一个物体只能使用一种参数属性。

//glsl贴图代码示例

uniform sampler2D albedoMap;

uniform sampler2D normalMap;

uniform sampler2D metallicMap;

uniform sampler2D roughnessMap;

uniform sampler2D aoMap;

...

vec3 albedo = pow(texture(albedoMap, TexCoords).rgb, 2.2);

vec3 normal = getNormalFromNormalMap();

float metallic = texture(metallicMap, TexCoords).r;

float roughness = texture(roughnessMap, TexCoords).r;

float ao = texture(aoMap, TexCoords).r;

...

美术制作的albedo纹理一般都是sRGB空间的,因此我们要先转换到线性空间再进行后面的计算。根据美术资源的不同,AO纹理也许同样需要从sRGB转换到线性空间。


早期工作流

在Disney PBR没有大规模使用之前,材质贴图是没有一套规范通用的流程的,往往将很多东西混杂在一起去实现一个凭空想象的效果,而且每个人每个公司都有自己的方式,就好比绘画一样,没有一个标准的流程和规范。

想要得到预期效果,不仅得调节材质的属性还得相应地控制光照的属性,即材质与光照不解耦,工作流程上下端配和难度大。此处不再过多赘述,这种工作流已经基本消失殆尽。


金属粗糙流

该工作流是基于之前讲到的PBR原理,是PBR工作流中最为通用的。

  • Albedo-Base Color基色:sRGB三色图,代表非金属的漫反射颜色和金属的反射率值,也就是漫反射项中的C与金属部分的F0;

  1. 非金属漫反射区域不应低于50sPRG(容忍),红线是30sRGB,亮值不应超过240 sRGB

  1. 金属部分反射率值,在70-100%范围内,我们可以将其映射到180-255 sRGB

  1. 不会带有任何的光照信息(微观自遮挡可以包含,指个位像素级别)

  • Metallic金属度:灰度图,代表公式中运算的金属度,计算F0和漫反射Kd需要的插值系数。

  • 金属度图完全可以做成一张非零即一的黑白图,允许极少量两头极端范围内的过度值存在

  1. 金属值应在235-256 sRGB,它们的基色贴图值应该在180-255 sRGB范围内

  1. 涂层金属与生锈金属应当视作非金属,金属度设置为0;蒙灰金属可以小范围低于235sRGB,对应的basecolor需要降低一定范围,自行把控

  1. 理论上不应出现大面积的位于中间范围的金属值,那样做是错误的,现实不存在这种材料,但是强行为了特殊效果亦可

  • Roughness粗糙度:灰度图,代表高光部分计算中的粗糙度,根据需要自行设置。

优劣分析

  • 更容易理解创作,Basecolor就是物体的固有色,符合日常认知

  • 纹理占用内存少,因为金属和粗糙度贴图都是灰度图(单通道),可以和其他贴图混用通道

  • 非金属F0只能是默认的0.04,无法更改

  • 金属和非金属交界处会有白边,注意贴图分辨率和UV分布


高光光泽流

  • Albedo-Diffuse:sRGB三色图,包含非金属的反射颜色,即漫反射项中的C。

  1. 非金属反射颜色暗值不应低于30 sRGB(容差范围) - 50 sRGB(严格范围),亮值不应超过240 sRGB

  1. 金属区域为纯黑色

  • Specular高光度:sRGB三色图,包含金属的反射率值与非金属的反射率值,即金属与非金属的F0。

  1. 一般非金属部分应为2-5%,sRGB值应介于40-75之间,常见的宝石在0.05-0.17范围内,普通液体在0.02-0.04范围内

  1. 一般金属在70-100%镜面反射率范围内,映射到180-255 sRGB

  • Glossiness光泽度:与Roughness相反。

优劣分析

  • 可以自己控制非金属的F0

  • RGB贴图变多,占用内存变大

  • 不易控制,容易做出自然界不存在的材质

  • 边缘效应会产生黑边,注意贴图分辨率和UV分布


工作流转换

Specular到Metalness的转换

  1. 创建一张Metalic图

  1. 以Metalic图作为遮罩对Specular处理,得到金属的反射率值

  1. 覆盖到原本的diffuse

Specular到Metalness的转换

  1. 依靠金属与非金属在diffuse和specular的差异获得一张Metallic贴图

  1. 使用Metallic图作为遮罩,对BaseColor处理,将金属部分抠去,得到Diffus贴图

  1. 翻转Metallic图,作为遮罩对BaseColor处理,剩余的部分覆盖56度灰,得到Specular贴图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java Lambda表达式 匿名内部类 函数式接口(FunctionalInterface)

Java Lambda表达式定义背景示例匿名类实现Lambda表达式实现对比匿名类和Lambda实现Lambda表达式(调用)说明Lambda表达式的语法Java 1.8 新特性:函数式接口jdk 1.8 自带的函数式接口 (举例)定义 参考Oracle官网&#x…

目标检测6--R-FCN中的Position-Sensitive RoI Pooling

文章目录1.介绍2.Position-Sensitive Score Map 和 Position-Sensitive RoI Pooling3.源码参考资料欢迎访问个人网络日志🌹🌹知行空间🌹🌹 1.介绍 论文: Region-based Fully Convolutional Networks 代码: R-FCN 本论文作者同9.De…

电子组装流水线MES系统实行条码质量追溯

在电子制造行业,保证生产过程的稳定性与对制造关键能力的改善与提升,是大多数制造企业的管理重心,而缺乏有效的方法与手段。MES系统即制造执行系统,是企业信息集成的纽带,企业实施敏捷制造战略,实现车间生产…

C++学习记录——십 STL初级认识、标准库string类

文章目录1、什么是STL2、STL简介3、什么是string类4、string类的常用接口说明1、常见构造函数2、容量操作3、迭代器4、其他的标准库的string类关于string类的内容,可以在cplusplus.com查看到。 1、什么是STL STL是C标准库的重要组成部分,不仅是一个可复…

指 针

1.指针指针的作用: 可以通过指针间接访问内存(可以通过指针的保存一个地址(指针--地址))内存编号是从0开始记录的,一般用十六进制数字表示。可以利用指针变量保存地址指针变量的定义和使用指针变是定义语法: 数据类型 …

【MFC】模拟采集系统——图形按钮(18)

左边可以简单地使用一个组框,贴上背景图。当然,也可以使用新的对话框。 图形按钮类 1、类向导-》添加类-》选择MFC-》填入新类名称-》选择父类为 CButton 2、添加消息响应函数和虚函数: 消息响应mouse leave (离开) mouse move …

CSS3 animation-fill-mode详解

CSS3 animation-fill-mode详解 定义 animation-fill-mode 属性规定当动画不播放时(当动画完成时,或当动画有一个延迟未开始播放时),要应用到元素的样式。 默认情况下,CSS 动画在第一个关键帧播放完之前不会影响元素&…

各CCFA类核心期刊的信息汇总与评价总结(科技领域)

CCF中文期刊投稿选择之篇章二:各CCFA类核心期刊的信息汇总与评价总结上一篇章总结一部分期刊的介绍自动化学报相关信息的介绍有关录用比、审稿速度及费用的相关数据收集相关学术论坛上网友的评价与讨论期刊年度出版概况与学术热点动态(知网)计算机学报相…

2023年可供学习的 10 大 SaaS 知识库工具!

客户迫切希望快速找到所需的信息。在软件行业尤其如此,因为软件行业节奏很快,公司经常销售学习曲线陡峭的产品。为了减缓流失率并提高盈利能力,SaaS 公司正在转向知识库,以帮助他们让客户了解情况。什么是知识库?您可以…

设计模式之代理模式详解和应用

目录1 代理模式定义2 代理模式的应用场景3 代理模式的通用写法4 从静态代理到动态代理5 静态模式在业务中的应用6 动态代理在业务中的应用7 手写JDK动态代理实现原理7.1 JDK动态代理的实现原理7.2 CGLib动态代理容易踩的坑8 CGLib代理调用API及原理分析9 CGLib和JDK动态代理对比…

JVM - 高效并发

目录 Java内存模型和内存间的交互操作 Java内存模型 内存间的交互操作 内存间交互操作的规则 volatile特性 多线程中的可见性 volatile 指令重排原理和规则 指令重排 指令重排的基本规则 多线程中的有序性 线程安全处理 锁优化 锁优化之自旋锁与自适应自旋 锁优…

jvisualvm工具使用

jdk自带的工具jvisualvm,可以分析java内存使用情况,jvm相关的信息。 1、设置jvm启动参数 设置jvm参数**-Xms20m -Xmx20m -XX:PrintGCDetails** 最小和最大堆内存,打印gc详情 2、测试代码 TestScheduleClassGc package com.core.schedule;…

LeetCode 82. 删除排序链表中的重复元素 II

原题链接 难度:middle\color{orange}{middle}middle 题目描述 给定一个已排序的链表的头 headheadhead , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head [1,2,3,…

ASML逆袭史:人、资金、技术,缺一不可

前言 近年来,由于众所周知的原因,荷兰ASML(阿斯麦)公司的先进半导体制造设备——光刻机,进入普通大众视野,成为人们茶余饭后谈论的焦点话题之一。 1月底,“美日荷三方谈判达成协议,可…

Selenium自动化测试Python二:WebDriver基础

欢迎阅读WebDriver基础讲义。本篇讲义将会重点介绍Selenium WebDriver的环境搭建和基本使用方法。 WebDriver环境搭建 Selenium WebDriver 又称为 Selenium2。 Selenium 1 WebDriver Selenium 2 WebDriver是主流Web应用自动化测试框架,具有清晰面向对象 API&…

SAP ABAP 输出结果带有空格

方法一: 字段内容前增加空格,需使用全角空格,使用半角空格时,ALV显示无效,空格无法显示, 全角与半角的切换方法:shift空格切换, 如下的标记部分,要想通过ALV显示空格&…

mfc140u.dll丢失的解决方法,mfc140u.dll文件修复

mfc140u.dll丢失的解决方法,其实要解决这个问题一点都不难,我们主要知道是什么原因造成的,那么就可以轻松的解决。 一.mfc140u.dll是什么 "MFC140u.dll"是一个Windows动态链接库文件,它是Microsoft Visual C 2015运行…

TortoiseSVN的使用

基本概念 版本库 SVN保持数据的地方,所有的文件都保存在这个库中,Tortoise访问的就是远程服务器上的Subversion版本库。 工作拷贝 就是工作副本,可将版本库的文件拷贝到本地中,可以任意修改, 不会影响版本库。在你…

责任链模式(Chain of Responsibility Pattern)

意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 主要解决:职责链上的处理者负责处理请求,客户只…

常用调试golang的bug以及性能问题的实践方法

文章目录如何分析程序运行时间和CPU利用率情况1.shell内置time指令/usr/bin/time指令如何分析golang程序的内存使用情况?1.内存占用情况查看如何分析golang程序的CPU性能情况1.性能分析注意事项2.CPU性能分析A.Web界面查看B.使用pprof工具查看如何分析程序运行时间和…