Seite 1 von 3

Kantenglättung (AA) in PB

Verfasst: 02.11.2004 23:31
von vonTurnundTaxis
Gibt es die Möglichkeit einzelne Sprites zu "glätten"?

Verfasst: 03.11.2004 00:10
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

Verfasst: 03.11.2004 00:51
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). ;)

Verfasst: 03.11.2004 12:50
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.

Verfasst: 06.11.2004 19:21
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:

Verfasst: 06.11.2004 19:45
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.

Verfasst: 07.11.2004 14:46
von vonTurnundTaxis
Öööö :oops:
@GPI: Ich glaube, ich habe das nicht ganz verstanden...

Verfasst: 07.11.2004 14:51
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.

Verfasst: 10.11.2004 03:54
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:

Verfasst: 14.12.2004 11:34
von orange-blue
Hi! Ich hab das mal ausprobiert funzt aber nicht(nicht im geringsten). Weis jemand ne andere Lösung?