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
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Klingt ja fast, als wäre das in DX9 gefixt worden...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.
Was den PinkMalvePfirsichOckerMarin-Test angeht... Daran liegt's schonmal nicht. Die Streifen verbleiben in einem hübschen was-auch-immer...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.
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
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.
Community-Fossil
War das mit 'Filter' gemeint?Zitat
gD3DDevice8.SetTextureStageState 0, D3DTSS_MAGFILTER, D3DTEXF_NONE
gD3DDevice8.SetTextureStageState 0, D3DTSS_MINFILTER, D3DTEXF_NONE
Werbeanzeige