【Unity3D Shader】学习笔记-纹理采样①
前言
纹理采样属于在片段着色器中进行,通过提供的贴图和uv坐标使用tex2D进行采样。本篇主要介绍对同一纹理多次采样然后进行混合来获得不同的效果。
[声明:本笔记系列文章的图片资源都源自百度图片搜索,如有问题联系我]
一、简单重影
对同一纹理进行两次采样,采样时的UV两次坐标不一样,然后将采样的结果进行取平均得到最终的结果。
fixed4 frag (v2f i) : SV_Target { float2 uv1 = i.uv + float2(0.0, 0.0); float2 uv2 = i.uv - float2(0.1, 0.0); //进行偏移 fixed3 col = fixed3(0.0, 0.0, 0.0); col += tex2D(_MainTex, uv1).rgb; col += tex2D(_MainTex, uv2).rgb; // 这里需要取平均值 fixed4 finalCol = fixed4(col * 0.5, 1.0); UNITY_APPLY_FOG(i.fogCoord, finalCol); return finalCol; }
二、色差效果(类似抖音效果)
通过三次采样,每次采样的UV坐标都不一样,然后每次采样的结果只选1个通道进行混合得到结果。主要是进行uv偏移然后多通道重新混合得到色差效果,但其实这与维基百科介绍色差的理论是完全不对的(玄学:有一句话叫看上去是对的,那么它就是对的)。
fixed4 frag (v2f i) : SV_Target { fixed2 offset_1 = fixed2(0.023, 0.023); fixed2 offset_2 = fixed2(0.022, 0.022); // 原图采样 fixed4 col = tex2D(_MainTex, i.uv); // 两次对纹理进行偏移采样 fixed4 offCol1 = tex2D(_MainTex, i.uv - offset_1); fixed4 offCol2 = tex2D(_MainTex, i.uv - offset_2); // 三次采样中的每个各取一个通道进行混合 fixed3 blendColor = fixed3(offCol2.r, col.g, offCol1.b); return fixed4(blendColor, col.a); }
三、简单模糊(详情可参考Box Blur)
上面两种效果就已经有一种模糊在里面,如果对同一个点的相邻位置(左右上下)各采样一次并和当前点的结果取平均,就可以获得一个简单的模糊效果。
fixed4 frag (v2f i) : SV_Target { fixed3 col = fixed3(0.0, 0.0, 0.0); // 当前位置 col += tex2D(_MainTex, i.uv + fixed2(0.0, 0.0)).rgb; // 右边 col += tex2D(_MainTex, i.uv + fixed2(0.01, 0.0)).rgb; // 左边 col += tex2D(_MainTex, i.uv + fixed2(-0.01, 0.0)).rgb; // 上面 col += tex2D(_MainTex, i.uv + fixed2(0.0, 0.01)).rgb; // 下面 col += tex2D(_MainTex, i.uv + fixed2(0.0, -0.01)).rgb; // 取均值 fixed4 final_col = fixed4(col / 5, 1.0); return final_col; }