2010-01-09 16 views
1

Si j'ai un tampon de trame qui est lié à une texture qui est simplement noir avec alpha complet et j'essaie de tracer une ligne, même si le la ligne a l'alpha complet qu'elle ne rendra pas. Je ne suis pas stupide, donc les lignes ne sont définitivement pas noires. Si la texture est blanche à la place, la ligne se rendra soudainement correctement comme si la couleur de la texture derrière elle affecte la couleur des lignes qui est muette. Seulement si les lignes sont transparentes, la couleur derrière celles-ci devrait-elle avoir un effet? J'utilise le lissage de ligne. J'utilise la fonction de fusion suivante qui est apparemment celle à utiliser,Les lignes ne sont pas rendues sur un tampon de trame hors-champ avec une texture complètement noire

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 

Comment résoudre ce problème?

Beaucoup de code:

Pour les lignes de dessin:

def draw_line(a,b,c,w,antialias): 
    if antialias: 
     glEnable(GL_LINE_SMOOTH) #Enable line smoothing. 
    c = [float(sc)/255.0 for sc in c] #Divide colours by 255 because OpenGL uses 0-1 
    if len(c) != 4: 
     c.append(1) #Add a value for aplha transparency if needed 
    glMatrixMode(GL_MODELVIEW) 
    glLoadIdentity() #Loads model matrix 
    glColor4fv(c) 
    glLineWidth(w) 
    glBegin(GL_LINES) 
    glVertex2fv(a) 
    glVertex2fv(b) 
    glEnd() 
    if antialias: 
     glDisable(GL_LINE_SMOOTH) #Disable line smoothing. 

Configuration objet framebuffer:

def setup_framebuffer(surface): 
    #Create texture if not done already 
    if surface.texture == None: 
     create_texture(surface) 
    #Render child to parent 
    if surface.frame_buffer == None: 
     surface.frame_buffer = glGenFramebuffersEXT(1) 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, surface.frame_buffer) 
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, surface.texture, 0) 
    glPushAttrib(GL_VIEWPORT_BIT) 
    glViewport(0,0,surface.surface_size[0],surface.surface_size[1]) 
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() #Load the projection matrix 
    gluOrtho2D(0,surface.surface_size[0],0,surface.surface_size[1]) 

def end_framebuffer(): 
    glPopAttrib() 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0) 
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() #Load the projection matrix 
    gluOrtho2D(0,1280,720,0) #Set an orthorgraphic view 

Création de texture:

def create_texture(surface): 
    surface.texture = glGenTextures(1) 
    glMatrixMode(GL_MODELVIEW) 
    glLoadIdentity() #Loads model matrix 
    glBindTexture(GL_TEXTURE_2D, surface.texture) #Binds the current 2D texture to the texture to be drawn 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) #Required to be set for maping the pixel data 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) #Similar as above 
    if surface.data == None: 
     surf = pygame.Surface((1,1),SRCALPHA) 
     surf.fill(surface.colour[:-1]) 
     surface.data = pygame.image.tostring(surf, "RGBA") * (surface.surface_size[0] * surface.surface_size[1]) 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, surface.surface_size[0], surface.surface_size[1], 0, GL_RGBA,GL_UNSIGNED_BYTE, surface.data) #Put surface pixel data into texture 

Fonction de tirage au sort des lignes à l'écran ou à la texture d'un objet Surface avec un objet frame buffer:

def add_lines(surface, c, coordinates, w = 1, antialias = True): 
    if surface.__class__ == Surface: #Only use a frame buffer if the line isn't being drawn to the screen. 
     setup_framebuffer(surface) 
    last = None 
    for coordinate in coordinates: #Loop though the coordinates and draw the lines 
     if last != None: 
      draw_line(last,coordinate,c,w,antialias) 
     last = coordinate 
    if surface.__class__ == Surface: #Only use a frame buffer if the line isn't being drawn to the screen. 
     end_framebuffer() 

C'est tout ce que je peux voir d'important. Sauf peut-être le code d'initialisation:

glutInit(sys.argv) 
glutInitWindowPosition(0,0) 
glutInitWindowSize(*game_size) 
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA) 
glutCreateWindow(title) 
glutSetIconTitle(title) 
glutReshapeFunc(self.reshaped) 
glutKeyboardFunc(self.keydown) 
glutKeyboardUpFunc(self.keyup) 
glutSpecialFunc(self.specialdown) 
glutSpecialUpFunc(self.specialup) 
glViewport(0,0,self.first_screen[0],self.first_screen[1]) #Creates the viewport which is mapped to the window 
glEnable(GL_BLEND) #Enable alpha blending 
glEnable(GL_TEXTURE_2D) #Enable 2D Textures 
glEnable(GL_POLYGON_SMOOTH) #Enable antialiased polygons 
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST) 
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST) 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 
glMatrixMode(GL_PROJECTION) 
glLoadIdentity() #Load the projection matrix 
gluOrtho2D(0,1280,720,0) #Set an orthorgraphic view 
+0

que diriez-vous de montrer le code pour dessiner la ligne et/ou quelques photos de ce que vous observez? De plus, votre nomenclature est bizarre. une texture liée à un tampon de trame? voulez-vous dire que vous avez déjà dessiné une texture dans le tampon de trame? – Bahbar

+0

Vous devez poster plus de code pour le rendu de l'arrière-plan et des lignes? –

+0

J'ai ajouté beaucoup de code. Par texture liée, je veux dire: glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, surface.texture, 0) –

Répondre

1

Il y a au moins une chose qui semble suspect: vous tournez sur Texturing dans votre code d'initialisation, et oublier à ce sujet. Ainsi, vos lignes sont dessinées avec des textures (et des coordonnées de texture constantes), choisissant probablement la texture à laquelle vous essayez d'écrire.

Ce n'est probablement pas ce que vous voulez (je ne me souviens pas de ce que la spécification fbo a à dire à ce sujet, mais ça ne marchera pas). Que diriez-vous de désactiver la texturation lors du rendu des lignes?

+0

Merci beaucoup. Je m'en souviendrai dans le futur. –

Questions connexes