Kantenglättung (AA) in PB

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Kantenglättung (AA) in PB

Beitrag von vonTurnundTaxis »

Gibt es die Möglichkeit einzelne Sprites zu "glätten"?
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
RaVeN99
Beiträge: 310
Registriert: 29.08.2004 15:26
Wohnort: Weiden i.d.OPF
Kontaktdaten:

Beitrag von RaVeN99 »

Hiho!

Also prinzipiell würde ich jetz mal behaupten das ganze iss möglich.
Sollte ganz gut gehen nach dem Prinzip wie es Bildbearbeitungsproggies machen. Allerdings werden dann nicht nur die kanten sondern das ganze bild weichgezeichnet...
Sieht ab und an gut aus, aber teilweise echt weniger... (fast wie unsauberes Bilineares Filtering)...

Wenn du nur kanten geglättet haben willst wird das in 2D, sprich mit Sprites recht schwer, da du hier ja ohne Polygone arbeitest...

Mfg
RaVeN
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Anti Alias ist doch sowieso für 3D zugeschnitten oder nicht? Ich hab noch in keinem 2D Spiel die Möglichkeit gefunden, AA anzuschalten. Sicher bin ich mir da zwar nicht, aber sowas ist doch in einer 3D-Engine zu finden. Und selbst diese liegt nicht direkt bereit zur Hand und muss erst geschrieben werden, vielleicht ließe sich etwas ähnliches in PB für Sprites machen, aber wie gesagt, sowas fällt nicht vom Himmel. (Anders gesagt, so einen simplen Befehl wie setspriteAA(#Sprite, AA-Mode) wird es sicherlich nicht geben für Sprites). ;)
Benutzeravatar
redacid
Beiträge: 581
Registriert: 29.08.2004 17:06

Beitrag von redacid »

Sunny hat geschrieben:Ich hab noch in keinem 2D Spiel die Möglichkeit gefunden, AA anzuschalten. Sicher bin ich mir da zwar nicht, aber sowas ist doch in einer 3D-Engine zu finden.
Natürlich gab es AA auch schon in 2D-Spielen. Mir fällt spontan "Indiana Jones and the fate of Atlantis" auf dem Mac ein.

Und selbst Deluxe Paint II von etwa 1986 hatte bereits die Möglichkeit, Antialiasing auf Kanten anzuwenden. Dies war auf einem 7.14 MHz-Rechner natürlich nicht besonders schnell, aber funktionierte.

Warum sollte es auch nicht in 2D funktionieren? Man muss "lediglich" durch passende Zwischenfarben einen leichten "Verlauf" herstellen. In der Praxis ist dies natürlich noch etwas komplizierter, aber vom Prinzip her wird es so gemacht. Softwareseitig ist es somit kein großes Problem, nur die Geschwindigkeit kann da natürlich sehr drunter leiden.
Benutzeravatar
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Beitrag von vonTurnundTaxis »

Naja... mein eigentliches Problem ist:
Ich arbeite momentan an einem Shooter a la Moorhohn... Ich mache meine Figuren mit C4D, wenn ich aber bei Cinema AA aktiviere, dann "hängt" die C4D Hintergrundfarbe noch mit dran. Wenn ich in C4D kein AA aktiviere, segen die Figuren sehr pixelig aus... :cry:
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

Einen schwarzen Rahmen um die Viecher malen oder aa mit windowed-Screen simulieren

Code: Alles auswählen

InitSprite()
OpenWindow(0,0,0,320,240,0,"Test")
CreateGadgetList(WindowID())
OpenWindowedScreen(WindowID(),0,0,640,480, #True ,0,0)
Gezeichnet wird in doppelter Auflösung und wird dann runtergerechnet. Bei mir wirds mittels Binlineares Filter (odersowas) runtergerechnet, aber es kann sein, das bei bestimmten Grafikkarten/Treiber einfach jeder zweite Pixel genommen wird.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Beitrag von vonTurnundTaxis »

Öööö :oops:
@GPI: Ich glaube, ich habe das nicht ganz verstanden...
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

Du hast ein Fenster mit 320x240, aber dein WindowedScreen ist 640x480. Durch den Parameter Strech = #true paßt PB das an und verkleinert das Bild. Bei mir wird das Bild mittels Binlineares Filtern verkleinert -> Kantenglättung.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

die einfachste und schnellste lösung (finde ich) ist, die hintergrundfarbe in C4D so auszuwählen, dass sie einen mittelwert aus den tatsächlichen hintergrundfarben im spiel darstellt...der mit AA erzeugte "Rahmen" ist dann kaum sichtbar...

ich erzeuge figuren in POVRay lieber ohne AA aber 4x oder 8x so gross, wie ich sie brauche, dann verkleinere ich sie mit IrfanView unter benutzung der Resample-funktion (das ergebniss dürfte so ähnlich sein wie C4D mit AA)...
die hintergrundfarbe wird auch hier 'angehängt', aber:
1. mittelwert-hintergrund erzeugt unauffällige kanten...
2. schwarzer hintergrund gibt dem ganzen einen comic-look

ODER

erzeuge deine sprites 4x so gross ohne AA und stelle sie mit Sprite3D und ZoomSprite3D dar...

;-------------------------------------------------------------------

LoadSprite(0, "Name.bmp", #PB_Sprite_Texture)
CreateSprite3D(0, 0)
Sprite3DQuality(1) ; das erledigt das interne AA im sprite, nicht zum aktuellen hintergrund
TransparentSpriteColor(0, R, G, B) ; Hintergrundfarbe, die beim erzeugen verwendet wurde

...

; MainLoop

...

Start3D()
ZoomSprite3D(0, X-größe, Y-größe)
DisplaySprite3D (0, xCoor, yCoor, 255) ; 255 ist undurchsichtig (transparenz-wert,alpha), damit kannst du ein getroffenes opfer auch flackern lassen
Stop3D()

...

;-------------------------------------------------------------------

damit ist dein sprite 'intern' weichgezeichnet, die kanten sind so oder so pixelig, da nur eine farbe als transparent dargestellt wird....
braucht aber massig grafikkarten-speicher, nämlich 16x so viel bei 4-facher kantenlänge...

[EDIT]

btw. auf den meisten grafikkarten muss 'ne texture quadratisch und 2^x sein... also 32x32, 64x64, 128x128 etc...

wenn also deine grösste ausdehnung bei max.32 pixel liegt, erzeuge es auf 128x128 und stelle es 32x32 dar. analog bei den anderen grössen, also 512x512 erzeugen für 128x128 darstellung...

...wenn du wie bei moorhuhn gleichaussehende aber verschieden grosse sprites hast, brauchst du nur eine vorlage für beide...

[EDIT2]

wenn du speicherplatz sparen willst (z.b. bei anims), lade die anim-frames in den hauptspeicher, und mache ein CopySprite in ein sprite dass du im Texturenspeicher erzeugt hast, von diesem dann das Sprite3D erstellen (geht vielleicht auch, wenn du's vordefinierst, musst vielleicht nur den CopySprite Befehl im Loop haben...)


@GPI: deine lösung ist echt tricky... ist sie auch schnell ?

btw: kann man mit WindowedScreen vielleicht auch sprites vor einem AVI plazieren ???!!!!??? :shock:
orange-blue
Beiträge: 556
Registriert: 04.09.2004 22:23
Kontaktdaten:

Beitrag von orange-blue »

Hi! Ich hab das mal ausprobiert funzt aber nicht(nicht im geringsten). Weis jemand ne andere Lösung?
Antworten