Shader实战(3):贴图像素化风格实现

话不多说,将以下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与片元法线等的映射,还可以将光照情况预先烘焙至贴图,然后再将贴图像素化。 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab中可以使用卷积神经网络(CNN)对图片进行风格化处理,常见的方法有VGG网络和ResNet网络。这里以VGG网络为例进行说明。 使用Matlab中的VGG网络进行图片风格化处理的步骤如下: 1. 读入需要进行风格化处理的原始图片和目标风格图片,并将它们转换为网络输入所需的格式。 2. 使用Matlab中的VGG网络加载预训练权重,并将原始图片和目标风格图片输入网络中。 3. 使用Gram矩阵计算原始图片和目标风格图片在网络中的特征表示,并计算它们之间的风格损失。 4. 使用Matlab中的反向传播算法对网络进行训练,使得原始图片在风格损失的约束下逐渐趋向于目标风格图片。 5. 输出训练得到的风格化图片。 下面是一个简单的Matlab代码示例: ```matlab % 读入原始图片和目标风格图片并转换为网络输入格式 orig_img = imread('original.jpg'); orig_img = imresize(orig_img, [224, 224]); orig_img = single(orig_img); orig_img = bsxfun(@minus, orig_img, net.meta.normalization.averageImage); style_img = imread('style.jpg'); style_img = imresize(style_img, [224, 224]); style_img = single(style_img); style_img = bsxfun(@minus, style_img, net.meta.normalization.averageImage); % 使用VGG网络计算原始图片和目标风格图片的风格特征表示和风格损失 orig_features = vl_simplenn(net, orig_img); style_features = vl_simplenn(net, style_img); orig_gram = compute_gram(orig_features); style_gram = compute_gram(style_features); style_loss = compute_style_loss(orig_gram, style_gram); % 反向传播算法进行网络训练 lr = 2; num_iters = 1000; for i = 1:num_iters % 计算训练图片的特征表示和风格损失 train_features = vl_simplenn(net, train_img); train_gram = compute_gram(train_features); train_loss = compute_style_loss(train_gram, style_gram); % 计算总损失并更新网络 total_loss = train_loss + lambda * content_loss; gradients = vl_simplenn(net, train_img, 1, total_loss, 'conserveMemory', true); train_img = train_img - lr * gradients; end % 输出训练得到的风格化图片 imshow(train_img); ``` 需要注意的是,风格化处理的效果与网络的架构、参数设置、损失函数等相关,具体的调整需要根据实际情况进行。同时,风格化处理的计算量较大,需要在计算资源允许的情况下进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值