Registriert: Mi Jul 15, 2009 20:48 Beiträge: 111 Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
yo
ich möchte ne tile basierte map verwirklichen. leider entstehen durch benachbarte tiles ränder an den einzelnen quadraten, und ich erinnere mich nichtmehr, wie man damit umgeht. kann mir jmd auf die sprünge helfen?
_________________ thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,
Ich bin mir nicht 100% sicher was du meinst aber ich vermute einfach mal: 1. Du willst schöne übergänge zwischen Grass -> Sand -> Wasser etc. 1.1 Also bei Tilemaps macht man das glaube in der Regel so das die Tiles einfach aneinander passen. Das heißt der Übergang zwischen den Tiles ist schon in der Tile-Textur. Macht natürlich nur Sinn wenn es nicht zuviele Möglichkeiten gibt. Etwa hier bei C&C Red Alert gibt es eben X verschiede Küstenteile, X verschiedene Felsen, Grass mit Straße, etc. 1.2 Eine Alternative wäre natürlich Alpha-Blending. Du machst deine Tiles ein wenig größer als eigentlich nötig so das sie mit dem Nachbar-Tile überlappen. Der Rand ist dann eben transparent. Der Alpha-Wert addiert mit dem Alpha-Wert des Nachbarn muss immer 1 ergeben.
2. Du benutzt einen Textur-Atlas, also mehrere Tiles in einer Textur nebeneinander und hast das Problem das du am Rand die Nachbar-Textur siehst. Deine Tiles müssen im Atlas leicht größer sein. Jedes Tile braucht einen 1px Rand wo du die Randpixel jeweils einfach kopierst. Die Texturkoordinate müssen natürlich so gewählt werden, dass du immer noch die ursprüngliche Tile benutzt. Sowas macht man natürlich nicht von Hand sondern man baut sich was dafür. Solltest du einen Anisotropen-Filter benutzen (eher nicht bei 2D) brauchst du sogar 4px Rand. Verkleinern ist ein Problem. Bei der Generierung von Mipmaps werden einfach immer 2x2px zu einem verwurstet....und das immer wieder für jedes Level. Du musst also dafür sorgen das der Rand in der kleinsten Mipmap-Stufe (pixelmäßig) immer noch 1px bzw. 4px dick ist.
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
naja es koennte auch sein das er z.B. zwei Quads nebeneinander zeichnet und die Artefakte die dabei entstehen weghaben will... oder sonste was, nen Screenshot und genauere Beschreibung wäre wirklich nicht schlecht
Registriert: Mi Jul 15, 2009 20:48 Beiträge: 111 Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
oh, dann hab ich das einfach nicht ausreichend erklärt, sorry.
hier mal n bild. die pinken ränder gehören nicht zu den tiles und sind auch kein raster das ich absichtlich darstelle, sondern entstehen durch die benachbarten pixel in der chipset textur.
ich zeichne einzelne quads nebeneinander, und die texturkoordinaten sind das "tile" aus meineem chipset das ich anzeigen möchte. coolcat hat unter 2. die lösung; allerdings scheint mir das keine ideale lösung zu sein, denn es verkompliziert einige dinge, wie zb das erstellen von chipsets oder die anzeige des chipsets zur auswahl des tiles das man zeichnen möchte. gibt es eine möglichkeit, irgendeinen opengl-state zu setzen, so dass er die ränder der quads nicht mit den umliegenden, ungewünschten pixeln verwäscht?
immerhin zeichne ich 64x64 pixel der textur auf 64x64 pixel des bildschirms. vill n shader?
_________________ thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
gibt fuer sowas zwei gute Loesungen, zum einen wie schon gesagt GL_Nearest. Oder man machts wie zum Beispiel Starcraft und erlaubt nur bestimmte Tiles als Nachbarn so das solche "Ueberblendungen" egal werden.
GL_NEAREST hilft dir nur wenn du wirklich die Pixel 1:1 auf den Bildschirm überträgst. Wenn du zoomen möchtest wird das Ergebnis bescheiden aussehen.
Übrigens sind die Ränder sehr stark. Ich würde darauf tippen, dass du die Texturkoordinaten um 0.5 Pixel falsch gesetzt hast. Klassischer Anfängerfehler. Benutze etwa nicht (0,0) als Texturkoordinate (das wäre genau die Mitte zwischen dem Randpixel deines Tiles und der pinken Umrandung. Verwende stattdessen (0.5 / textureWidth, 0.5 / textureHeight), das ist die Mitte des Eckpixels. Hier ist die Formel: (0.5 + pixelX) / textureWidth (0.5 + pixelY) / textureHeight
Nicht vergessen, dass du auch deine Quads pixelexakt rendern musst. Wenn die Vertices 0.5 Pixel daneben sind, sind die Texturkoordinaten natrülich auch entsprechend verschoben. Das solltest du prüfen indem du z.B. in den Ecken mal ein 4x4 Quad renderst, ein Screenshot machst (damit zu ranzoomen kannst) und dann die Pixel zählst. Also checken ob es wirklich 4x4 Pixel sind und an der korrekten Stelle. Bei der Gelegenheit kannst du auch gleich prüfen ob der gewünschte 4x4 Texturbereich korrekt übertragen wurde. Benutze eine große Textur, 4096x4096 oder so damit falsche Koordinaten auffallen.
Mitglieder in diesem Forum: 0 Mitglieder und 14 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.