আমি একটি জিএলএসএল ফ্রেগমেন্ট শ্যাডার ব্যবহার করে একটি চিত্রের বর্ণ পরিবর্তন করার চেষ্টা করছি। আমি ফটোশপের হিউ / স্যাচুরেশন অ্যাডজাস্টমেন্ট স্তরটির অনুরূপ কিছু অর্জন করতে চাই।
নিম্নলিখিত ছবিতে আপনি দেখতে পেয়েছি এখন পর্যন্ত আমি কী পেয়েছি। আমি সবুজ বর্গক্ষেত্রের বর্ণটি পরিবর্তন করতে চাই যাতে ডানদিকে লাল বর্গক্ষেত্রের মতো লাগে তবে এই শেডারটি দিয়ে আমি অর্ধেক লাল অর্ধেক গোলাপী বর্গক্ষেত্রটি (মাঝখানে বর্গাকার) পাই get
আমি খণ্ড শ্যাডারে যা করছি তা টেক্সচারের রঙটিকে এইচএসভিতে রূপান্তরিত করছে, তারপরে আমি এইচএসভি রঙটি যুক্ত করব যা আমি ভার্টেক্স শেডার থেকে এতে পেয়েছি এবং আমি রঙটি আরজিবিতে রূপান্তর করি।
আমি কি ভুল করছি?
খণ্ড শ্যাডার:
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);
}
সম্পাদনা: স্যাম হোসেভার তার উত্তরে প্রদত্ত ফাংশনগুলি ব্যবহার করে গোলাপী ব্যান্ডগুলির সাথে সমস্যাটি সমাধান হয়েছে তবে আমি কেবল বর্ণ বর্ণের অর্ধেক পর্যন্ত পৌঁছতে পারি। আমি রঙটি লাল থেকে সবুজতে পরিবর্তন করতে পারি তবে আমি এটিকে নীল বা গোলাপী রঙে পরিবর্তন করতে পারি না।
খণ্ড শ্যাডারে, আমি এখন এটি করছি:
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);
? যদিও এটি কারণ সৃষ্টি করছে কিনা তা জানেন না।