问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Shader实战:Unity中实现贴图像素化风格

创作时间:
作者:
@小白创作中心

Shader实战:Unity中实现贴图像素化风格

引用
CSDN
1.
https://blog.csdn.net/qq_41904236/article/details/138169056

本文将介绍如何使用Unity Shader实现贴图像素化风格。通过自定义Shader,我们可以轻松地为游戏中的材质添加像素化效果,让画面呈现出独特的艺术风格。

无需多言,将以下Shader代码赋给材质并贴上贴图即可实现像素化效果:

Shader "HQY/Shader2"  //自己改名
{
    Properties
    {
        _Diffuse ("Diffuse", Color) = (1,1,1,1)
        _MainTex ("MainTex", 2D) = "white" {}
        _Specular("Specular", Color) = (1,1,1,1)
        _Gloss("Gloss", Range(8,256)) = 20
        _PixelSize ("PixelSize", Range(1, 100)) = 1
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "LightMode"="ForwardBase"}
        LOD 200
        Pass{
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag 
            #include "Lighting.cginc"
            fixed4 _Diffuse;
            sampler2D _MainTex;
            sampler2D _NewTex;
            fixed4 _Specular;
            float _Gloss;
            struct appdata {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float2 texcoord : TEXCOORD0;
                float2 uv : TEXCOORD0;
            };
            struct v2f {
                float4 pos : SV_POSITION;
                float3 worldNormal : TEXCOORD0;
                float3 worldPos : TEXCOORD1;
                float2 uv : TEXCOORD2;
            };
            v2f vert (appdata v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
                o.uv = v.uv;
                return o;
            }
            float4 _MainTex_TexelSize;
            float _PixelSize;
            fixed4 frag (v2f i) : SV_TARGET {
                float2 interval = _PixelSize * _MainTex_TexelSize.xy;
                float2 th = i.uv / interval;    // 按interval划分中,属于第几个像素
                float2 th_int = floor(th);   // 去小数,让采样的第几个纹素整数化,这就是失真UV关键
                th_int *= interval;             // 再重新按第几个像素的uv坐标定位
       
                //return tex2D(_MainTex, th_int);  //若不需叠加光影则直接返回
                fixed4 texColor = tex2D(_MainTex, th_int);
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * texColor.rgb;
                fixed3 diffuse = _LightColor0.rgb * texColor.rgb * max(0, dot(i.worldNormal, _WorldSpaceLightPos0.xyz));
                fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(reflect(_WorldSpaceLightPos0.xyz, i.worldNormal), normalize(i.worldPos - _WorldSpaceCameraPos))), _Gloss);
                fixed4 c = fixed4(ambient + diffuse + specular, 1.0); 
                c *= _Diffuse;
                return c;
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

效果如下:

至于光影效果的像素化与贴图配套,除了建立贴图UV与片元法线等的映射,还可以将光照情况预先烘焙至贴图,然后再将贴图像素化。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号