2010-12-07 8 views
9

उदाहरण के साथ काम कर सकते हैं उदाहरण के लिए मैं GLImageProcessing का उपयोग करता हूं, लेकिन यह छवि को चमक और विपरीत दोनों के साथ संसाधित नहीं कर सकता है, इसलिए मैं चमक और विपरीत दोनों समायोजित करने के लिए कोड लिखता हूं, लेकिन यह काम नहीं कर सकता सब, किसी ने मुझे इस बारे में मदद कर सकते हैं कर सकते हैं, समीक्षाउदाहरण के लिए "GLImageProcessing" बहु फिल्टर

//init 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrthof(0, wide, 0, high, -1, 1); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glScalef(wide, high, 1);  
glBindTexture(GL_TEXTURE_2D, Input.texID); 


//bind result fbo 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, resultFBO); 
glViewport(0, 0, result.wide*result.s, result.high*result.t); 
glClear(GL_COLOR_BUFFER_BIT); 
glDisable(GL_BLEND); 



//process 1 adjust brightness 
float t = 1.2; 
glVertexPointer (2, GL_FLOAT, sizeof(V2fT2f), &flipquad[0].x); 
glTexCoordPointer(2, GL_FLOAT, sizeof(V2fT2f), &flipquad[0].s); 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 

static GLfloat constColor[4] = { 0.1, 0.2, 0.3, 0.4 }; 
if (t > 1.0f) 
{ 
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB,  GL_ADD); 
    //glColor4f(t-1, t-1, t-1, t-1); 
    constColor[0] = t-1; 
    constColor[1] = t-1; 
    constColor[2] = t-1; 
    constColor[3] = t-1; 
} 
else 
{ 
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB,  GL_SUBTRACT); 
    constColor[0] = 1-t; 
    constColor[1] = 1-t; 
    constColor[2] = 1-t; 
    constColor[3] = 1-t; 
} 


glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constColor); 

glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB,   GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB,   GL_CONSTANT); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA,  GL_TEXTURE); 


//process 2 adjust contrast 
t = 1.6; 
GLfloat h = t*0.5f; 

// One pass using two units: 
// contrast < 1.0 interpolates towards grey 
// contrast > 1.0 extrapolates away from grey 
// 
// Here, the general extrapolation 2*(Src*t + Dst*(0.5-t)) 
// can be simplified, because Dst is a constant (grey). 
// That results in: 2*(Src*t + 0.25 - 0.5*t) 
// 
// Unit0 calculates Src*t 
// Unit1 adds 0.25 - 0.5*t 
// Since 0.5*t will be in [0..0.5], it can be biased up and the addition done in signed space. 
glActiveTexture(GL_TEXTURE1); 
glEnable(GL_TEXTURE_2D); 
//glVertexPointer (2, GL_FLOAT, sizeof(V2fT2f), &flipquad[0].x); 
//glTexCoordPointer(2, GL_FLOAT, sizeof(V2fT2f), &flipquad[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_PREVIOUS); 
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_PREVIOUS); 


glDisable(GL_TEXTURE_2D); 
glActiveTexture(GL_TEXTURE2); 
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); 

//save to file 
snapshot(result,"/test3.jpg"); 

// 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); 
//process 3 adjust hue 

//process 4 mask 

//save to buffer 

//bind system rbo 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, SystemFBO); 
glCheckError(); 
+0

किसी ने इस सवाल का जवाब कृपया! मेरे साथ भी वही दिक्कत है। – Allyn

+0

थोड़ा और जानकारी देने के लिए, मूल रूप से इस ऐप में फ़िल्टर किए गए फ़िल्टर का एक सेट होता है, जिसे ओपनजीएल-एसएस में लागू किया जाता है। डेमो ऐप केवल आपको एक समय में इन फ़िल्टरों में से एक को लागू करने देता है। इन फिल्टरों में से किसी भी संख्या को लागू करने की अनुमति देने का एक समाधान, या ऐसा करने का वर्णन, बहुत उपयोगी होगा। – Allyn

+0

मैं अब इस मुद्दे के साथ काम करने के लिए अधिक framebufferobject का उपयोग कर रहा हूँ। – Cylon

उत्तर

12

multitexturing का उपयोग करने के लिए धन्यवाद, यह इस समस्या यह है कि एक पास में चाल करना होगा करने के लिए एक समाधान खोजने के लिए संभव हो जाना चाहिए। दुर्भाग्यवश, पहले आईफोन के पावरवीआर एमबीएक्स जीपीयू में केवल 2 बनावट इकाइयां हैं (न्यूनतम ओपनजीएल ईएस 1.1 मानक द्वारा आवश्यक) जो दोनों फ़िल्टरों को लागू करने के लिए पर्याप्त नहीं होगा। मुझे लगता है कि हाल के हार्डवेयर में आठ बनावट इकाइयां हो सकती हैं और एक एकल पास समाधान मिल सकता है।

एक और सामान्य दृष्टिकोण, जो आपको जितना चाहें उतने फ़िल्टर लागू करने की अनुमति देगा, फ्रेम बफर ऑब्जेक्ट्स का शाब्दिक रूप से "रेंडर-टू-बनावट" का उपयोग करना है। यहां एक अन्य पोस्ट का एक लिंक है जो तकनीक को रेखांकित करता है: OpenGL ES Render to texture

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

यहाँ कैसे 2 फिल्टर के लिए यह करने के लिए पर कुछ नमूना कोड है:

// Remember the FBO being used for the display framebuffer 
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, (GLint *)&SystemFBO); 

// Create the texture and the FBO the will hold the result of applying the first filter 
glGenTextures(1, &ResultTexture); 
glBindTexture(GL_TEXTURE_2D, ResultTexture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
glGenFramebuffersOES(1, &ResultFBO); 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, ResultFBO); 
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, ResultTexture, 0); 

// bind the result FBO 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, ResultFBO); 

// apply 1st filter 
... 

// restore original frame buffer object 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, SystemFBO); 

// use ResultTexture as input for the 2nd filter 
glBindTexture(GL_TEXTURE_2D, ResultTexture); 

// apply 2nd filter 
... 
+0

आपके उत्तर के लिए धन्यवाद, मैं इसे पहले से ही कर चुका हूं, और अब मुझे पता है कि मैं केवल एक बार 2 बनावट का उपयोग क्यों कर सकता हूं। अधिकतम बनावट पाने के लिए क्या कार्य है? – Cylon

+0

हां, आप निम्नलिखित कोड के साथ उपलब्ध बनावट इकाई गिनती के लिए सिस्टम से पूछ सकते हैं: glGetIntegerv (GL_MAX_TEXTURE_UNITS, और texture_unit_count); – Ozirus

+0

मुझे सिम्युलेटर और टच 4 – Cylon

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