Unity-Matcap材质捕捉和薄膜干涉效果

Material Capture(材质捕捉技术)技术:通过很简单的技术表现出很不错的效果。(以前很流行,特定材质有奇效)

效果图:
可以将图片上的圆形纹理图完全还原到物体上。(注意如果物体偏离到相机边缘会瑕疵,需要处理)
在这里插入图片描述在这里插入图片描述

Matcap核心思想

使用相机空间下的法线作为UV进行纹理采样,将图片上的圆形纹理图完全还原到物体上。
适用于比较圆滑的物体采样。


float3 normal_world = UnityObjectToWorldNormal(v.normal);
// o.normal_view = normalize(mul(unity_WorldToCamera, normal_world));
// 相机空间下的法线
o.normal_view = normalize(mul((float3x3)UNITY_MATRIX_V, normal_world));
// 下面这个会出错 - 对于向量来说,发生平移前后应该是相等的 mul(UNITY_MATRIX_V, float4(pos, 1.0)), 加上第4个分量后就不行了;
// o.normal_view = normalize(UnityWorldToViewPos(normal_world));

i.normal_view = normalize(i.normal_view);
float2 uv = (i.normal_view.xy + 1) / 2; // 法线值域为[-1,1] => uv为[0, 1] 
fixed3 col = tex2D(_MainTex, uv);

使用ASE连连看:
在这里插入图片描述
效果:
在这里插入图片描述

Matcap改进1 - 改进在平面物体采样时出现的拉伸

这种改进好像不太行,不过对于平面也能够部分采样了。
在这里插入图片描述
在这里插入图片描述

Matcap改进2 - 这个认为2效果明显

这种改进效果可以说十分明显,基本上完全还原材质球的样子了。
在这里插入图片描述
在这里插入图片描述

渐变纹理采样

在这里插入图片描述
在这里插入图片描述

将一张这样的纹理读取成这个样子,也就是需要在边缘的读取到右边,中心读取左边。

于是可以利用边缘光的计算思路使用 NdotV,然后反向可以得出一个边缘值大,而中心点值小的数据。将数据带入X(横向,取决于纹理方向),然后固定UV中Y的值即可完成类似采样。

// 使用NdotV取uv(如果固定y,即让视角中心取材质左边,让边缘取材质右边,适用于渐变)
// V需要进行单位化再运算,a * (dot(c, b)) != dot(a / c, b)
float3 view_world_dir = normalize(UnityWorldSpaceViewDir(i.pos_world));
float NdotV = saturate(dot(normalize(normal_world), view_world_dir));
half fresnel = 1 - NdotV;
half2 uv_ramp = half2(fresnel, 0.5); 
half4 col_ramp = tex2D(_RampTex, uv_ramp); // 采样

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41709801/article/details/127338826
今日推荐