2012-02-12 15 views
6

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

void init_rendered_FBO() { 
    glGenFramebuffers(1,&fbo); 
    glBindFramebuffer(GL_FRAMEBUFFER, fbo); 
    glGenTextures(1,&fbo_tex); 
    glBindTexture(GL_TEXTURE_2D, fbo_tex); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width_screen, height_screen, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
    glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, width_screen, height_screen); 
    glBindTexture (GL_TEXTURE_2D, 0); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo_tex, 0); 
    int objectType; 
    glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE,&objectType); 
    ASSERT(objectType == GL_TEXTURE); 
    int objectName; 
    glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,&objectName); 
    ASSERT(glIsTexture(objectName) == GL_TRUE); 
    int wid, hei, fmt; 
    glBindTexture(GL_TEXTURE_2D, objectName); 
    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &wid); 
    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &hei); 
    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, 
      &fmt); 
    glBindTexture(GL_TEXTURE_2D, 0); 
    std::string format = convertInternalFormatToString(fmt); 
    std::cout << "Color attachment 0: " << objectName << " " << wid << "x" << hei << ", " << format << std::endl; 
    ASSERT(checkFramebufferStatus()); 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
} 

// this is the init function that gets called. 
void init_rendered_multisample_FBO() { 
    init_rendered_FBO(); 
    // now I'm going to set up the additional component necessary to perform multisampling which is a new fbo 
    // that has a multisampled color buffer attached. I won't need a multisample depth buffer. 
    glGenFramebuffers(1,&multi_fbo); 
    glBindFramebuffer(GL_FRAMEBUFFER,multi_fbo); 
    glGenRenderbuffers(1,&renderbuffer_multi); 
    glBindRenderbuffer(GL_RENDERBUFFER,renderbuffer_multi); 
    glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA, width_screen,height_screen); 
    glBindRenderbuffer(GL_RENDERBUFFER,0); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer_multi); 
    int objectType; 
    glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE,&objectType); 
    ASSERT(objectType == GL_RENDERBUFFER); 
    int objectName; 
    glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,&objectName); 
    ASSERT(glIsRenderbuffer(objectName) == GL_TRUE); 
    glBindRenderbuffer(GL_RENDERBUFFER,objectName); 
    int wid,hei,fmt,sam; 
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,GL_RENDERBUFFER_WIDTH,&wid); 
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,GL_RENDERBUFFER_HEIGHT,&hei); 
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,GL_RENDERBUFFER_INTERNAL_FORMAT,&fmt); 
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,GL_RENDERBUFFER_SAMPLES,&sam); 
    glBindRenderbuffer(GL_RENDERBUFFER,0); 
    printf("Renderbuffer: %dx%d, fmt=%d, samples=%d\n",wid,hei,fmt,sam); 
    ASSERT(checkFramebufferStatus()); 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
} 
// this is called after rendering to multi_fbo 
void resolve_multisample_FBO() { 
    glBindFramebuffer(GL_READ_FRAMEBUFFER, multi_fbo); 
    glReadBuffer(GL_COLOR_ATTACHMENT0); 
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); 
    GLenum drawbuf = GL_COLOR_ATTACHMENT0; 
    glDrawBuffers(1,&drawbuf); 
    glBlitFramebuffer(0,0,width_screen,height_screen,0,0,width_screen,height_screen,GL_COLOR_BUFFER_BIT,GL_NEAREST); 
} 

क्या आप छोड़कर कुछ भी छोड़ सकते हैं? मुझे लगता है कि यह समस्या glFramebufferRenderbuffer कॉल के साथ हो सकती है। मैंने पहले तर्क को GL_READ_FRAMEBUFFER पर स्विच करने का प्रयास किया लेकिन यह ठीक नहीं हुआ।

मैं glGetError की जांच करता हूं और इसमें कोई त्रुटि नहीं है। अगर मैं कुछ गलत सेटअप करता हूं, तो निश्चित रूप से कुछ विफल हो जाएगा और मुझे समस्या को कम करने में मदद के लिए INVALID_ENUM या INVALID_OPERATION दें।

जिस तरह से मैं इस कोड का उपयोग करता हूं वह यह है कि मल्टीसाम्प्लिंग को सक्षम करने के लिए मुझे बदलना होगा, ड्राइंग करते समय बहु_फबो को बांधना है, और उसके बाद संकल्प फ़ंक्शन को बाध्य करें और बाध्य करें। उसके बाद, मेरा एफबीओ बनावट (जब मैं इसे सीधे प्रस्तुत करता हूं तो ठीक काम करता है) अब बहुआयामी प्रस्तुत करना चाहिए। लेकिन यह सिर्फ काला है। मैंने प्रारंभिक कोड के दूसरे भाग में glEnable(GL_MULTISAMPLE) पर भी कॉल किया था।

अब मैं यह सुनिश्चित करने के लिए एक गैर बनाम बनावट बनावट को किसी अन्य बनावट में फिसलने का प्रयास करने जा रहा हूं। उम्मीद है कि इससे मुझे संकुचित करने में मदद मिलेगी जहां मैं खराब हो गया था।

अपडेट: तो यह एक नियमित एफबीओ को एक और समान एफबीओ में कॉपी करने के लिए बाहर निकलता है (दोनों रंग संलग्नक 0 से जुड़े बनावट हैं) एक ही ब्लैक स्क्रीन का उत्पादन करता है। ब्लिट बस काम नहीं करता है।

यह भी अजीब बात यह है कि एक बार जब मैं ब्लिट करने का प्रयास करता हूं, तो SOURCE fbo के बनावट को खींचें, यह अभी भी काला है। यह सिर्फ खंडहर सब कुछ blit करने की कोशिश की तरह है।

क्या कोई जानता है या कोई एफबीओ ब्लिटिंग कोड है? मुझे कोई नहीं मिला लेकिन मुझे पता है कि लोगों ने बहुआयामी एफबीओ के काम को प्राप्त कर लिया है।

यहाँ आप कैसे मदद कर सकते हैं: आप कोड जो किसी भी बिंदु पर glBlitFramebuffer कॉल है, तो मुझे लगता है कि आपरेशन की स्थापना के लिए अन्य कॉल देखना चाहेंगे। एक बार जब मैं इसे आमंत्रित करता हूं तो मुझे काले बफर और बनावट के अलावा कुछ भी नहीं मिल रहा है।

अपडेट: बैकबफर काम करने के लिए ब्लिट्ज, मल्टीसाम्पलिंग के साथ भी! इस कोर्स के लिए बिल्कुल बिल्कुल सेटअप की आवश्यकता नहीं है क्योंकि मैं केवल फ्रेमबफर 0 को बांधता हूं। इसलिए समस्या एफबीओ की मेरी स्थापना है, जिसमें एक बनावट लगाव है जिसे ब्लॉटेड किया जाना चाहिए।

उत्तर

4

अच्छी तरह से पता चला है कि मैंने फ्रेमबफर बाइंडिंग को रीसेट करने में विफल होने के अलावा कुछ भी गलत नहीं किया है।

void resolve_multisample_FBO() के अंत में मैं बस एक glBindFramebuffer(GL_FRAMEBUFFER, 0);

एक भयानक तरह से 3 घंटे बर्बाद करने के लिए की जरूरत है, मैं आपको विश्वास दिलाता। लेकिन मल्टीसाम्प्लिंग इसके लिए तैयार होने से बहुत अच्छा और अधिक दिखता है।

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