2013-12-09 5 views
24

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

मेरा लक्ष्य: दृश्य को एक एफबीओ में खींचें वैसे ही इसे उपरोक्त गुणों के साथ डिफ़ॉल्ट फ्रेमबफर पर खींचा जाएगा। वहां से मैं एक शेडर के माध्यम से भावी पास के लिए एक बनावट के रूप में छवि का उपयोग करने में सक्षम होना चाहता हूं।

// Generate the color attachment 
glGenTextures(1,&defaultColorAttachment0); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D,defaultColorAttachment0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,screenWidth,screenHeight,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL); 

// Bind the texture to the FBO 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, defaultColorAttachment0,0); 

// Generate the depth attachment 
glGenRenderbuffers(1,&defaultDepthBuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, defaultDepthBuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, screenWidth, screenHeight); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, defaultDepthBuffer); 

यह काम नहीं करता: बिना multisampling/अल्फा-टू-कवरेज, 1 रंग लगाव, 1 गहराई लगाव एक FBO बनाने के लिए कोड:

यह काम करता है। कोड एक multisampled FBO बनाने की कोशिश कर:

// Generate the color attachment 
glGenTextures(1,&defaultColorAttachment0); 
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, defaultColorAttachment0); 
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA, screenWidth, screenHeight, GL_FALSE); 
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, defaultColorAttachment0,0); 

// Generate the depth attachment 
glGenRenderbuffers(1,&defaultDepthBuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, defaultDepthBuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, screenWidth, screenHeight); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, defaultDepthBuffer); 

मैं इस पर ओपन विकि के माध्यम से देख की कोशिश की है, हालांकि यह के अधूरा (विभिन्न अधूरा शीर्षकों यह अव्यवसायिक दिखने)। glGetError कभी शिकायत नहीं करता है। मैंने इसके साथ गड़बड़ करने की कोशिश की है, लेकिन मुझे या तो ब्लैक स्क्रीन या कचरा पिक्सेल से भरा स्क्रीन मिलती है।

मुख्य प्रश्न: क्या बातें मैं आदेश multisampling और अल्फा-टू-कवरेज एक FBO साथ काम करने के प्राप्त करने के लिए विचार करने के लिए/परिवर्तन और जहां (FBO निर्माण, बनावट, shaders) की जरूरत है?

+0

क्या आपने glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, defaultColorAttachment0,0) को कॉल करने का प्रयास किया है; glFramebufferTxture (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, defaultColorAttachment0,0) के बजाय ;? – Jherico

+0

@ जेरिको हां, मुझे अभी भी एक ब्लैक स्क्रीन मिलती है। – GraphicsMuncher

उत्तर

22

आपको सही तरीके से काम करने के लिए एक बहुआयामी गहराई बफर आवंटित करने की आवश्यकता है और इसे अपने रंग बफर के समान नमूने दें। दूसरे शब्दों में, आपको glRenderbufferStorage (...) के बजाय glRenderbufferStorageMultisample (...) पर कॉल करना चाहिए।

आपका एफबीओ पूर्णता को विफल करने में विफल होना चाहिए जिस तरह से इसे आवंटित किया गया है। glCheckFramebufferStatus (...) को एक कॉल GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE वापस जाने के लिए क्योंकि आपके गहराई बफर बिल्कुल नमूना है और अपने रंग बफर लगाव है चाहिए।


जब से तुम भी इस FBO में एक multisampled बनावट लगाव का उपयोग कर रहे हैं, तो आप एक भी नमूना बनावट बनाम GLSL shaders में multisampled नमूने के बीच मतभेद के बारे में पता होना चाहिए।

Multisampled बनावट एक विशेष नमूना वर्दी प्रकार (जैसेsampler2DMS) है और आप स्पष्ट रूप से अपने पूर्णांक द्वारा बनावट में प्रत्येक नमूने लाने के लिए है (गैर सामान्यीकृत) Texel समन्वय और नमूना सूचकांक texelFetch (...) का उपयोग कर। इसका यह भी अर्थ है कि उन्हें फ़िल्टर या मिप-मैप नहीं किया जा सकता है।

शायद आप इस मामले में एक बहुआयामी बनावट नहीं चाहते हैं, तो शायद आप एक एकल नमूने वाले एफबीओ में एमएसएए संकल्प करने के लिए glBlitFramebuffer (...) का उपयोग करना चाहते हैं। यदि आप ऐसा करते हैं तो आप प्रत्येक नमूने को लाने और एंटी-एलाइजिंग को लागू करने के बजाय अपने शेडरों में एंटी-एलाइज्ड परिणाम पढ़ सकते हैं।

+0

ड्रैट, मुझे अभी यह मिल गया है। ठीक है। – Jherico

+1

हां! यह बहुत उपयोगी है। मुझे अब यह काम मिल गया है! मुझे multisampled छवि को blit करने के लिए एक और एफबीओ बनाना था, लेकिन यह ठीक है। मैंने रंग बफर (मल्टीसमैम, आरजीबीए => 32) के साथ गहराई बफर को रेखांकित किया। बहुत बहुत धन्यवाद। – GraphicsMuncher

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