2013-02-26 130 views
19

मैं .. एचएसवी के लिए आरजीबी रंग अंतरिक्ष से पारित करने के लिए की जरूरत है मैं इंटरनेट में खोज की है और दो अलग अलग कार्यान्वयन पाया, लेकिन उन मुझे अलग परिणाम:ओपन में एचएसवी के लिए आरजीबी से GLSL

एक:

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, g), 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, s, v); 
} 

बी:

precision mediump float; 
vec3 rgb2hsv(float r, float g, 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, s, v); 
} 

क्या आप जानते हैं जो सही कार्यान्वयन है?

उत्तर

65

मैं दूसरे कार्यान्वयन के लेखक हूं। यह हमेशा मेरे लिए सही ढंग से व्यवहार करता है, लेकिन आपने 2.0/6.0 के बजाय 2.9/6.9 लिखा था।

जब से तुम 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, 2.0/3.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 से लिया।

+0

मैंने shadertoy वेबसाइट पर यह कोशिश की और कहा कि कोई मिलान ओवरलोडेड फ़ंक्शन नहीं मिला है, मध्यम से वेक्टर 3 –

+0

अच्छा में परिवर्तित नहीं हो सकता है! क्या आपके पास पहले से ही एचएसएल कलर स्पेस के लिए समान प्रकार के फ़ंक्शन हैं? – wil

+1

[मैंने अभी हार्डवेयर मिश्रण के साथ 'hsv2rgb()' लागू किया है (http://stackoverflow.com/a/28897272/1888983)। पूरी तरह बेवकूफ लेकिन मैं अभी भी अपने आप पर गर्व से गर्व महसूस कर रहा हूं। – jozxyqk

2

मेरे पास जांच करने के लिए विकास वातावरण नहीं है, लेकिन आप कुछ आवेषण बनाने के लिए wolframAlpha का उपयोग कर सकते हैं।

For Instance: आरजीबी (1,0,0) (शुद्ध लाल) एचएसवी 0, 100%, एचएसवी में 100% है।