Seite 1 von 1

Textur skalieren (pygame, pyopengl)

Verfasst: Freitag 17. Oktober 2008, 15:21
von magenta
Hallo,

ich versuche mich gerade daran, eine scroll- und zoomfähige Umgebung aus Tiles herzustellen. Also: Eine Landschaft, bestehend aus vielen quadratischen Surfaces, an die man näher ranzoomen oder wegzoomen kann. Mit pygame-1.8, smoothsurface und ein paar Duzend Zeilen Code klappt dies auch schon ganz gut. Aber langsam.

Versuche haben ergeben, dass der smoothsurface-Ansatz viel Zeit verschlingt, aber halt viel besser aussieht. Nun wollte ich mich an pyopengl ranwagen, um zu sehen, ob pyopengl vielleicht die 3D-Hardware dafür nutzen kann, um so den Skalierungsvorgang etwas zu beschleunigen.

Dafür habe ich folgende Zeilen geschrieben:

Code: Alles auswählen

image = pygame.image.load("bild.jpg") # 240x240px
imagestr = pygame.image.tostring(image, "RGBA")
timagestr = "*" * (480*480*4)
print gluScaleImage(GL_RGBA, image.get_width(), image.get_height(), GL_UNSIGNED_BYTE, imagestr, 480, 480, GL_UNSIGNED_BYTE, timagestr)
timage = pygame.image.fromstring(timagestr, (480, 480), "RGBA")
Der gluScaleImage Befehl liefert bei mir den Wert 1285 zurück, mit dem ich nicht viel anfangen kann, außer dass er nicht 0 und somit nicht gut ist. timagestr wurde nicht verändert, besteht also immer noch aus einem Haufen Sternen.

Laut Beschreibung sollte der letzte Parameter von gluScaleImage ein Pointer sein, in dem das transformierte Bild abgelegt wird, nur Python besitzt keine Pointer.

Irgendwie komme ich hier nicht weiter. Wie kann ich gluScaleImage mit pygame zusammen einsetzen? Bringt das überhaupt was gegenüber der immerhin auch schon hoch optimierten pygame.smoothscale-Funktion, sprich, wird 3D-Hardware genutzt?

(Ein kompletter Umstieg auf eine 3D-Engine wäre nicht mein Ziel. Erst noch ein paar Grundlagen in python und pygame lernen ;-) ...)

Verfasst: Freitag 17. Oktober 2008, 23:12
von veers
Warum skalierst du die Textur, du kannst ja einfach die Interpolation beim zeichnen Benutzen.

Verfasst: Samstag 18. Oktober 2008, 01:15
von magenta
Bisher kenne ich nur den Weg, eine Textur per Surface.Blit auf das display zu bringen, und das ist dann von der Skalierung her so groß, wie die Textur vorher war. Daher skaliere ich die Textur vorher auf eine temporäre Textur und blitte diese dann aufs display. So kann ich in das Surface rein- und rauszoomen.