大家好,欢迎来到IT知识分享网。
一、概念和原理
1.1 什么是Matcap
什么是Matcap?Matcap实际上是Material Capture的缩写,即材质捕捉。实际上,这是一种离线渲染方案。类似光照烘焙,将光照或者其它更复杂环境下的渲染数据存储到一张2D贴图上, 再从这张2D贴图进行采样进行实时渲染。
1.2 如何理解Matcap
Matcap是一种在视线空间下使用单位法线采样单位球的离线渲染算法。
- 为什么是视线空间?因为视线空间下,相机变化就可以看到不同的渲染结果。
- 为什么使用法线去采样了?法线是描述表面朝向的向量,与渲染结果强相关,法线跟物体的曲率强相关等,因此这种算法经常用于 sculpting上。
1.3 Matcap的特点
Matcap的特点总结如下:
- 使用视线空间下的法线向量采样2D贴图,作为光照和反射结果。
- 在缺乏光照烘焙的环境下,可以一定程度上替代或者模拟光图。
- 但是,Matcap代表的2D贴图不局限于光照信息,也可以理解为某种环境下的最终渲染结果。
- 由于是离线方案,因此计算非常廉价,很适合低端机器或者特定场合下使用。
二、如何实现Matcap
2.1 如何获得Matcap贴图
按照定义,matcap贴图是一张2D贴图,内部包含一个单位球,表示光照信息。如何获得这样的贴图了?
- 从网上的材质库下载
比如,matcaps - 引擎预览材质球然后截图。
2.2 如何采样Matcap贴图
// ------------------------------- // Vertex // ------------------------------- VertexNormalInputs normalInput = GetVertexNormalInputs(input.normalOS, input.tangentOS); output.normalWS = normalInput.normalWS; // ------------------------------- // Fragment // ------------------------------- float3 viewNormal = mul((float3x3)GetWorldToViewMatrix(), normalWS); float2 matCapUV = viewNormal.xy * 0.5 + 0.5; half3 matcapColor = SAMPLE_TEXTURE2D(_Matcap, sampler_Matcap, matCapUV).rgb;
从上述glsl代码可以看出,需要把法线转换到视线空间,然后再将法线偏移到[0,1]的范围内,然后取xy分量作为uv,对matcap纹理进行采样。
三、Matcap的问题
3.1 边缘瑕疵
3.2 单点采样
对于平面来说,其法线朝着同一个方向的,因此会出现整个平面获得的matcap颜色都是同一个像素点,与正常的光照结果相差很大。我们希望的是,即使是一个平面,不同的像素点也是有不同的光照结果。
3.3 解决办法
3.1.1 缩放uv
第一种方式是对matcapUV进行缩放,比如缩小uv可以使得避免采样边缘区域。
float2 matCapUV = viewNormal.xy * 0.5 * _MatcapUVScale + 0.5;
这种方式可以简单的解决边缘瑕疵问题,但是无法解决单点采样。
3.1.2 使用视线空间下单位球的法线
#if _MATCAP_FIX_EDGE_FLAW float3 r = reflect(input.positionVS, viewNormal); r = normalize(r); float m = 2.619 * sqrt(r.z + 1.0); float2 matCapUV = r.xy / m * _MatcapUVScale + 0.5; #else float2 matCapUV = viewNormal.xy * 0.5 * _MatcapUVScale + 0.5; #endif
从上图可以看出,对于平面来说,两种算法的效果差异非常明显。
四、Matcap与其它效果的结合
4.1 基础颜色
4.2 法线贴图
4.3 自发光
类似正常的光照计算,可以在matcap的结果之上,再叠加自发光。
4.4 模拟高光
4.5 Cubemap反射
4.6 模拟边缘光
利用dot(normalWS, viewDirWS)计算出边缘光的强度,再将边缘光颜色与强度相乘叠加到最终着色结果上即可。
4.7 模拟折射
4.8 光照强度
同时,也可以计算出真实的光照强度,将光照强度乘以matcap颜色,让matcap的着色结果受到灯光影响。不过,这跟matcap的初衷不太一致。
五、参考资料
Materials (MatCap)
https://github.com/nidorx/matcaps
MatCap Shader 改进:解决平面渲染和环境反射问题
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/113348.html


