Frage

Ich benutze Python, aber OpenGL ist so ziemlich genauso wie in jeder anderen Sprache.

Das Problem ist, dass, wenn ich versuche, eine Textur oder eine Zeile mithilfe eines Rahmenpufferobjekts einer Textur zu rendern, auf den Kopf gestellt wird, zu klein in der unteren linken Ecke. Sehr merkwürdig. Ich habe diese Bilder zu demonstrieren:

So sieht es aus,

www.godofgod.co.uk/my_files/incorrect_operation.png

So sah es aus, als ich stattdessen Pygame verwendete. Pygame ist zu langsam, habe ich gelernt. Mein Spiel wäre ohne OpenGL -Geschwindigkeit nicht spielbar. Ignoriere die gekrümmten Ecken. Ich habe diese in OpenGL noch nicht implementiert. Ich muss dieses Problem zuerst lösen.

www.godofgod.co.uk/my_files/correct_operation.png

Ich benutze keine Tiefe.

Was könnte dieses unregelmäßige Verhalten verursachen? Hier ist der Code (die Funktionen werden in den tatsächlichen Code eingerichtet. Er zeigt richtig), Sie können nützlich sein.

def texture_to_texture(target,surface,offset): #Target is an object of a class which contains texture data. This texture should be the target. Surface is the same but is the texture which should be drawn onto the target. offset is the offset where the surface texture will be drawn on the target texture.
#This will create the textures if not already. It will create textures from image data or block colour. Seems to work fine as direct rendering of textures to the screen works brilliantly.
if target.texture == None:
    create_texture(target)
if surface.texture == None:
    create_texture(surface)
frame_buffer =  glGenFramebuffersEXT(1)
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, frame_buffer)
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, target.texture, 0) #target.texture is the texture id from the object
glPushAttrib(GL_VIEWPORT_BIT)
glViewport(0,0,target.surface_size[0],target.surface_size[1])
draw_texture(surface.texture,offset,surface.surface_size,[float(c)/255.0 for c in surface.colour]) #The last part changes the 0-255 colours to 0-1 The textures when drawn appear to have the correct colour. Don't worry about that.
glPopAttrib()
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)
glDeleteFramebuffersEXT(1, [int(frame_buffer)]) #Requires the sequence of the integer conversion of the ctype variable, meaning [int(frame_buffer)] is the odd required way to pass the frame buffer id to the function.

Diese Funktion kann auch nützlich sein,

def draw_texture(texture,offset,size,c):
glMatrixMode(GL_MODELVIEW)
glLoadIdentity() #Loads model matrix
glColor4fv(c)
glBegin(GL_QUADS)
glVertex2i(*offset) #Top Left
glVertex2i(offset[0],offset[1] + size[1]) #Bottom Left
glVertex2i(offset[0] + size[0],offset[1] + size[1]) #Bottom, Right
glVertex2i(offset[0] + size[0],offset[1]) #Top, Right
glEnd()
glColor4fv((1,1,1,1))
glBindTexture(GL_TEXTURE_2D, texture)
glBegin(GL_QUADS)
glTexCoord2f(0.0, 0.0)
glVertex2i(*offset) #Top Left
glTexCoord2f(0.0, 1.0)
glVertex2i(offset[0],offset[1] + size[1]) #Bottom Left
glTexCoord2f(1.0, 1.0)
glVertex2i(offset[0] + size[0],offset[1] + size[1]) #Bottom, Right
glTexCoord2f(1.0, 0.0)
glVertex2i(offset[0] + size[0],offset[1]) #Top, Right
glEnd()
War es hilfreich?

Lösung

Sie zeigen Ihre Projektionsmatrix nicht, also gehe ich davon aus, dass es sich auch um Identität handelt.

  • OpenGL FrameBuffer -Ursprung ist unten links, nicht oben links.
  • Das Problem der Größe ist schwieriger zu erklären. Was ist Ihre Projektionsmatrix doch?
  • Außerdem zeigen Sie nicht, wie Sie die Textur verwenden, und ich bin mir nicht sicher, was wir in Ihrem "falschen" Bild betrachten.

Einige nicht bezogene Kommentare:

  • Das Erstellen eines Framebuffer jeden Frame ist nicht der richtige Weg, um ihn zu erledigen.
  • Kommen Sie, um darüber nachzudenken, warum Frambuffer überhaupt verwenden? Es scheint, dass das einzige, was Sie suchen, sich mit dem Rahmenpuffer verschmiegt? glEnable(GL_BLEND) macht das gut.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top