2009-10-30 19 views
7

मैं बनावट में प्रस्तुत करने की कोशिश कर रहा हूं, फिर आईफोन पर ओपनजीएल ईएस का उपयोग करके उस बनावट को स्क्रीन पर खींचें। मैं शुरुआती बिंदु के रूप में this question का उपयोग कर रहा हूं, और ऐप्पल के डेमो EAGLView के उप-वर्ग में ड्राइंग कर रहा हूं।ओपनजीएल ईएस बनावट को प्रस्तुत करता है, फिर बनावट

उदाहरण चर:

GLuint textureFrameBuffer; 
Texture2D * texture; 

फ्रेम बफर और बनावट को प्रारंभ करने के लिए, मैं यह कर रहा हूँ:

GLint oldFBO; 
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &oldFBO); 

// initWithData results in a white image on the device (works fine in the simulator) 
texture = [[Texture2D alloc] initWithImage:[UIImage imageNamed:@"blank320.png"]]; 

// create framebuffer 
glGenFramebuffersOES(1, &textureFrameBuffer); 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer); 

// attach renderbuffer 
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture.name, 0); 

if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) 
    NSLog(@"incomplete"); 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, oldFBO); 

अब, अगर मैं बस हमेशा की तरह स्क्रीन करने के लिए अपने दृश्य आकर्षित, यह ठीक काम करता है:,

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
// draw some triangles, complete with vertex normals 
[contentDelegate draw]; 
[self swapBuffers]; 

लेकिन अगर मैं, 'textureFrameBuffer' के लिए प्रस्तुत करना फिर 'बनावट' स्क्रीन करने के लिए आकर्षित है, जिसके परिणामस्वरूप im उम्र उल्टा है और "अंदरूनी" है। ऐसा लगता है, ऐसा लगता है कि 3 डी ऑब्जेक्ट्स के मानक बाहरी के बजाए अंदर की ओर इशारा करते हैं - प्रत्येक ऑब्जेक्ट का सबसे बड़ा चेहरा पारदर्शी है, और मैं पीछे के चेहरे के अंदर देख सकता हूं। कोड यह रहा:

GLint oldFBO; 
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &oldFBO); 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

// draw some polygons 
[contentDelegate draw]; 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, oldFBO); 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnable(GL_TEXTURE_2D); 
glColor4f(1, 1, 1, 1); 
[texture drawInRect:CGRectMake(0, 0, 320, 480)];  
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisable(GL_TEXTURE_2D); 

[self swapBuffers]; 

मैं (glTexCoordPointer) का क्रम बदल कर आसानी से पर्याप्त छवि rightside-अप फ्लिप कर सकते हैं तदनुसार निर्देशांक (Texture2D के drawInRect विधि में), लेकिन यह "अंदर से बाहर" इस ​​मुद्दे को हल नहीं करता है।

मैंने मैन्युअल रूप से बनाए गए ओपनजीएल बनावट के साथ Texture2D बनावट को बदलने की कोशिश की, और परिणाम वही था। एक पीएनजी छवि से लोड एक Texture2D ड्राइंग ठीक काम करता है।

वस्तुओं को चित्रित करने के लिए, प्रत्येक वर्टेक्स में एक इकाई सामान्य निर्दिष्ट होती है, और GL_NORMALIZE सक्षम है।

glVertexPointer(3, GL_FLOAT, 0, myVerts); 
glNormalPointer(GL_FLOAT, 0, myNormals); 
glDrawArrays(GL_TRIANGLES, 0, numVerts); 

सबकुछ स्क्रीन पर प्रस्तुत होने पर ठीक हो जाता है; GL_DEPTH_TEST सक्षम है और बहुत अच्छा काम कर रहा है।

इसे ठीक करने के तरीके के बारे में कोई सुझाव? धन्यवाद!

+0

"अंदरूनी" समस्या के लिए: यदि आपके सामने वाले प्राइमेटिव्स को खींचा जाता है, तो आपको वर्टेक्स ऑर्डरिंग के साथ कोई समस्या है, जिसका उपयोग सामान्य सामान्य रूप से निर्धारित करने के लिए किया जाता है। यह texturing के साथ कोई मुद्दा नहीं है, जब तक कि मैं कुछ गलत समझ रहा हूँ। क्या आपके पास GL_CULL_FACE सक्षम है? – prideout

+0

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

उत्तर

3

इसका दिलचस्प हिस्सा यह है कि बैकबफर पर सीधे ड्राइंग करते समय आप एक अलग परिणाम देख रहे हैं। चूंकि आप आईफोन प्लेटफ़ॉर्म पर हैं, इसलिए आप हमेशा एक एफबीओ पर ड्राइंग कर रहे हैं, भले ही आप बैकबफर पर आ रहे हों।

सुनिश्चित करें कि आपके पास अपने ऑफस्क्रीन एफबीओ से गहराई से बफर संलग्न है। आपके प्रारंभिक कोड में, आप glBindFramebufferOES (...) के बाद निम्न स्निपेट को जोड़ना चाहेंगे।

// attach depth buffer 
GLuint depthRenderbuffer; 
glGenRenderbuffersOES(1, &depthRenderbuffer); 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); 
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, width, height); 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); 
+0

आप कुछ पर हो सकते हैं, लेकिन यह अभी तक काम नहीं कर रहा है ... ऐसा करने और बनावट (पहले की तरह) को जोड़ने के बाद, glCheckFramebufferStatusOES (GL_FRAMEBUFFER_OES) GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES देता है। क्या फ्रेमबफर को इसके साथ जुड़े रंग रेंडरबफर की भी आवश्यकता है? (जल्दी से कोशिश की, अभी तक कोई भाग्य नहीं है, लेकिन मैं इसे रखूंगा।) आपकी मदद के लिए धन्यवाद, मैं वास्तव में इसकी सराहना करता हूं। –

+0

ओह, मुझे बैकबफर में उस प्रतिपादन को जोड़ना था, फिर glCopyTexSubImage2D का उपयोग करके मेरी छवि में प्रतिलिपि बनाना, फिर छवि कार्यों को प्रदर्शित करना (सबकुछ जिस तरह से करना चाहिए), यह दर्दनाक रूप से धीमा है। मेरे बफर के साथ क्या गलत है यह जानने के लिए ... –

+0

दिलचस्प। हां, आपको एक रंग रेंडरबफर भी संलग्न करने की आवश्यकता है। वैसे, यह संबंधित नहीं है, लेकिन आप यह सुनिश्चित करना चाहते हैं कि आपके बनावट ऑब्जेक्ट में दो आकार का पावर है ताकि यह पुराने iPhones के साथ काम करे। शुभकामनाएं! – prideout

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