Textur skalieren (pygame, pyopengl)

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
magenta
User
Beiträge: 2
Registriert: Freitag 17. Oktober 2008, 15:08

Freitag 17. Oktober 2008, 15:21

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 ;-) ...)
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Freitag 17. Oktober 2008, 23:12

Warum skalierst du die Textur, du kannst ja einfach die Interpolation beim zeichnen Benutzen.
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
magenta
User
Beiträge: 2
Registriert: Freitag 17. Oktober 2008, 15:08

Samstag 18. Oktober 2008, 01:15

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.
Antworten