Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

22.08.2012, 13:29

Perfekte Ausschnitte nützen Dir gar nichts, wenn beim Rendern die Kanten dank Texture-Filtering interpoliert werden.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

22.08.2012, 14:01

Wenn ich mich recht erinnere, hatte das D3DXSprite in DirectX 8 genau so einen Bug von wegen falschen Texturkoordinaten (allerdings nicht den mit dem 0.5 Offset)...

EDIT: Schau mal hier.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

13

22.08.2012, 14:04

Zwei Gründe: entweder die Tile-Rechtecke decken durch Rundungsfehler manchmal gar nicht alle Pixel ab, oder die bereits genannten Fehlfarben, die man durch Interpolation am Rand reinbekommt.

Unterscheidung: leere das Renderziel mal mit irgendeiner auffälligen Farbe - ein lebendiges PinkMalvePfirsichOckerMarine empfiehlt sich da. Wenn die seltsamen Zwischenzeilen und -spalten dann diese seltsame Farbe haben, weiß Du, dass es Grund 1 ist. Erhöhe in dem Fall vecScaling vorsichtig um ein paar Pixel-Bruchteile.

Falls es die Interpolation ist, wurde die Lösung ja schon genannt: a) Interpolation abschalten oder b) farbtreuen Rand um jedes Tile oder c) Texturkoordinaten vorsichtig einen halbeb Pixel vom Rand wegbewegen. Letzteres könnte zu seltsamen Interpolationsverhalten über das Tile hinweg führen, könnte aber auch klappen.

Beim Kleinskalieren bekommst Du dann noch Probleme mit MipMaps, dann werden die Randgebiete, bei denen die Interpolation Fehlfarben von außen mit reinholt, noch größer. Entweder Sicherheitsabstand um jede Tile-Grafik erhöhen oder dynamisch das SourceRect weiter schrumpfen.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

14

22.08.2012, 16:11

Wenn ich mich recht erinnere, hatte das D3DXSprite in DirectX 8 genau so einen Bug von wegen falschen Texturkoordinaten (allerdings nicht den mit dem 0.5 Offset)...

EDIT: Schau mal hier.
8| Klingt ja fast, als wäre das in DX9 gefixt worden...
Hab mal +1 zu bottom und right jeweils addiert... geändert hat sich da aber nichts.
Zwei Gründe: entweder die Tile-Rechtecke decken durch Rundungsfehler manchmal gar nicht alle Pixel ab, oder die bereits genannten Fehlfarben, die man durch Interpolation am Rand reinbekommt.

Unterscheidung: leere das Renderziel mal mit irgendeiner auffälligen Farbe - ein lebendiges PinkMalvePfirsichOckerMarine empfiehlt sich da. Wenn die seltsamen Zwischenzeilen und -spalten dann diese seltsame Farbe haben, weiß Du, dass es Grund 1 ist. Erhöhe in dem Fall vecScaling vorsichtig um ein paar Pixel-Bruchteile.

Falls es die Interpolation ist, wurde die Lösung ja schon genannt: a) Interpolation abschalten oder b) farbtreuen Rand um jedes Tile oder c) Texturkoordinaten vorsichtig einen halbeb Pixel vom Rand wegbewegen. Letzteres könnte zu seltsamen Interpolationsverhalten über das Tile hinweg führen, könnte aber auch klappen.

Beim Kleinskalieren bekommst Du dann noch Probleme mit MipMaps, dann werden die Randgebiete, bei denen die Interpolation Fehlfarben von außen mit reinholt, noch größer. Entweder Sicherheitsabstand um jede Tile-Grafik erhöhen oder dynamisch das SourceRect weiter schrumpfen.
Was den PinkMalvePfirsichOckerMarin-Test angeht... :) Daran liegt's schonmal nicht. Die Streifen verbleiben in einem hübschen was-auch-immer...

Interpolation... Nach Google gibts da nur die Möglichkeit, den Shademode auf flat zu schalten. Korrigiert mich bitte, wenn ich falsch liege... Geändert hat es aber leider auch nichts. Kann natürlich auch sein, dass ich wieder was Falsch mache :D

Was mir auch eben aufgefallen ist.. sind ja nichtmal nur die Boden Tiles, die so einen komischen Rand haben... die Bäume, NPCs, Spieler, im Grunde hat alles eine Linie um sich herum. ?( Man beachte; die sind in den Texturen selbst NICHT enthalten...

Hier mal der aktuelle Render-Code (hab etwas die Luft rausgelassen, war ja etwas aufgeblasen..)

Zitat

Public Sub RenderTiles(ByVal X As Byte, Y As Byte, Layer As Byte)
On Error Resume Next
Dim RecSource As RECT, t As Long
Dim i As Byte
Dim ZoomX As Single, ZoomY As Single
Dim LightColor As Long

' Calculate Coordinates
ZoomX = 0: ZoomY = 0
If ZoomFactor > 1 Then
If X > 0 Then ZoomX = (X * (PIC_X + ((ZoomFactor - 1) * PIC_X)) - (1 * ZoomFactor))
If Y > 0 Then ZoomY = (Y * (PIC_Y + ((ZoomFactor - 1) * PIC_Y)) - (1 * ZoomFactor))
Else
ZoomX = (X * PIC_X)
ZoomY = (Y * PIC_Y)
End If

' Get Light and final vecTranslation
LightColor = D3DColorARGB(255, 255, 255, 255)
vecTranslation.X = ZoomX: vecTranslation.Y = ZoomY

' Process
If Layer > 0 Then
For i = 0 To 10
' TileNum
If Layer = 1 Then t = Map.Tile(X, Y).Mask(i)
If Layer = 2 Then t = Map.Tile(X, Y).Fringe(i)
If t = 11 Then Exit Sub
' Rec
With RecSource
.Top = Int(t \ 12) * PIC_Y
.bottom = .Top + PIC_Y
.Left = ((t - (t \ 12) * 12) * PIC_X)
.Right = (.Left + PIC_X)
End With
' Draw Sprite
Call gD3DX8Sprite.Draw(Tex_Tile, RecSource, vecScaling, vecRotationCenter, 0, vecTranslation, LightColor)
Next
Else
' TileNum
t = Map.Tile(X, Y).Ground
' Rec
With RecSource
.Top = Int(t \ 12) * PIC_Y
.bottom = (.Top + PIC_Y) + 1
.Left = ((t - (t \ 12) * 12) * PIC_X)
.Right = (.Left + PIC_X) + 1
End With
' Draw Sprite
Call gD3DX8Sprite.Draw(Tex_Tile, RecSource, vecScaling, vecRotationCenter, 0, vecTranslation, LightColor)
End If
End Sub

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

22.08.2012, 16:15

Kommen die Grafiken aus einer Tilemap/einem Spritesheet? Wenn ja:
Wenn die Tiles aus einer Tilemap kommen, sollest du um jedes Tile in der Map herum die Randpixel zu einem einen Pixel breiten Rahmen duplizieren.

;)

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

16

22.08.2012, 16:38

Ich meinte *nicht* den Shade Mode, sondern den Texturfilter. Ich habe keine Ahnung von DirectX8, daher musst Du da mal selbst schauen, wie Du den beeinflusst. Alternativ kannst Du aber natürlich auch die Randpixel um jedes Tile einführen, wie dot und auch ich schon geschrieben haben.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

17

22.08.2012, 17:13

8| Randpixel duplizieren? Wie kann das helfen? Ist ja nicht so, als ob der Textur-Hintergrund angezeigt wird...

Was den Filter angeht.. Wenn ich da irgendwas setze, wird nix mehr angezeigt...

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

18

22.08.2012, 17:16

Wie renderst du die Quadrate denn? Oder besser: wie erstellst du die Vertices? Teilen sich alle Felder Vertices oder hast du pro Tile auch 4/6 Vertices? Dann kann es evt. daran liegen dass zwischen den Vertices kleine Rundungsfehler auftreten bzw. ein Pixel einfach mal nicht überdeckt wird. Das hatte ich mal bei meiner Tilemap (auch 2D, OpenGL, mit den Texturen war alles in Ordnung).
Gelöst habe ich das dann mit einem "Gitter", heißt zwei benachbarte Tiles teilen sich auch 2 Vertices.

19

22.08.2012, 17:25

Ich glaube, die liegen einfach direkt aneinander.. :huh:

Übrigens bin ich wieder auf was gestoßen.. Irgendwo hieß es, man solle direkt nach sprite.begin folgendes einfügen..

Zitat

gD3DDevice8.SetTextureStageState 0, D3DTSS_MAGFILTER, D3DTEXF_NONE
gD3DDevice8.SetTextureStageState 0, D3DTSS_MINFILTER, D3DTEXF_NONE
;) War das mit 'Filter' gemeint?

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

20

22.08.2012, 17:31

Ja, das war gemeint.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Werbeanzeige