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

1

21.08.2012, 20:54

[DirectX8] Boden Tiles mit Rand?

Hallo erstmal,

ich habe folgendes Problem und hoffe, dass jemand eine zündende Idee hat, wie dem beizukommen ist.

Mein Spiel (Wolf Online, 2D, DirectX8, Visual Basic 6) soll eine Zoom-Funktion bekommen.
Soweit klappt das auch ganz gut, allerdings haben ausgerechnet die Boden-Tiles links und rechts einen Rand!

Wie das aussieht (bzw dadrunter wie es aussehen sollte), sehen Sie hier:


(Link)


Der Effekt verstärkt sich übrigens, je mehr 'reingezoomt' wird und lässt nach, wenn der Zoom kleiner wird.
Ich hatte bereits den Verdacht, dass Anti-Aliasing dafür verantwortlich ist, aber selbst explizites Abstellen hat keinen Erfolg gebracht.

Vorschläge? :hmm:

2

21.08.2012, 20:58

Willkommen im Forum.

Wie sieht den der "Zoom-Code" aus?

Btw: Imho wäre DX 9 oder neuer besser (wegen den Features, ...).

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

21.08.2012, 21:30

Vielleicht hilft ja das hier... ;)

4

21.08.2012, 21:37

@dot: Ohne den Inhalt gelesen zu haben. Da stand Direct3D 9 und er benutzt 8. ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

21.08.2012, 21:53

Lies den Inhalt. ;)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

21.08.2012, 21:57

Neben dem, was dot gesagt hat könnte es noch an folgendem liegen (hatte ich selbst mal):
  • Texturfiltering
  • Textur Grössen, die nicht 2^i sind
Verursachen nicht in allen Fällen Probleme, aber könnten auf jeden Fall solche Artefakte verursachen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

21.08.2012, 22:59

Ich stimme dot zu, das sieht ganz nach falschen Texturkoordinaten aus.
PS: Hier im Internet duzen wir uns!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

22.08.2012, 07:00

Wohl kaum wegen MIP-Mapping, weil er sagt dass der Effekt schlimmer wird, je weiter er reinzoomt.
Es sind einfach nur falsche Texturkoordinaten ...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

22.08.2012, 07:54

Wenn der Effekt nur beim Zoomen auftritt, liegts evtl. auch einfach nur am Filtering. 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. Wenn die Tiles einzelne Texturen sind, dann kannst du das Problem evtl. auch über den Texture Address Mode lösen.

Abgesehen davon, sei aber wirklich nochmal gesagt, dass D3D8 und VB6 alles andere als aktuelle Technologien sind. Ich würde dir von ganzem Herzen empfehlen: Lern C# und verwend dann D3D9 bzw. D3D11 oder eine entsprechende Library...

10

22.08.2012, 11:36

:) Erstmal der Tile-Render Code.. Mein Fehler, hätte ihn vielleicht an den Startpost heften sollen, Sorry an alle!

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

' Jump Marks
Select Case Layer
Case 0: GoTo GroundMode
Case 1: GoTo MaskMode
Case 2: GoTo FringeMode
End Select

GroundMode:
t = Map.Tile(X, Y).Ground
If t <> 11 Then
If GameSeason <> SEASON_WINTER Then t = t + 1
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

vecTranslation.X = X * PIC_X * ZoomFactor: vecTranslation.Y = Y * PIC_Y * ZoomFactor
Call gD3DX8Sprite.Draw(Tex_Tile, RecSource, vecScaling, vecRotationCenter, 0, vecTranslation, D3DColorARGB(255, 255, 255, 255))
End If
Exit Sub

MaskMode:
For i = 0 To 10
t = Map.Tile(X, Y).Mask(i)
If t <> 11 Then
With RecSource
.Top = Int(t \ 12) * 32
.bottom = .Top + 32
.Left = (t - (t \ 12) * 12) * 32
.Right = .Left + 32
End With
vecTranslation.X = (X * PIC_X * ZoomFactor): vecTranslation.Y = Y * PIC_Y * ZoomFactor
Call gD3DX8Sprite.Draw(Tex_Tile, RecSource, vecScaling, vecRotationCenter, 0, vecTranslation, D3DColorARGB(255, 255, 255, 255))
End If
Next
Exit Sub

FringeMode:
For i = 0 To 10
t = Map.Tile(X, Y).Fringe(i)
If t <> 11 Then

' Fringe
With RecSource
.Top = Int(t \ 12) * 32
.bottom = .Top + 32
.Left = (t - (t \ 12) * 12) * 32
.Right = .Left + 32
End With
vecTranslation.X = (X * PIC_X * ZoomFactor): vecTranslation.Y = Y * PIC_Y * ZoomFactor
Call gD3DX8Sprite.Draw(Tex_Tile, RecSource, vecScaling, vecRotationCenter, 0, vecTranslation, D3DColorARGB(255, 255, 255, 255))
End If
Next
Exit Sub
End Sub
Nachfolgend noch sicherheitshalber wie Dx8 initialisiert wird;

Zitat

Public Function Initialization(ByVal hWnd As Long) As Boolean
'on error resume next
Dim mode As D3DDISPLAYMODE

'holen wir uns Zugriff auf Direct3D
Set gD3D8 = gDX8.Direct3DCreate()
If gD3D8 Is Nothing Then Exit Function

gD3D8.GetAdapterDisplayMode D3DADAPTER_DEFAULT, mode

'festlegen der Darstellungs-Parameter (present)
Dim d3dpp As D3DPRESENT_PARAMETERS
d3dpp.Windowed = 1
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY
d3dpp.BackBufferFormat = mode.Format

'Device erstellen
Set gD3DDevice8 = gD3D8.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)
If gD3DDevice8 Is Nothing Then Exit Function

'erstellen eines D3DX8 Objektes und Sprite
Set gD3DX8 = New D3DX8
Set gD3DX8Sprite = gD3DX8.CreateSprite(gD3DDevice8)

Initialization = True

'Initialisieren von DirectSound unter verwendung der Standardeinstellungen
Set DS = gDX8.DirectSoundCreate("")

'Cooperative Level setzen für unser Fenster und normalen Modus verwenden
DS.SetCooperativeLevel hWnd, DSSCL_NORMAL

'setzen der Eigenschaften
With DSBDesc
.lFlags = DSBCAPS_CTRLFREQUENCY
End With

' Sounds
Call InitSoundArrays
End Function
Also das Ganze um 0,5 verschieben hatte nicht den Effekt, den es haben könnte... stattdessen bekam ich sogar noch ohne Zoom Streifen, als sich die tiles überlagerten. Was das Tileset angeht. Da scheint alles in Ordnung zu sein, der Tilecutter gab mir quasi perfekte Ausschnitte (zumal sonst ohne Zoom auch der Effekt aufträte, oder?)

Auf DirectX9 möchte ich ungern umsteigen, da ich den Sinn dahinter nicht sehe, den Thread aber auch nicht ins Off-Topic kippen möchte, indem ich danach frage :D.

Vielleicht findet ja wer die Stelle, wo's hapert :D? (Danke an alle bisherigen Antworten übrigens :) Sehr schnell und sehr viele! Aber das Problem ist noch immer ungelöst)

EDIT: PIC_X und PIC_Y sind übrigens beide 32.

Werbeanzeige