Kantenglättung (AA) in PB
- vonTurnundTaxis
- Beiträge: 2130
- Registriert: 06.10.2004 20:38
- Wohnort: Bayreuth
- Kontaktdaten:
Kantenglättung (AA) in PB
Gibt es die Möglichkeit einzelne Sprites zu "glätten"?
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
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
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). 
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.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.
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.
- vonTurnundTaxis
- Beiträge: 2130
- Registriert: 06.10.2004 20:38
- Wohnort: Bayreuth
- Kontaktdaten:
Einen schwarzen Rahmen um die Viecher malen oder aa mit windowed-Screen simulieren
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.
Code: Alles auswählen
InitSprite()
OpenWindow(0,0,0,320,240,0,"Test")
CreateGadgetList(WindowID())
OpenWindowedScreen(WindowID(),0,0,640,480, #True ,0,0)CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
- vonTurnundTaxis
- Beiträge: 2130
- Registriert: 06.10.2004 20:38
- Wohnort: Bayreuth
- Kontaktdaten:
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
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 ???!!!!???
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 ???!!!!???
-
orange-blue
- Beiträge: 556
- Registriert: 04.09.2004 22:23
- Kontaktdaten: