मैं एक GLSL टुकड़ा shader का उपयोग कर एक छवि का रंग बदलने की कोशिश कर रहा हूँ। मैं फ़ोटोशॉप के ह्यू / संतृप्ति समायोजन परत के समान कुछ हासिल करना चाहता हूं।
निम्नलिखित छवि में आप देख सकते हैं कि मुझे अब तक क्या मिला है। मैं हरे रंग के वर्ग के रंग को बदलना चाहता हूं, इसलिए यह दाईं ओर लाल वर्ग जैसा दिखता है, लेकिन इस शेडर के साथ मुझे आधा लाल आधा गुलाबी वर्ग (बीच में वर्ग) मिलता है।
मैं जो टुकड़े टुकड़े कर रहा हूं, वह बनावट के रंग को एचएसवी में परिवर्तित कर रहा है, फिर मैं एचएसवी रंग जोड़ता हूं, जो मुझे वर्टेकर के शेडर से मिलता है और मैं रंग को वापस आरजीबी में बदल देता हूं।
मैं क्या गलत कर रहा हूं?
टुकड़े टुकड़े करना:
precision mediump float;
varying vec2 vTextureCoord;
varying vec3 vHSV;
uniform sampler2D sTexture;
vec3 convertRGBtoHSV(vec3 rgbColor) {
float r = rgbColor[0];
float g = rgbColor[1];
float b = rgbColor[2];
float colorMax = max(max(r,g), b);
float colorMin = min(min(r,g), b);
float delta = colorMax - colorMin;
float h = 0.0;
float s = 0.0;
float v = colorMax;
vec3 hsv = vec3(0.0);
if (colorMax != 0.0) {
s = (colorMax - colorMin ) / colorMax;
}
if (delta != 0.0) {
if (r == colorMax) {
h = (g - b) / delta;
} else if (g == colorMax) {
h = 2.0 + (b - r) / delta;
} else {
h = 4.0 + (r - g) / delta;
}
h *= 60.0;
if (h < 0.0) {
h += 360.0;
}
}
hsv[0] = h;
hsv[1] = s;
hsv[2] = v;
return hsv;
}
vec3 convertHSVtoRGB(vec3 hsvColor) {
float h = hsvColor.x;
float s = hsvColor.y;
float v = hsvColor.z;
if (s == 0.0) {
return vec3(v, v, v);
}
if (h == 360.0) {
h = 0.0;
}
int hi = int(h);
float f = h - float(hi);
float p = v * (1.0 - s);
float q = v * (1.0 - (s * f));
float t = v * (1.0 - (s * (1.0 - f)));
vec3 rgb;
if (hi == 0) {
rgb = vec3(v, t, p);
} else if (hi == 1) {
rgb = vec3(q, v, p);
} else if (hi == 2) {
rgb = vec3(p, v, t);
} if(hi == 3) {
rgb = vec3(p, q, v);
} else if (hi == 4) {
rgb = vec3(t, p, v);
} else {
rgb = vec3(v, p, q);
}
return rgb;
}
void main() {
vec4 textureColor = texture2D(sTexture, vTextureCoord);
vec3 fragRGB = textureColor.rgb;
vec3 fragHSV = convertRGBtoHSV(fragRGB);
fragHSV += vHSV;
fragHSV.x = mod(fragHSV.x, 360.0);
fragHSV.y = mod(fragHSV.y, 1.0);
fragHSV.z = mod(fragHSV.z, 1.0);
fragRGB = convertHSVtoRGB(fragHSV);
gl_FragColor = vec4(convertHSVtoRGB(fragHSV), textureColor.w);
}
EDIT: सैम होसेवर ने अपने उत्तर में दिए गए कार्यों का उपयोग करते हुए, गुलाबी बैंड के साथ समस्या को हल किया है, लेकिन मैं केवल रंगीन स्पेक्ट्रम के आधे तक पहुंच सकता हूं। मैं रंग को लाल से हरे रंग में बदल सकता हूं, लेकिन मैं इसे नीले या गुलाबी में नहीं बदल सकता।
टुकड़े टुकड़े में, मैं अब यह कर रहा हूँ:
void main() {
vec4 textureColor = texture2D(sTexture, vTextureCoord);
vec3 fragRGB = textureColor.rgb;
vec3 fragHSV = rgb2hsv(fragRGB);
float h = vHSV.x / 360.0;
fragHSV.x *= h;
fragHSV.yz *= vHSV.yz;
fragHSV.x = mod(fragHSV.x, 1.0);
fragHSV.y = mod(fragHSV.y, 1.0);
fragHSV.z = mod(fragHSV.z, 1.0);
fragRGB = hsv2rgb(fragHSV);
gl_FragColor = vec4(hsv2rgb(fragHSV), textureColor.w);
}
int hi = int(h/60.0); float f = h/60.0 - float(hi);
बजाय इसका मतलब नहीं थाint hi = int(h); float f = h - float(hi);
? पता नहीं है कि अगर यह पैदा कर रहा है, यद्यपि।