HLSL实现浮雕、锐化特效

  • 前言
  • 一、浮雕
  • 二、锐化



前言

浮雕以及锐化都设计到当前像素与周边像素的计算。暂时将两者放在一块。

一、浮雕

浮雕效果是将图像的变化部分突出的表现出来,而相同的颜色部分则被淡化掉,使图像出现纵深感,从而达到浮雕的效果。实现方法是将每一个像素与其左上角(其他方向也行)的像素进行求差运算,并加上一个背景灰度。

//浮雕
float4 Emboss(float4 outp, float2 tex)
{
     //浮雕
    //浮雕效果  "浮雕"图像效果是指图像的前景前向“凸出”背景。
    //v2TexSize为纹理的原分辨率,当前纹理原分辨率为512x512  可定义为float2 v2TexSize = float2(512,512)
    float2 upLeftUV = float2(tex.x - 1.0 / v2TexSize.x, tex.y - 1.0 / v2TexSize.y); //得到当前像素点左上角的归一化后的纹理坐标  
    float4 bkColor = float4(0.5, 0.5, 0.5, 1.0); //一个灰度值,代表背景颜色
    float4 curColor = outp;


    float4 upLeftColor = g_Tex.Sample(g_SamLinear, upLeftUV);

    float4 delColor = curColor - upLeftColor;
  
    float h = 0.3 * delColor.x + 0.59 * delColor.y + 0.11 * delColor.z;//参数可根据情况自由调整
    //float h = 0.8 * delColor.x + 0.8 * delColor.y + 0.6 * delColor.z;
        
    outp = float4(h, h, h, 0.0) + bkColor;
    return outp;
}

浮雕效果

shape 三角形 android_shape 三角形 android


shape 三角形 android_shape 三角形 android_02


轮廓如果不够明显,可以试试更改左上角(或者其他方向)的位置(当前的为相邻的左上角)

例如:float2 upLeftUV = float2(tex.x - 2.0 / v2TexSize.x, tex.y - 2.0 / v2TexSize.y);

二、锐化

拉普拉斯锐化效果主要的思路是计算出自身与周围像素的色差,再将差别加到自身上,用于突出图像中的细节。(锐化效果与模糊效果有点相反的意思,模糊是平均化每个点,锐化是突出每个点)

float4 Sharpen(float4 outp, float2 tex)
{
    
    float2 v2Pixelsite = tex* v2TexSize;//将归一化后的纹理坐标回复成原图片分辨率大小的对应坐标
    
    //当前点与相邻点的计算关系
    float3x3 mxOperators = float3x3(-1.0f, -1.0f, -1.0f
                                     , -1.0f, 9.0f, -1.0f
                                     , -1.0f, -1.0f, -1.0f);//此处用的是一个3x3大小的矩阵,意为将自身与周围相邻的8个像素相减。

    
    //用于获取相邻像素点的纹理位置
    float2 v2aUVDelta[3][3]
    =
    {
        { float2(-1.0f, -1.0f), float2(0.0f, -1.0f), float2(1.0f, -1.0f) },
        { float2(-1.0f, 0.0f), float2(0.0f, 0.0f), float2(1.0f, 0.0f) },
        { float2(-1.0f, 1.0f), float2(0.0f, 1.0f), float2(1.0f, 1.0f) },
    };
     float4 c4Color = float4(0.0f, 0.0f, 0.0f, 0.0f);
    
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            //计算采样点,得到当前像素附件的像素点的坐标(上下左右,八方)
            float2 v2NearbySite = v2Pixelsite + v2aUVDelta[i][j];
            
            
            c4Color += g_Tex.Sample(g_SamLinear, v2NearbyUV/v2TexSize) * mxOperators [i][j];


        }
    }
    outp.rgb = c4Color.rgb;
    return outp;

}

锐化效果

shape 三角形 android_c++_03


shape 三角形 android_shape 三角形 android_04


可以明显看到锐化后的图像变清晰了,但是主要是由于当前图片像素是512x512,分辨率较低。当使用的图片分辨率较高时,锐化的效果不一定会很好,而且还可能导致锐化后的图片种夹杂很多“亮点”,可以尝试更改锐化所用的矩形(如3x3更改为5x5)。