首页 > 其他分享 >PBR工作流实现与对比

PBR工作流实现与对比

时间:2023-02-18 12:34:05浏览次数:32  
标签:贴图 PBR 实现 sampler2D 金属 sRGB uniform 非金属 对比


工作流实现



PBR工作流实现与对比_Powered by 金山文档


工作流中的核心内容便是贴图,不论是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
  2. 金属部分反射率值,在70-100%范围内,我们可以将其映射到180-255 sRGB
  3. 不会带有任何的光照信息(微观自遮挡可以包含,指个位像素级别)
  • Metallic金属度:灰度图,代表公式中运算的金属度,计算F0和漫反射Kd需要的插值系数。
  • 金属度图完全可以做成一张非零即一的黑白图,允许极少量两头极端范围内的过度值存在
  1. 金属值应在235-256 sRGB,它们的基色贴图值应该在180-255 sRGB范围内
  2. 涂层金属与生锈金属应当视作非金属,金属度设置为0;蒙灰金属可以小范围低于235sRGB,对应的basecolor需要降低一定范围,自行把控
  3. 理论上不应出现大面积的位于中间范围的金属值,那样做是错误的,现实不存在这种材料,但是强行为了特殊效果亦可
  • Roughness粗糙度:灰度图,代表高光部分计算中的粗糙度,根据需要自行设置。

优劣分析

  • 更容易理解创作,Basecolor就是物体的固有色,符合日常认知
  • 纹理占用内存少,因为金属和粗糙度贴图都是灰度图(单通道),可以和其他贴图混用通道
  • 非金属F0只能是默认的0.04,无法更改
  • 金属和非金属交界处会有白边,注意贴图分辨率和UV分布

高光光泽流

  • Albedo-Diffuse:sRGB三色图,包含非金属的反射颜色,即漫反射项中的C。
  1. 非金属反射颜色暗值不应低于30 sRGB(容差范围) - 50 sRGB(严格范围),亮值不应超过240 sRGB
  2. 金属区域为纯黑色
  • Specular高光度:sRGB三色图,包含金属的反射率值与非金属的反射率值,即金属与非金属的F0。
  1. 一般非金属部分应为2-5%,sRGB值应介于40-75之间,常见的宝石在0.05-0.17范围内,普通液体在0.02-0.04范围内
  2. 一般金属在70-100%镜面反射率范围内,映射到180-255 sRGB
  • Glossiness光泽度:与Roughness相反。

优劣分析

  • 可以自己控制非金属的F0
  • RGB贴图变多,占用内存变大
  • 不易控制,容易做出自然界不存在的材质
  • 边缘效应会产生黑边,注意贴图分辨率和UV分布

工作流转换

Specular到Metalness的转换

  1. 创建一张Metalic图
  2. 以Metalic图作为遮罩对Specular处理,得到金属的反射率值
  3. 覆盖到原本的diffuse

Specular到Metalness的转换

  1. 依靠金属与非金属在diffuse和specular的差异获得一张Metallic贴图
  2. 使用Metallic图作为遮罩,对BaseColor处理,将金属部分抠去,得到Diffus贴图
  3. 翻转Metallic图,作为遮罩对BaseColor处理,剩余的部分覆盖56度灰,得到Specular贴图

标签:贴图,PBR,实现,sampler2D,金属,sRGB,uniform,非金属,对比
From: https://blog.51cto.com/u_15923385/6065305

相关文章

  • 学习APT以及简单应用( 注解实现 findViewById)
    本文的参考资料、原代码都可以在享学课堂中获取/***创建JavaLibraryModule名称为APTModule*1、创建自定义注解MQBindView*2、创建注解处理器MQProcessor*3......
  • volatile的实现原理-内存屏障
     被volatile修饰的变量在编译成字节码文件时会多个lock指令,该指令在执行过程中会生成相应的内存屏障,以此来解决可见性跟重排序的问题。内存屏障的作用:1.在有内存屏障......
  • css3实现一个div设置多张背景图片及background-image属性
    引子以前做网页布局的时候,一个div只能设置一张背景图片,设置多个背景的话,要用多个div嵌套才能实现,这样兼容性比较好。若您的网站要求兼容浏览器低版本,建议用这种方法。css3的......
  • Javascript与HTML5的canvas实现图片旋转效果
    ​​查看演示​​我们在微博上可以对图片进行向左转向右转等旋转操作,让用户可以从不同的视角欣赏图片效果。本文将结合实例为您讲解如何使用Javascript结合相关技......
  • css实现正方形div aspect-ratio 属性 (2022)
    总结一下比较常见的css实现DIV正方形的方法。使用aspect-ratio属性div{aspect-ratio:1/1;width:50%;border:1pxsolidred;}<div>Aspectratio:1/1</div......
  • 大文件读取的实现-PYTHON
    当前一个大文件大小,比当前的机器的内存大,先读取某个文件里的一部分。文件遍历因为文件保存了很多字符和行,因此也是循环常见的典型使用案例,最原始的方法可以调用文件对象的re......
  • 回到顶部的功能实现 js 230218
    主要事件1,滚动事件body标签的scroll事件在事件中捕捉html的scrollTop数据对这个数据进行判断如果大于一定的值,就让“回到顶部”的盒子显示否则就让它隐藏2,点击事件为“回到......
  • 实现阿里云ECS或其他Linux服务器之间的文件传输
    当需要在两个Linux服务器之间传输文件时,一般会有以下几种选择:基于Xftp:先把文件或文件夹从A服务器down到本地,然后再从本地up到B服务器;基于wget:在B服务器上直接利用wget工......
  • m最小二乘法自适应均衡误码率仿真,对比LS,DEF以及LMMSE三种均衡算法误码率
    1.算法描述        信道估计是通信系统接收机的重要功能模块,主要是用来估计信号所经历信道的冲击响应,并用于后续的信道均衡处理,以便消除多径信号混叠造成的ISI。......
  • tf手写字体的实现
    importtensorflowastfmnist=tf.keras.datasets.mnist(x_train,y_train),(x_test,y_test)=mnist.load_data()x_train,x_test=x_train/255.0,x_test/......