complex fresnel,这个名字来自vray 官方帮助文档
:
https://docs.chaosgroup.com/display/OSLShaders/Complex+Fresnel+shader
这篇文章中提供了一个osl材质,叫做complex fresnel shader,作用是可以使用n值 和 k值(,这两个存在于菲涅尔公式中的参数来定义材质的具体反射表现。
帮助文档是提供了这个osl材质的源码:
float fresnel(float n, float k, float c) {
float k2=k*k;
float rs_num = n*n + k2 - 2*n*c + c*c;
float rs_den = n*n + k2 + 2*n*c + c*c;
float rs = rs_num/ rs_den ;
float rp_num = (n*n + k2)*c*c - 2*n*c + 1;
float rp_den = (n*n + k2)*c*c + 2*n*c + 1;
float rp = rp_num/ rp_den ;
return clamp(0.5*( rs+rp ), 0.0, 1.0);
}
shader complex_ior (
vector n=vector(0.27105, 0.67693, 1.3164) [[ string description = "Refractive index for red, green, blue wavelengths (f.e. for 0.65, 0.55, 0.45 micrometers)" ]],
vector k=vector(3.6092, 2.6247, 2.2921) [[ string description = "Extinction coefficient for red, green, blue wavelengths (f.e. for 0.65, 0.55, 0.45 micrometers)" ]],
output color Col_Out = color(0.5)
)
{
float thetaCos =
abs
(dot(-I,N));
float red=fresnel(n[0], k[0], thetaCos);
float green=fresnel(n[1], k[1], thetaCos);
float blue=fresnel(n[2], k[2], thetaCos);
Col_Out=color(red, green, blue);
}
我知道你在想什么,我也看不懂。没关系,对于艺术家来说,我们只要知道如何使用就好。
首先我们需要用到一个网,大概长这样
http://refractiveindex.info/
这是一个科学测算材质相关方方面面参数的网站,可以查到非常多有用的信息。本文介绍的做法非常依赖这个网站查询所获得的参数。我们后面要在材质球上使用的n值和k值就是在这里查询出来的。
如果是看过 grant warwick的mastering V-Ray教程的朋友,应该对这个网站不会陌生。
在这套经典材质教程中,作者并没有使用常规方式去制作材质的反射,而是自定义了三个反射曲线对应红绿蓝三个通道,藉此制作出非常复杂而丰富的反射效果。他制定RGB反射曲线的信息来源就是上面提到的这个网站。他会先查自己想要制作的材质,然后获得一个图,大概这样:
grant warwick 在教程中说,这三根红绿蓝曲线代表的是红绿蓝三个通道的反射率。横轴是相机视线与模型表面法线的夹角度数,纵轴是反射率。并且使用一些类似曲线的工具去手动还原查询到的这张图。
然而这张图上写得很清楚,红色曲线代表的是S-polarized,蓝色曲线代表P-polarized,绿色曲线代表的是non-polarized。这里说的其实是偏振光的的反射,而不是红绿蓝的反射。因为跟主题关系不大就不深究了。
总之,grant warwick在曾经的mastering V-Ray教程中教授的方法并不正确,但是他以自己艺术家敏锐的眼光调来调去,弥补了技术上的失误,最后的效果总的来说还是不错的。
首先在shelf 一栏中选择给三维艺术家使用的数据,后面的类型可以根据自己的需要进行选择。比如我可以选择大类型金属(metals),细分类型铁(Fe)。
之后,根据vray官方帮助文档上的信息,使用参数:红光波长0.65微米,绿光波长0.55微米,蓝光波长0.45微米。
将这些参数代入网站的计算器中计算出对应的n值和k值:
这个时候,再将对应的n值和k值使用到渲染器中的材质球上去即可以获得精确的材质效果。应为Redshift渲染器的材质球已经内置了n值和k值,所以,后面的渲染测试我都在Redshift渲染器当中进行。如果是别的渲染器,只要支持osl材质的,都可以在上文提供的vray官方帮助文档中下载
complex_ior.zip
文件,获得complex fresnel shader,之后再将这个osl材质计算出来的结果插入标准材质的reflection color里面去,关闭材质本身的fresnel功能,即可获得和本文后面一样的效果。
在Redshift的RsMaterial材质上,fresnel type 使用IOR(Advanced)即可开启材质的n值和k值,下图中的IOR一栏即为n值,Absorption(k)一栏即为k值。 第一列为红光的n值和k值,第二列为绿光的n值和k值,第三列为蓝光的n值和k值。