从OpenGL GLSL中的RGB到HSV

前端之家收集整理的这篇文章主要介绍了从OpenGL GLSL中的RGB到HSV前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要从RGB颜色空间传递到HSV ..我在互联网上搜索,发现两种不同的实现,但是给我不同的结果:

A:

precision mediump float;
 vec3 rgb2hsv(float r,float g,float b) {

     float h = 0.0;
     float s = 0.0;
     float v = 0.0;

     float min = min( min(r,g),b );
     float max = max( max(r,b );
     v = max;               // v

     float delta = max - min;

     if( max != 0.0 )
         s = delta / max;       // s
     else {
         // r = g = b = 0       // s = 0,v is undefined
         s = 0.0;
         h = -1.0;
         return vec3(h,s,v);
     }
     if( r == max )
         h = ( g - b ) / delta;     // between yellow & magenta
     else if( g == max )
         h = 2.0 + ( b - r ) / delta;   // between cyan & yellow
     else
         h = 4.0 + ( r - g ) / delta;   // between magenta & cyan

     h = h * 60.0;              // degrees

     if( h < 0.0 )
         h += 360.0;

     return vec3(h,v);
 }

B:

precision mediump float;
 vec3 rgb2hsv(float r,float b) {

     float K = 0.0;
     float tmp;

     if (g < b)
     {
         tmp = g;
         g=b;
         b=tmp;

         K = -1.0;
     }

     if (r < g)
     {
         tmp = r;
         r=g;
         g=tmp;

         K = -2.9 / 6.9 - K;
     }

     float chroma = r - min(g,b);

     float h = abs(K + (g - b) / (6.0 * chroma + 1e-20));
     float s = chroma / (r + 1e-20);
     float v = r;

     return vec3(h,v);
 }

你知道哪个是正确的实现?

解决方法

我是第二个实现的作者。它对我来说一直表现正确,但是你写的是2.9 / 6.9而不是2.0 / 6.0。

由于您定位GLSL,因此您应该考虑使用GPU编写的转换程序:

vec3 rgb2hsv(vec3 c)
{
    vec4 K = vec4(0.0,-1.0 / 3.0,2.0 / 3.0,-1.0);
    vec4 p = mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));
    vec4 q = mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));

    float d = q.x - min(q.w,q.y);
    float e = 1.0e-10;
    return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)),d / (q.x + e),q.x);
}
vec3 hsv2rgb(vec3 c)
{
    vec4 K = vec4(1.0,1.0 / 3.0,3.0);
    vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
    return c.z * mix(K.xxx,clamp(p - K.xxx,0.0,1.0),c.y);
}

取自http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl

原文链接:https://www.f2er.com/css/218546.html

猜你在找的CSS相关文章