Ich habe ein Kachelset mit 8x8-Pixel-Bildern und möchte die Größe in meinem Spiel so ändern, dass sie doppelt so groß sind (16x16 Pixel, z. B. jedes Pixel in einen 2x2-Block verwandeln). Was ich erreichen möchte, ist ein Minecraft- ähnlicher Effekt, bei dem kleine Pixelbilder auf größere blockierbare Pixel skaliert werden.
In Pyglet scale
verwischt die Eigenschaft des Sprites die Pixel. Gibt es einen anderen Weg?
Arbeitscode:
Hier ist die Lösung, die funktioniert (dank DMans Beharrlichkeit und Jimmys Einsicht):
image = resource.image('tileset.png')
texture = image.get_texture()
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
texture.width = 16 # resize from 8x8 to 16x16
texture.height = 16
texture.blit(100, 30) # draw
from pyglet.gl import *
und rufen Sie dann talisman.org/opengl-1.1/Reference/glTexParameter.html mit anGL_NEAREST
.glEnable(GL_TEXTURE_2D)
. Dann nehmen wir an, Sie hatten einen Anruf beia = image.load('blah.jpg')
. Weisen Sietex = a.texture
dannglBindTexture(GL_TEXTURE_2D, texture.id)
und schließlich einen Anruf zupyglet.gl.glTexParameteri(pyglet.gl.GL_TEXTURE_2D, pyglet.gl.GL_TEXTURE_MIN_FILTER, pyglet.gl.GL_NEAREST)
. Ich bin mit dem Namespace für OpenGL in Python nicht allzu vertraut, daher habe ich den vollständigen Aufruf qualifiziert gelassen. Da wir OpenGL importiert haben, glaube ich, dass Sie zumindest den Pyglet vorne entfernen können , und vielleicht auch gl .glTexParameteri
. OpenGL 1/2/3 ~ , das ich Pyglet vermuten , basiert diese auf haben unmittelbaren Modus Befehle. Das heißt, Sie führen einen Befehl aus, um den Status zu ändern, und danach ändert sich alles. Ich würde damit beginnen, die Anrufe unter die gl-Anrufe zu verschieben.Antworten:
Auf Wunsch von Kommentatoren ...
Warnung an Pyglet-Profis: Es gibt möglicherweise einen guten Pyglet-Weg, dies zu tun, und das ist es nicht. Es ist ein schöner OpenGL-Weg. Du wurdest gewarnt!
Sie können dies in OpenGL tun, indem Sie zuerst die Textur binden und dann
glTexParameteri
oder ähnliche Variablen aufrufen. Sie können dies in Pyglet tun, indem Sie OpenGL importieren:from pyglet.gl import *
Sie können dann das
GL_TEXTURE_2D
Festlegen des Ziels aktivieren . Dies wird nicht immer benötigt, aber ich halte dies für einige andere Bindungen vollständig.glEnable(GL_TEXTURE_2D)
In Pyglet müssen Sie die Textur anscheinend auch nicht binden. Manchmal müssen Sie Ihr Bild laden, die Textur-ID abrufen und dann verwenden
glBindTexture(GL_TEXTURE_2D, texture.id)
. Meine Annahme, dass dies bereits der für Sie in Pyglet festgelegte Zustand ist.Der nächste Schritt ist das Anrufen
glTexParameteri
. Vielen Dank an Jimmy, der mich diesbezüglich korrigiert hat: Der richtige Anruf lautet:gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
Ein kurzer Überblick: Der erste besteht darin, das Ziel so festzulegen, dass OpenGL weiß, wovon Sie sprechen. Der zweite Parameter ist der Filtertyp, den Sie festlegen möchten.
MAG_FILTER
ist korrekt, da es die Vergrößerung von Texturen steuert. Der letzte Parameter istGL_NEAREST
, der steuert, wie die Textur skaliert wird.GL_NEAREST
ist im Grunde eine schnelle Skala, die texturierte Pixel liefert.GL_LINEAR
ist normal und verwischt stattdessen sanft Ihre Textur.Diese Version von OpenGL, über die ich spreche (über <OpenGL 3.2 offiziell), verwendet den Sofortmodus, der den Status festlegt. Nachdem der Status festgelegt wurde, können Sie Ihre Textur skalieren. Ich kann nichts Besseres sehen, als den Code zu zeigen, den Renold selbst als Arbeitscode gepostet hat.
quelle
texture = image.get_texture()
, funktioniert das? Es scheint, als hätten Sie es nie genannt, es sei denn, dies bindet die Textur intern.image = resource.image('tileset.png') \n
sprite = sprite.Sprite(image, x_pos, y_pos) \n
sprite.scale = 2 \n
Für diejenigen wie mich, die einfach ein Spiel im Retro-Stil machen, bei dem ALLES skaliert werden soll, lautet die einfache schnelle Antwort: Beginnen Sie Ihren Code mit:
Dann bleibt Ihre gesamte Verwendung von Sprites usw. von da an schön und pixelig.
quelle