2013-12-09 13 views
24

Sto tentando di abilitare il mutlisampling e l'alpha-to-coverage per un FBO. Utilizzando il framebuffer predefinito, tutto ciò che devo fare è chiamare glEnable(GL_MULTISAMPLE) e glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE). Tuttavia, non sono in grado di ottenere lo stesso effetto usando il mio FBO.Come utilizzare il multicampionamento con gli FBO OpenGL

Il mio obiettivo: Disegna la scena a un FBO nello stesso modo in cui verrebbe disegnata nel framebuffer predefinito con le proprietà precedenti. Da lì voglio essere in grado di usare l'immagine come trama per i passaggi futuri attraverso uno shader.

questo funziona: Codice per fare un FBO senza multisampling/alfa-per-la copertura, l'attaccamento 1 colore, 1 attacco profondità:

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

Questo non funziona. Codice cercando di fare un FBO multicampionato:

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

ho provato guardando attraverso il wiki OpenGL su questo, anche se incomplete il gioco è fatto (varie voci non finiti farlo sembrare poco professionale). glGetError non si lamenta mai. Ho provato a fare scherzi con questo, ma ottengo uno schermo nero o uno schermo pieno di pixel immondizia.

Domanda principale: Quali cose ho bisogno di prendere in considerazione/cambiamento e dove (creazione FBO, texture, shader) al fine di ottenere multisampling e alfa-per-la copertura di lavorare con un FBO?

+0

Hai provato a chiamare glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, defaultColorAttachment0,0); invece di glFramebufferTexture (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, defaultColorAttachment0,0) ;? – Jherico

+0

@Jherico Sì, ho ancora uno schermo nero. – GraphicsMuncher

risposta

22

È necessario allocare un buffer di profondità multisampling affinché funzioni correttamente e fornisca lo stesso numero di campioni del buffer dei colori. In altre parole, dovresti chiamare glRenderbufferStorageMultisample (...) anziché glRenderbufferStorage (...).

Il vostro FBO dovrebbe fallire un controllo di completezza nel modo in cui è stato assegnato in questo momento. Una chiamata a glCheckFramebufferStatus (...) dovrebbe tornare GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE perché il buffer di profondità ha esattamente campione e il vostro attaccamento buffer di colore ha .


Dal momento che si utilizza anche un allegato consistenza multicampionato in questa FBO, è necessario essere consapevoli delle differenze tra il campionamento di un singolo campionato contro tessitura multicampionato in shader GLSL.

texture multicampionato hanno uno speciale tipo campionatore uniforme (esempiosampler2DMS) e si deve prendere esplicitamente ogni campione nel tessuto dal suo intero coordinate (non normalizzata) texel e indice di campione usando texelFetch (...). Ciò significa anche che non possono essere filtrati o mappati in mip.

Probabilmente non si desidera una trama multicampionata in questo caso, probabilmente si desidera utilizzare glBlitFramebuffer (...) per risolvere il problema MSAA in un FBO a campionamento singolo. Se lo fai, puoi leggere i risultati anti-alias degli shader piuttosto che dover recuperare ogni campione e implementare te stesso l'anti-aliasing.

+0

drat, ho appena trovato questo io stesso. Ah bene. – Jherico

+1

SÌ! Questo è super utile. Ho funzionato ora! Ho dovuto fare un altro FBO per inserire l'immagine multicampionata, ma va bene. Ho allineato il buffer di profondità con il buffer dei colori (multicampione, RGBA => 32). Grazie mille. – GraphicsMuncher

Problemi correlati