“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第5篇文章,点击查看活动详情”
技术不啰嗦
理论基础
Matcap ,顾名思义是 “材质捕捉”(Material Capture),是一种由 Zbrush 流行而来的实时着色方法。所有的着色信息(包括阴影和灯光)都以 “发光球体” 的形式被烘焙到纹理中,它被应用到 基于相机坐标系下的法线 的几何图形中。
只要相机不移动,matcap 的烘焙照明就能很好地工作,因为当它移动时,就灯光和阴影就需要随着相机移动。正因为如此,matcap 最适合像兔八哥漫画那样的 “卡通阴影”,因为光的方向不需要考虑。
完整代码请见文末,如果想要使用它,将其复制保存为 MatcapTex.osl 并将它加载到 VRayOSLTex 中,然后将其连接到 VRayLightMtl。你还需要制作或从网上下载一个光照球体(litsphere)纹理贴图来连接到 matcap OSL 纹理。如下图所示的几个 LitSphere 纹理示例。
下面你可以看到几个例子带光照信息的球体纹理和最后 matcap 渲染的效果。光照球体纹理 最好是光滑的,而不是有很多精细细节的。例如,注意到下面 “绘制” matcap 的铅笔笔触线条效果略有一些的拉伸,而平滑的设计 “图形” 的 matcap 则看起来很完美。
完整 OSL 代码如下
/*
*
* 一个简单的着色器,模拟在 Zbrush 中使用的 Matcap 材质
*
*
*/
shader MatcapTex
(
string LitSphereMap_texture = "color.png",
float Gamma = 2.2,
output color result = 1
)
{
/// @note 将法线转换到相机坐标系下
vector Normal_camera = transform ("common", "camera", N);
/// @note 转换法线数据范围 [-1., 1.] - > [0., 1.],用于下一步采样纹理坐标的 u 方向
float norU = clamp (Normal_camera[0] * 0.5 + 0.5, 0.0, 1.0);
/// @note 转换法线数据范围 [-1., 1.] - > [0., 1.],用于下一步采样纹理坐标的 v 方向
float norV = clamp (Normal_camera[1] * 0.5 + 0.5, 0.0, 1.0);
color c_out = texture (LitSphereMap_texture, norU, norV);
/// @note gamma 校正
result = pow(c_out, Gamma);
}