opengl - जीएलएसएल के साथ बनावट के रंग को कैसे बदलें?




filter glsl (2)

जबकि @ वाउडलैंड कहता है कि सही है, यह तरीका चमक में परिवर्तन के साथ मुद्दों का कारण बन सकता है, मुझे विश्वास है।

एचएसवी और एचएलएस रंग प्रणाली कई कारणों से समस्याग्रस्त हैं। मैंने हाल ही में इस बारे में एक रंग वैज्ञानिक से बात की, और उनकी सिफारिश YIQ या YCbCr स्थान में कनवर्ट करना था और तदनुसार क्रोमो चैनल (आई एंड क्यू, या सीबी और सीआर) को समायोजित करना था। (आप सीख सकते हैं कि here और here कैसे here ।)

एक बार उन रिक्त स्थानों में से एक में, आप क्रोमा चैनल द्वारा गठित कोण से रंग प्राप्त कर सकते हैं, hue = atan(cr/cb) (cb == 0 के लिए देखकर) कर सकते हैं। यह आपको रेडियंस में एक मूल्य देता है। बस घुमावदार रोटेशन राशि जोड़कर इसे घुमाएं। एक बार ऐसा करने के बाद, आप chroma = sqrt(cr*cr+cb*cb) साथ chroma = sqrt(cr*cr+cb*cb) की परिमाण की गणना कर सकते हैं। आरजीबी पर वापस जाने के लिए, Cr = chroma * sin (hue) , Cb = chroma * cos (hue) का उपयोग कर नए सीबी और सीआर (या आई और क्यू) की गणना करें। फिर उपरोक्त वेब पृष्ठों पर वर्णित आरजीबी में वापस कनवर्ट करें।

संपादित करें: यहां एक समाधान है जिसे मैंने परीक्षण किया है और मुझे आपके संदर्भ के समान परिणाम देने लगता है। आप मैट्रिक्स गुणा में कुछ डॉट उत्पादों को शायद पतन कर सकते हैं:

uniform sampler2DRect inputTexture;
uniform float   hueAdjust;
void main ()
{
    const vec4  kRGBToYPrime = vec4 (0.299, 0.587, 0.114, 0.0);
    const vec4  kRGBToI     = vec4 (0.596, -0.275, -0.321, 0.0);
    const vec4  kRGBToQ     = vec4 (0.212, -0.523, 0.311, 0.0);

    const vec4  kYIQToR   = vec4 (1.0, 0.956, 0.621, 0.0);
    const vec4  kYIQToG   = vec4 (1.0, -0.272, -0.647, 0.0);
    const vec4  kYIQToB   = vec4 (1.0, -1.107, 1.704, 0.0);

    // Sample the input pixel
    vec4    color   = texture2DRect (inputTexture, gl_TexCoord [ 0 ].xy);

    // Convert to YIQ
    float   YPrime  = dot (color, kRGBToYPrime);
    float   I      = dot (color, kRGBToI);
    float   Q      = dot (color, kRGBToQ);

    // Calculate the hue and chroma
    float   hue     = atan (Q, I);
    float   chroma  = sqrt (I * I + Q * Q);

    // Make the user's adjustments
    hue += hueAdjust;

    // Convert back to YIQ
    Q = chroma * sin (hue);
    I = chroma * cos (hue);

    // Convert back to RGB
    vec4    yIQ   = vec4 (YPrime, I, Q, 0.0);
    color.r = dot (yIQ, kYIQToR);
    color.g = dot (yIQ, kYIQToG);
    color.b = dot (yIQ, kYIQToB);

    // Save the result
    gl_FragColor    = color;
}

जीएलएसएल (खंड शेडर) का उपयोग कर 2 डी ओपनजीएल बनावट के रंग को कुशलता से बदलने का कोई तरीका है?

क्या किसी के पास इसके लिए कुछ कोड है?

अद्यतन: यह उपयोगकर्ता 1118321 सुझाव के परिणामस्वरूप कोड है:

uniform sampler2DRect texture;
const mat3 rgb2yiq = mat3(0.299, 0.587, 0.114, 0.595716, -0.274453, -0.321263, 0.211456, -0.522591, 0.311135);
const mat3 yiq2rgb = mat3(1.0, 0.9563, 0.6210, 1.0, -0.2721, -0.6474, 1.0, -1.1070, 1.7046);
uniform float hue;

void main() {

vec3 yColor = rgb2yiq * texture2DRect(texture, gl_TexCoord[0].st).rgb; 

float originalHue = atan(yColor.b, yColor.g);
float finalHue = originalHue + hue;

float chroma = sqrt(yColor.b*yColor.b+yColor.g*yColor.g);

vec3 yFinalColor = vec3(yColor.r, chroma * cos(finalHue), chroma * sin(finalHue));
gl_FragColor    = vec4(yiq2rgb*yFinalColor, 1.0);
}

और यह एक संदर्भ के मुकाबले परिणाम है:

मैंने एट के अंदर क्यू के साथ स्विच करने की कोशिश की है, लेकिन परिणाम 0 डिग्री के आसपास भी गलत है

क्या आपको कोई इशारा मिला है?

यदि तुलना के लिए आवश्यक है, तो यह मूल असम्बद्ध छवि है:


नेट पर वाईआईक्यू उदाहरणों की तुलना में एंड्रिया 3000, मैं आपके पोस्टिंग में आया, लेकिन मुझे लगता है कि आपके कोड के 'अपडेटेड' संस्करण के साथ कोई समस्या है .... मुझे यकीन है कि आपकी 'mat3' परिभाषाएं फ्लिप / फ्लॉप हो गई हैं कॉलम / पंक्ति ऑर्डरिंग ... (शायद यही कारण है कि आपको अभी भी परेशानी हो रही है) ...

एफवाईआई: ओपनजीएल मैट्रिक्स ऑर्डरिंग: "अधिक मूल्यों के लिए, कॉलम-ऑर्डर ऑर्डर में मैट्रिस भर जाते हैं। यानी, पहला एक्स मान पहला कॉलम होता है, दूसरा एक्स मान अगला कॉलम होता है, और आगे।" देखें: http://www.opengl.org/wiki/GLSL_Types

mat2(
float, float,   //first column
float, float);  //second column