Le framebuffer basse résolution se répète
J'ai créé un objet framebuffer basse résolution avec un affichage de style rétro.
Le framebuffer semble s'afficher, provoquant un désordre de pixels en bas de l'écran.
Voici à quoi il ressemble lorsque le framebuffer est dessiné en chevauchant complètement la fenêtre
Voici à quoi il ressemble lorsque le framebuffer est dessiné en chevauchant le quart de la fenêtre
C'est ainsi que j'ai créé le Framebuffer et le 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)
Et c'est le code de 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
)
J'utilise Python 3 avec PyOpenGL
Réponses
Dans les commentaires de cette question, il y a des spéculations sur les bogues des pilotes. Ce n'est pas le cas. La seule source définitive de comportement OpenGL correct est la spécification OpenGL , et les états actuels de la spécification GL 4.6 dans la section 18.3 «Copie de pixels» (c'est moi qui souligne):
Plusieurs commandes copient les données de pixels entre les régions du framebuffer (voir la section 18.3.1), ou entre les régions de textures et les tampons de rendu (voir la section 18.3.2). Pour toutes ces commandes, si la source et la destination sont identiques ou sont des vues différentes de la même image de texture sous-jacente, et si les régions source et de destination se chevauchent dans ce tampon d'image, tampon de rendu ou image de texture, les valeurs de pixel résultant de l'opération de copie ne sont pas définies. .
Notez que la cible de liaison GL_FRAMEBUFFERest un raccourci pour les deux GL_READ_FRAMEBUFFER* qui définit la source du blit) et GL_DRAW_FRAMEBUFFER(qui spécifie la destination), vous créez donc la boucle de rétroaction volontairement ici.
Cependant, ce que vous faites reste totalement flou. Le blit du framebuffer par défaut au framebuffer par défaut signifie qu'il n'affichera pas du tout le contenu de votre FBO, et puisque vos id FBO n'ont pas de pièce jointe de couleur, vous ne pouvez pas y rendre les données de couleur de toute façon.