2009-06-21 14 views
32

मैं मुसीबत OpenGL ES में एक बनावट के लिए एक दृश्य प्रस्तुत करना सरल कोड ढूंढ़ कर दिया है की बनावट तैयार करने के लिए प्रस्तुत (iPhone के लिए विशेष रूप से, कि अगर मायने रखती है)। मुझे निम्नलिखित जानने में दिलचस्पी है:OpenGL ES

  1. ओपनजीएल ईएस में एक बनावट में आप एक दृश्य कैसे प्रस्तुत करते हैं?
  2. ओपनजीएल ES में एक रेंडर लक्ष्य बनाने में सक्षम बनावट बनाने के लिए आप किन पैरामीटर का उपयोग करना चाहिए?
  3. क्या इस प्रस्तुति वाले बनावट को अन्य प्राइमेटिव्स में लागू करने के साथ कोई प्रभाव है?

उत्तर

43

यह मैं इसे कैसे कर रहा हूँ है।

मैं एक बनावट चर (मैं का उपयोग एप्पल के Texture2D वर्ग, लेकिन आप एक ओपन बनावट आईडी का उपयोग कर सकते हैं अगर आप चाहते हैं), और एक फ्रेम बफर को परिभाषित:

Texture2d * texture; 
GLuint textureFrameBuffer; 
कुछ बिंदु पर

फिर, मैं बनावट बनाने , फ्रेम बफर और रेंडरबफर संलग्न करें। यह आपको केवल एक बार करने की जरूरत है:

texture = [[Texture2D alloc] initWithData:0 
          pixelFormat:kTexture2DPixelFormat_RGB888 
          pixelsWide:32 
          pixelsHigh:32 
          contentSize:CGSizeMake(width, height)]; 

// 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); 

// unbind frame buffer 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); 

हर बार जब मैं बनावट को प्रस्तुत करना चाहता हूँ, मुझे क्या करना: अपने प्रश्न के बारे में 3

glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer); 

... 
// GL commands 
... 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); 

, कि, यह आप के रूप में बनावट का उपयोग कर सकते अगर यह कोई अन्य बनावट है।

+0

मार्को, तुम्हें पता है कितना भूमि के ऊपर प्रत्येक बनावट आप में प्रस्तुत करने के लिए की जरूरत के लिए एक फ्रेमबफर और renderbuffer रखने में शामिल है क्या ज़रूरत है? मेरे पास कई बड़े बनावट हैं जिनके लिए मेरे ऐप को आकर्षित करने की ज़रूरत है, और मैं glframebufferTexture2DOES का उपयोग करके अलग-अलग "अतिरिक्त" फ्रेमबफर में घुमावदार रूप से संलग्न कर रहा हूं। प्रत्येक के लिए एक अलग फ्रेमबफर रखना बेहतर होगा? –

+0

क्या आप अपना कोड संपादित कर सकते हैं ताकि initWithData: ... कॉल स्क्रॉल किए बिना फिट बैठे? – nornagon

+0

ठीक है, संपादित, अब बेहतर दिखता है। –

9

एक बनावट आप एक बनावट के साथ जुड़े फ्रेमबफर का उपयोग करना चाहिए करने के लिए दृश्य प्रस्तुत करना करने के लिए। अपने ड्रा में _texture में दृश्य प्रस्तुत करना

GLuint _texture, _framebuffer; 
GLsizei w,h; 
float scale = [UIScreen mainScreen].scale; 
w = self.view.bounds.size.width * scale; 
h = self.view.bounds.size.height * scale; 
glGenTextureFromFramebuffer(&_texture, &_framebuffer, w, h); 

आप बाद में _framebuffer उपयोग कर सकते हैं:

void glGenTextureFromFramebuffer(GLuint *t, GLuint *f, GLsizei w, GLsizei h) 
{ 
    glGenFramebuffers(1, f); 
    glGenTextures(1, t); 

    glBindFramebuffer(GL_FRAMEBUFFER, *f); 

    glBindTexture(GL_TEXTURE_2D, *t); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *t, 0); 

    GLuint depthbuffer; 
    glGenRenderbuffers(1, &depthbuffer);  
    glBindRenderbuffer(GL_RENDERBUFFER, depthbuffer); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, w, h); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthbuffer); 

    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
    if(status != GL_FRAMEBUFFER_COMPLETE) 
     NSLog(@"Framebuffer status: %x", (int)status); 
} 

आप फ्रेम बफर और आसानी से बनावट बना सकते हैं: यहाँ एक विधि है कि मैं इसे आसान बनाने के लिए बनाया है विधि:

glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer); 
//draw here the content you want in the texture 
//_texture is now a texture with the drawn content 

//bind the base framebuffer 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 
//or if you use GLKit 
[view bindDrawable]; 
//draw normaly 

अब आप बनावट के साथ जो भी चाहते हैं वह कर सकते हैं। यदि आप कुछ पोस्ट प्रोसेसिंग (ब्लर, ब्लूम, छाया इत्यादि ...) करना चाहते हैं तो आप कर सकते हैं!

+0

हैलो, आपको '_renderToTextureBuffer' कहां से मिला? –

+0

_renderToTextureBuffer, sry – Anthony

+0

कूल, कि मैं क्या सोच रहा था _framebuffer मैं इसे सही है। क्या आपके पास यह एक कामकाजी उदाहरण में है? मैं इसे अपने कोड (दोबारा) में जोड़ने की कोशिश करूंगा, लेकिन मैं यह सुनिश्चित नहीं कर रहा हूं कि बनावट में आकर्षित करने के तरीके के बारे में यह सुनिश्चित नहीं है कि 'बनावट में जो सामग्री आप चाहते हैं,' क्या मैं इसे VBOs और 'glDrawArrays() ' ? –

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