这里写目录标题
- Matcap核心思想
- Matcap改进1 - 改进在平面物体采样时出现的拉伸
- Matcap改进2 - 这个认为2效果明显
- 渐变纹理采样
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); // 采样