2009-10-01 11 views
6

के साथ चमक और विपरीतता लागू करना मैं आईफोन पर बनावट के विपरीत और चमक को बदलना चाहता हूं। मैं सेब (GLImageProcessing) द्वारा प्रदान किए गए नमूने को देख रहा हूं, लेकिन यह केवल एक समय में करने में सक्षम है (नमूना में दोनों विधियों को पिछले परिणाम ओवरराइट करता है)।ओपनजीएल ES

चमक महान काम करता है:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
if (brightness >= 1.0f) { 
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD); 
    glColor4f(brightness-1, brightness-1, brightness-1, brightness-1); 
} else { 
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_SUBTRACT); 
    glColor4f(1-brightness, 1-brightness, 1-brightness, 1-brightness); 
} 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PRIMARY_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE); 
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 

मैं कैसे इस के बाद बनावट के विपरीत जोड़ने के साथ जाना चाहते हैं? वैकल्पिक रूप से ओपनजीएल ईएस 2.0 में जाने और शेडर्स के साथ ऐसा करने का बेहतर विकल्प होगा?

यहाँ सेब से नमूने में इसके विपरीत के लिए कोड है:

glActiveTexture(GL_TEXTURE0); 
glVertexPointer (2, GL_FLOAT, sizeof(V2fT2f), &quad[0].x); 
glTexCoordPointer(2, GL_FLOAT, sizeof(V2fT2f), &quad[0].s); 

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PRIMARY_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_INTERPOLATE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE); 

glActiveTexture(GL_TEXTURE1); 
glEnable(GL_TEXTURE_2D); 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD_SIGNED); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PRIMARY_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_ALPHA); 
glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, 2); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS); 

glColor4f(h, h, h, 0.75 - 0.5 * h); // 2x extrapolation 
validateTexEnv(); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

// Restore state 
glDisable(GL_TEXTURE_2D); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, 1); 
glActiveTexture(GL_TEXTURE0); 

आप शायद ओपन (ईएस) के साथ मेरा अनुभव अनुमान लगा सकते हैं सुंदर तो कुछ भी सीमित है कि मुझे सही दिशा में इशारा करता है बहुत सराहना

+0

हैलो अंटी, आप एक मिला आपकी समस्या का समाधान? मेरी भी जानने की इच्छा होगी। अग्रिम धन्यवाद! –

उत्तर

1

आप चमक-समायोजित छवि को उसी आकार के फ्रेमबफर बनावट में प्रस्तुत कर सकते हैं, फिर आप इस बनावट को स्क्रीन पर प्रस्तुत करते हुए कंट्रास्ट समायोजन करें।

Image -> [Brightness] -> Texture -> [Contrast] -> Screen 

framebuffers पर कुछ उपयोगी पढ़ने और प्रस्तुत करना करने वाली बनावट:

7

कम से कम ओपनजीएल 2.1 (मैंने ओपनजीएल ईएस का उपयोग नहीं किया है) में एक टुकड़ा शेडर के साथ करना बहुत आसान है। पुस्तक "ओपनजीएल छायांकन भाषा" में अध्याय 1 9 में छवि प्रसंस्करण शामिल है। वे चमक और विपरीतता को समायोजित करने के लिए शेडर्स देते हैं। यहाँ मेरी संस्करण है, जो दो आधा और आधा जोड़ती है:

uniform sampler2D Texture; 
uniform float Brightness; 
uniform float Contrast; 
uniform vec4 AverageLuminance; 

void main(void) 
{ 
    vec4 texColour = texture2D(Texture, gl_TexCoord[0].st); 
    gl_FragColor = mix(texColour * Brightness, 
     mix(AverageLuminance, texColour, Contrast), 0.5); 
} 

संपादित करें: पूर्णता के लिए कुछ और जानकारी ...

चमक और कॉन्ट्रास्ट 1.0 के आधार मूल्य है, तो गुजर कि दोनों के लिए बनावट अपरिवर्तित छोड़ देंगे। 1.0 से कम मान चमक को कम करेगा, और 1.0 से अधिक मान इसे बढ़ाएगा। इसके विपरीत 1.0 से कम मान बनावट को अधिक ग्रे (कम विपरीत) बना देगा, और 1.0 से अधिक मान इसे कम ग्रे (अधिक विपरीत) बना देगा।

आप त्वरित और गंदे भूरे रंग के मूल्य के लिए औसत ल्यूमिनेंस के लिए (0.5, 0.5, 0.5, 1.0) पास कर सकते हैं, लेकिन बेहतर परिणाम आपके बनावट के लिए उचित औसत चमक की गणना करके प्राप्त किए जाएंगे।

+0

मैं ओपनजीएल ईएस 1.1 (डिवाइस समर्थन के कारण) से चिपकना पसंद करता हूं, जो खंड के शेडरों का समर्थन नहीं करता है। शेडर्स के बिना ऐसा करने पर कोई विचार? हालांकि इसके लिए धन्यवाद, बैकअप – Antti

+0

के रूप में आपका स्वागत है आपका स्वागत है। यह मुझे शेडर्स के साथ खेलने के लिए कुछ और करने का अच्छा बहाना देता है :-) क्षमा करें, शायद मुझे गैर-शेडर समाधान के साथ बहुत मदद नहीं होगी। बनावट संयोजक मुझे सबसे अच्छे समय में सिरदर्द देते हैं, और वे ऐप्पल बहुत भयानक हैं। –

0

मेरा जीएल थोड़ी जंगली है, लेकिन नमूना कोड से ये दोनों मौजूदा दृश्य के साथ मिश्रण करने के लिए एक बनावट बना रहे हैं। इसलिए आप दोनों बनावट बनाने में सक्षम हो सकते हैं, यह सुनिश्चित कर लें कि वे एक-दूसरे पर नहीं हैं और फिर दोनों जगहों पर मिश्रण करें। वे अलग-अलग चीजें कर रहे हैं हालांकि मुझे संदेह है कि आप उन्हें एक ही बनावट में जोड़ सकेंगे। मैं पहले कंट्रास्ट ऑर्डर करता हूं क्योंकि यह एक अधिक जटिल मिश्रण है।

संबंधित मुद्दे