GPU 上的 HSL 图像调整

作者:编程家 分类: c++ 时间:2025-12-31

GPU 上的 HSL 图像调整案例代码及实现

在计算机图形学中,HSL(色相、饱和度和亮度)是一种常用的颜色模型,它可以用来对图像进行颜色调整。在这篇文章中,我们将介绍如何利用 GPU 来实现 HSL 图像调整,并给出一个简单的案例代码。

什么是 HSL 图像调整

HSL 图像调整是指通过改变图像中像素的色相、饱和度和亮度的值来调整图像的颜色。色相(Hue)表示颜色的种类,饱和度(Saturation)表示颜色的纯度,亮度(Luminance)表示颜色的明暗程度。通过调整这三个参数,我们可以改变图像的整体颜色效果,使其更加鲜艳、柔和或者其他特定的风格。

GPU 上的 HSL 图像调整

GPU 是图像处理的重要工具之一,它可以并行处理大量的像素数据,提高图像处理的效率。在 GPU 上实现 HSL 图像调整,可以利用 GPU 的并行计算能力,同时处理多个像素数据,达到实时处理图像的效果。

在实现 HSL 图像调整的过程中,我们需要将图像从 RGB(红绿蓝)颜色空间转换为 HSL 颜色空间,进行调整后再转换回 RGB 颜色空间。这个过程可以通过编写自定义的 GPU 着色器来实现。

以下是一个简单的 HSL 图像调整的案例代码,使用 Unity 引擎和 ShaderLab 语言实现:

shader

Shader "Custom/HSLAdjustment" {

Properties {

_MainTex ("Texture", 2D) = "white" {}

_HueShift ("Hue Shift", Range(-180, 180)) = 0

_Saturation ("Saturation", Range(-1, 1)) = 0

_Luminance ("Luminance", Range(-1, 1)) = 0

}

SubShader {

Tags { "RenderType"="Opaque" }

LOD 200

CGPROGRAM

#pragma surface surf Lambert

sampler2D _MainTex;

float _HueShift;

float _Saturation;

float _Luminance;

struct Input {

float2 uv_MainTex;

};

void surf (Input IN, inout SurfaceOutput o) {

float4 tex = tex2D(_MainTex, IN.uv_MainTex);

float3 hsl = rgb2hsl(tex.rgb);

// 色相调整

hsl.x += _HueShift / 360;

hsl.x = frac(hsl.x);

// 饱和度调整

hsl.y += _Saturation;

hsl.y = clamp(hsl.y, 0, 1);

// 亮度调整

hsl.z += _Luminance;

hsl.z = clamp(hsl.z, 0, 1);

float3 rgb = hsl2rgb(hsl);

o.Albedo = rgb;

o.Alpha = tex.a;

}

float3 rgb2hsl(float3 rgb) {

float r = rgb.r;

float g = rgb.g;

float b = rgb.b;

float maxVal = max(max(r, g), b);

float minVal = min(min(r, g), b);

float h, s, l;

l = (maxVal + minVal) / 2;

if (maxVal == minVal) {

h = 0;

s = 0;

} else {

float d = maxVal - minVal;

s = l > 0.5 ? d / (2 - maxVal - minVal) : d / (maxVal + minVal);

if (maxVal == r) {

h = (g - b) / d + (g < b ? 6 : 0);

} else if (maxVal == g) {

h = (b - r) / d + 2;

} else {

h = (r - g) / d + 4;

}

h /= 6;

}

return float3(h, s, l);

}

float3 hsl2rgb(float3 hsl) {

float h = hsl.x;

float s = hsl.y;

float l = hsl.z;

float r, g, b;

if (s == 0) {

r = l;

g = l;

b = l;

} else {

float q = l < 0.5 ? l * (1 + s) : l + s - l * s;

float p = 2 * l - q;

r = hue2rgb(p, q, h + 1/3);

g = hue2rgb(p, q, h);

b = hue2rgb(p, q, h - 1/3);

}

return float3(r, g, b);

}

float hue2rgb(float p, float q, float t) {

if (t < 0) t += 1;

if (t > 1) t -= 1;

if (t < 1/6) return p + (q - p) * 6 * t;

if (t < 1/2) return q;

if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;

return p;

}

ENDCG

}

}

案例代码解析

以上案例代码中,我们定义了一个自定义的 Shader "Custom/HSLAdjustment" 来实现 HSL 图像调整。其中,我们通过 Properties 来定义了输入的纹理、色相、饱和度和亮度的参数。在 surf 函数中,我们首先将输入的纹理颜色转换为 HSL 颜色空间,然后根据参数调整 HSL 值,最后再将 HSL 颜色转换回 RGB 颜色空间,并输出到 o.Albedo 中。

使用案例代码

要使用以上案例代码进行 HSL 图像调整,你需要在 Unity 引擎中创建一个材质,将以上 Shader "Custom/HSLAdjustment" 赋予该材质,并设置相应的参数来实现图像调整。你可以通过修改 _HueShift、_Saturation 和 _Luminance 参数的值来调整图像的色相、饱和度和亮度。

这是一个简单的案例代码,通过 GPU 实现了 HSL 图像调整。你可以根据自己的需求进一步扩展和优化该代码,实现更多的图像处理效果。希望本文对你理解 GPU 上的 HSL 图像调整有所帮助。