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?
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
@Jherico Sì, ho ancora uno schermo nero. – GraphicsMuncher