pbr材质系统和vray材质系统有什么不同

作者:戴巍
链接:https://www.zhihu.com/question/49032411/answer/118293944
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

现在游戏行业开始流行起来的pbr材质系统,在CG渲染领域已经发展很多年了。就是说,游戏行业的材质在慢慢追逐影视的效果,最近这两年才比较接近了。

所以,CG渲染领域用的材质可以实现几乎一切游戏pbr材质可以实现的效果,反之则不行。

具体回答问题:
pbr材质(这里说的是最流行的metalness roughness模型)使用的参数是albedo metalness roughness normal,而vray材质的主要对应参数有diffuse specular glossiness normal或者bump

albedo就是大家熟悉的diffuse,也就是物体的固有颜色。

metalness翻译过来是金属度,描述材质是金属还是电介质,这是给大家提供的一个感性解释,实际上这个参数真正控制的东西是F0,也就是菲尼尔反射中,与摄像机视线垂直的面的反射率,当metalness值为0的时候,F0的值是0.04,也就是IOR为1.5的时候对应的F0;而当metalness值位1的时候,F0的值是1;metalness是0-1的中间值的时候,F0也会在0.04和1之间进行插值,我猜是线性插值。在这个过程中F90不变,永远恒定为1。这其实就是对菲涅尔效果的粗略描述了。

在vray的材质球上,没有一个能跟metalness相对应的参数,可能有些人会以为是specular,控制反射强度的这个参数。实际上不行。因为specular会整体改变整个材质球的反射强度,而metalness只改变F0的正面反射率,侧面永远是1。

不过刚才也说了,F0和折射率,也就是IOR,有对应关系,可以通过公式进行换算。所以vray里,IOR某种程度上可以对应metalness。

roughness = 1 - glossiness 这两个单词本身就是反义词。

normal或者bump不用说了。

以上只要完全把属性一一进行对应,vray的材质可以完全还原pbr材质的效果。但是vray的材质还有很多很多别的功能,比如说透明、半透明、物理算法的3s效果,diffuse 本身的roughness属性都是pbr没有的。



另外,有些pbr材质具有specular属性。比如说UE4的pbr材质,然而这里的specular和vray里的specular有些近似,但不同。UE4材质球的specular指的其实也是F0的反射强度,默认0.5对应的就是F0的0.04,往0调会略微降低F0,往1调会略微提高F0。


还有一点非常关键,我放在最后讲。就是原则上用正确的方法去链接贴图,可以让vray材质球得到和pbr材质球非常近似的视觉效果,但是对于边缘的反射强度处理是不一样的,虽然说由于菲涅尔反射的存在,模型的边缘处反射率恒定为1,但是当物体微表面粗糙的时候,光线在边缘的地方,容易发生相互的反射、遮挡等等,会让反射率从宏观上看起来有所下降。目前我测试过几款渲染器,vray arnold 和mr对于边缘处反射模糊的处理和pbr材质球都不一样,并且实际上是错误的;唯一我发现正确处理的是redshift的材质。

如果你使用的是vray arnold 或者mr渲染器,并且没有意识到这个问题,那么可以说绝大多数你调的材质都是错的。按照pbr材质的思路走才是对的。具体怎么做的话,还要说很多。可能关心的人不多,就写到这里了。

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当涉及到手写 PBR(Physically Based Rendering,基于物理的渲染)材质着色器时,以下是一个简单的示例,用于实现标准的 PBR 材质模型: ```c // 着色器属性 uniform vec3 uAlbedo; // 反射率颜色 uniform float uRoughness; // 粗糙度 uniform float uMetallic; // 金属度 // 表面法线和视图方向 in vec3 vNormal; // 顶点法线 in vec3 vViewDir; // 视图方向 // 光源属性 uniform vec3 uLightDir; // 光源方向 uniform vec3 uLightColor; // 光源颜色 void main() { // 计算使用 Cook-Torrance BRDF 模型的光照 vec3 N = normalize(vNormal); vec3 V = normalize(vViewDir); vec3 L = normalize(uLightDir); vec3 H = normalize(V + L); // 半向量 // 计算漫反射项 float NdotL = max(dot(N, L), 0.0); vec3 diffuse = uAlbedo * NdotL; // 计算镜面反射项(使用 Cook-Torrance BRDF) float NdotH = max(dot(N, H), 0.0); float roughnessSquared = uRoughness * uRoughness; float F0 = mix(0.04, 1.0, uMetallic); vec3 specular = vec3(0.0); if (NdotL > 0.0) { float NdotV = max(dot(N, V), 0.001); float NdotH2 = NdotH * NdotH; float alpha = roughnessSquared; float D = exp((NdotH2 - 1.0) / (alpha * NdotH2)); float F = F0 + (1.0 - F0) * pow(1.0 - NdotV, 5.0); vec3 F_specular = vec3(F); float G = min(1.0, min(2.0 * NdotH * NdotV / NdotL, 2.0 * NdotH * NdotL / NdotV)); vec3 G_specular = vec3(G); specular = D * F_specular * G_specular / (4.0 * NdotL * NdotV); } // 最终颜色 = 漫反射 + 镜面反射 vec3 finalColor = diffuse + specular; // 输出颜色 gl_FragColor = vec4(finalColor, 1.0); } ``` 这只是一个简单的 PBR 材质着色器示例,实际中可能还包含其他的贴图、光照模型或者其他参数。这段代码可以作为一个起点,你可以根据需要进行修改和扩展。请记住,PBR 材质着色器通常需要更多的计算和参数,以便更真实地模拟光照和材质的物理特性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值