Framebuffer a bassa risoluzione si ripete

Nov 11 2020

Ho creato un oggetto framebuffer a bassa risoluzione che ha un display in stile retrò.

Il framebuffer sembra mostrarsi da solo, causando un pasticcio di pixel nella parte inferiore dello schermo.

Ecco come appare quando il framebuffer viene disegnato completamente sovrapposto alla finestra

Ecco come appare quando il framebuffer è disegnato sovrapponendosi al quarto del viewport

Ecco come ho creato il Framebuffer e il Renderbuffer

FBO = glGenFramebuffers(1)
DBO = glGenRenderbuffers(1)

glBindRenderbuffer(GL_RENDERBUFFER, DBO)
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 1280, 720)

glBindFramebuffer(GL_FRAMEBUFFER, FBO)
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, DBO)
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0)

E questo è il codice in mainloop

    glDrawElements(GL_TRIANGLES, len(indices), GL_UNSIGNED_INT, None) # Drawing Stuff

    ###

    glBindFramebuffer(GL_FRAMEBUFFER, 0)
    
    glBlitFramebuffer(
        640 - 128,
        360 - 72,
        640 + 128,
        360 + 72,
        0,
        0,
        1280,
        720,
        GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
        GL_NEAREST
    )

Sto usando Python 3 con PyOpenGL

Risposte

1 derhass Nov 12 2020 at 21:46

Nei commenti a questa domanda, ci sono speculazioni sui bug dei driver. Questo non è il caso. L'unica fonte definitiva del corretto comportamento OpenGL è la specifica OpenGL , e l'attuale specifica GL 4.6 afferma nella sezione 18.3 "Copia dei pixel" (enfasi mia):

Diversi comandi copiano i dati dei pixel tra le regioni del framebuffer (vedere la sezione 18.3.1), o tra le regioni di texture e renderbuffer (vedere la sezione 18.3.2). Per tutti questi comandi, se l'origine e la destinazione sono identiche o sono viste diverse della stessa immagine della trama sottostante e se le regioni di origine e di destinazione si sovrappongono in quel framebuffer, renderbuffer o immagine della trama, i valori dei pixel risultanti dall'operazione di copia non sono definiti .

Nota che la destinazione del binding GL_FRAMEBUFFERè una scorciatoia sia per GL_READ_FRAMEBUFFER* che definisce l'origine del blit) che GL_DRAW_FRAMEBUFFER(che specifica la destinazione), quindi stai creando apposta il ciclo di feedback qui.

Tuttavia, rimane del tutto poco chiaro cosa stai facendo. Il blit dal framebuffer predefinito al framebuffer predefinito significa che non mostrerà affatto i contenuti del tuo FBO, e poiché i tuoi ido FBO non hanno un allegato di colore, non puoi comunque renderizzare i dati del colore su di esso.