Texturen-Atlas ohne Max2D-Hacks?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

E. Urbach

ehemals "Basicprogger"

Betreff: Texturen-Atlas ohne Max2D-Hacks?

BeitragSa, Nov 15, 2008 12:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist es möglich, eine Textur zu setzen und für die nachfolgenden Zeichenbefehle pixelgenau zu verwenden, ohne die Codes für die Treiber zu modifizieren?

Ich brauche das für eine TileMap-Engine, da ich leider feststellen musste, dass LoadAnimImage keinen Texturen-Atlas erstellt, sondern viele kleine Einzelbilder.

Meine bisherige Implementation nutzte bisher nur LoadAnimImage:
Code: [AUSKLAPPEN]
' TTextureAtlas
Type TTextureAtlas
   Field cursorX:Int
   Field cursorY:Int
   
   Field tileSizeX:Int
   Field tileSizeY:Int
   
   Field pixmap:TPixmap
   
   ' Init
   Method Init(sizeX:Int, sizeY:Int, nTileSizeX:Int, nTileSizeY:Int)
      Self.pixmap = CreatePixmap(sizeX, sizeY, PF_RGB888)
      Self.pixmap.ClearPixels(0)
      Self.tileSizeX = nTileSizeX
      Self.tileSizeY = nTileSizeY
   End Method
   
   ' Add
   ' TODO: Test this method
   Method Add(tile:TPixmap)
      Self.pixmap.Paste(tile, Self.cursorX, Self.cursorY)
      Self.cursorX :+ Self.tileSizeX
      
      If Self.cursorX > Self.pixmap.width - Self.tileSizeX
         Self.cursorX = 0
         Self.cursorY :+ 1
      EndIf
   End Method
   
   ' Insert
   Method Insert(tile:TPixmap, byteCode:Int)
      Local tilesPerRow:Int = Self.pixmap.width / Self.tileSizeX
      Local y:Int = byteCode / tilesPerRow
      Local x:Int = byteCode Mod tilesPerRow
      
      'Print x + ", " + y
      Self.pixmap.Paste(tile, x * Self.tileSizeX, y * Self.tileSizeY)
   End Method
   
   ' CreateImage
   Method CreateImage:TImage()
      'Return LoadImage(Self.pixmap, 0)
      Return LoadAnimImage(Self.pixmap, Self.tileSizeX, Self.tileSizeY, 0, (Self.pixmap.width / Self.tileSizeX) * (Self.pixmap.height / Self.tileSizeY), 0)
   End Method
   
   ' Create
   Function Create:TTextureAtlas(sizeX:Int, sizeY:Int, nTileSizeX:Int, nTileSizeY:Int)
      Local atlas:TTextureAtlas = New TTextureAtlas
      atlas.Init(sizeX, sizeY, nTileSizeX, nTileSizeY)
      Return atlas
   End Function
End Type


Die Zeichen-Methode:
Code: [AUSKLAPPEN]
      For layer = 0 To Self.layers - 1
         currentAtlas = Self.atlasImage[layer]
         
         For i = tileLeft To tileRight
            For h = tileTop To tileBottom
               DrawImage currentAtlas, originXInt + i * Self.tileSizeX, originYInt + h * Self.tileSizeY, Self.tiles[layer, i, h]
            Next
         Next
      Next


Kennt jemand eine Möglichkeit, dies mit Max2D-Mitteln zu schaffen?
Wenn nicht, hat jemand schonmal eine Modifikation oder eine Funktion zu diesem Thema geschrieben?

Edit: Hier ein Beispielprogramm, welches TTextureAtlas mit LoadAnimImage benutzt.
Edit2: Ich kann im BMax-Code nicht genau erkennen, ob wirklich ein Texturatlas für LoadAnimImage benutzt wird. Sollte das der Fall sein, bringt es aber zumindest bei mir keine Geschwindigkeitsvorteile.
  • Zuletzt bearbeitet von E. Urbach am Sa, Nov 15, 2008 15:54, insgesamt einmal bearbeitet
 

Ava

Gast

BeitragSa, Nov 15, 2008 12:40
Antworten mit Zitat
Das ist ansich sehr einfach Exclamation wenn Du auf GLGraphics umsteigen magst, könnte ich Dir eine kurze Funktion dafür schreiben.

Ob sich das positiv auf die Geschwindkeit auswirkt, kann ich Dir aber auch nicht sagen! Smile - ist Deine TileEngine zu lahm?!
 

E. Urbach

ehemals "Basicprogger"

BeitragSa, Nov 15, 2008 12:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ava, danke für das Angebot, nach GunSheep kennst du dich ja anscheinend gut mit OpenGL aus, daher würde ich mich darüber freuen, wenn du mir deine Herangehensweise zeigst Smile

Meine Vorgehensweise wäre folgende:
1. GLGraphics benutzen
2. TTextureAtlas.CreateImage() auf LoadImage umstellen
3. Textur erzeugen und laden
4. Funktion zur Berechnung der UV-Koordinaten anhand des Byte-Codes schreiben
5. In der Zeichen-Funktion: Textur setzen
6. GLDrawRect oder eine ähnliche Funktion zum Zeichnen mit der neuen Textur mit den neu berechneten UV-Koordinaten benutzen

Ich bin mir allerdings nicht sicher, ob das so funktioniert (pixelgenau?).
Korrigier mich, wenn etwas nicht stimmt Smile

Ava hat Folgendes geschrieben:
ist Deine TileEngine zu lahm?!

Nein, meine TileEngine ist bei einer Ebene noch schnell genug, bei mir läuft sie mit 250 FPS und auf einem mehr als 6 Jahre alten PC mit GeForce MX 400 und 1 GH AMD sind es sogar noch 80 FPS. Allerdings wollte ich schonmal vorausplanen, da ich in Zukunft mehr Ebenen benötige (ca. 2 bis 3, im schlimmsten Fall 5), ungeachtet der noch zu implementierenden Spiellogik.

Ava hat Folgendes geschrieben:
Ob sich das positiv auf die Geschwindkeit auswirkt, kann ich Dir aber auch nicht sagen

Ja, es müsste sich - meiner Erfahrung in anderen Sprachen/Libs nach - positiv auf die Geschwindigkeit auswirken.
The box said, "Requires Windows XP or better", so I installed Ubuntu | Linux is NOT Windows
Flua :: Profiler für BB und BMax :: Partikel-Engine für BMax :: Lyphia-Projekt Quellcode (BMax) :: Automatische Parallelisierung :: Meine Musik
 

Ava

Gast

BeitragSa, Nov 15, 2008 13:25
Antworten mit Zitat
Ich würde noch etwas einfacher an das Problem herangehen. Du könntest natürlich eine komplexe Erweiterung programmieren, die sich perfekt ins System einfügen lässt (wobei dies recht schwierig - leider oftmals sogar unmöglich / aufgrund der Modulstruktur von Mark >.<).

Eine einfache Möglichkeit wäre zum Beispiel eine neue Objekt-Klasse, de lediglich das zu verwendende Image und die u/v-Koordinaten der Frames speichert. Das Image lädst Du in diesem Fall "ganz normal" mit LoadImage anstatt von LoadAnimImage. Eine Funktion zum Zeichnen dieses neuen Objektes wäre mit weniger als 10 openGL-Befehlen ebenso einfach umzusetzen (wobei ich Dir dafür gerne noch ein Beispiel schicke).

Die Grafiken sollten Pixel-genau gezeichnet werden, sollange Du für Dein Tileset-Image keine unvernünftigen Framegrössen wählst. Smile (bspweise versuchst aus einem 256 Pixel breitem Image 10 Einzel-Frames zu machen ^^ da wäre es mit 25.6 Pixel Breite natürlich nicht mehr so Pixelgenau xD)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group