AA...

AA...
2007-01-22T11:19:25+01:00
2007-01-27T09:35:41+01:00
2022-11-03T02:40:40+01:00
kenez
Sziasztok!
Az lenne a kérdésem, hogyan lehet az AA-technológiát megvalósítani. Van egy adott pontsorom, és azt szeretném
"élsimítani".
A válaszokat előre is köszönöm!
Mutasd a teljes hozzászólást!
- Súlyozatlan anti-aliasing:
A képzeletbeli egyenesre, egy pixel szélességű téglalapot fektetsz!
Ha ezen téglalap által határolt tartományba olyan pixelek is beleesnek, melyek nem "részei" a kirajzolt egyenesnek, akkor azok színét (az adott pixelből) a téglalap által lehatárolt területnek megfelelő intenzitással világítod meg!
Pl: KÉP

- Súlyozott anti-aliasing:
Itt a pixeleket kör alakunak feltételezed, melyekre egység magasságú kúpokat raksz, továbbá a képzeletbeli egyenesre egy egységnyi magasságú hasábot!
Itt a színintenzitást, a térfogat-arány fogja megadni! Ez annyiban jobb az előző módszernél, hogy figyelembe veszi, az egyes pixeleknek, az elméleti egyenestől való távolságát! (nem csak a lefedettség mértékét!)

- Super-sampling
Az elsimításnak egy másik módszere, lényege h az éleken elhelyezkedő pixeleket felbontjuk 16 darab további részre, un. subpixel-ekre. (Ezek nem valódi képpontok.) Így képpontokat egy nagyobb felbontásnak megfelelően számítjuk ki. Egy megjelenített pixel színe ezt követően a hozzátartozó részpixelekhez rendelt értékek átlagaként kerül kiszámításra.
Mutasd a teljes hozzászólást!

  • Ezt a beszédes topiccímet... Az AntiAlias is kifért volna.

    Ha Graphics32 könyvtárat használsz (ami egyébként nagyon jó), akkor az csípőből kezeli az élsímítást is.

    Manuálisan pedig a szűk környezetet is figyelembe kell venned, és aszerint generálni egy-egy "elmosott" képpontot a vonal körül, azzal párhuzamosan, kombinálva a környezet színeivel.
    Mutasd a teljes hozzászólást!
  • Ha már játékgrafika és delphi, akkor tippelek hogy directx-et használsz. A delphix-ben van ilyen hogy az antialiasing-et be lehet állitani hányszoros legyen. Ehhez meg a manual majd segit neked.

    Vagy inkább egy függvényt akarsz illeszteni a pontsorra?
    Mutasd a teljes hozzászólást!
  • Igen, inkább ez utóbbi érdekelne. Függvényrajzoló progit írok, ami egyébként ekvivalens a szakdolimmal, és szeretnék nagy hangsúlyt fektetni a görbék szép megjelenésére. Egyébként Delphi7-et használok.
    D7-ben is vannak erre lehetőségek?
    Mutasd a teljes hozzászólást!
  • Az én hozzászólásom nem látszott? Leírtam a technika alapját.
    Mutasd a teljes hozzászólást!
  • Tehát akkor tegyük fel, hogy van egy fekete vonal. ADott pontjának
    x koordinátája i. Ezek szerint az i+1-edik pontnak valamilyen szürkeárnyalatúnak kell lennie. Ez a lényeg? Hogyan tudom az árnyékolás "mértékét" úgy eltalálni, hogy a vonal ne látszódjon vastagabbnak?

    (Egyébként olvastam előző szólásod is, köszönöm. CSak 1kissé fáradt voltam az este...)
    Mutasd a teljes hozzászólást!
  • - Súlyozatlan anti-aliasing:
    A képzeletbeli egyenesre, egy pixel szélességű téglalapot fektetsz!
    Ha ezen téglalap által határolt tartományba olyan pixelek is beleesnek, melyek nem "részei" a kirajzolt egyenesnek, akkor azok színét (az adott pixelből) a téglalap által lehatárolt területnek megfelelő intenzitással világítod meg!
    Pl: KÉP

    - Súlyozott anti-aliasing:
    Itt a pixeleket kör alakunak feltételezed, melyekre egység magasságú kúpokat raksz, továbbá a képzeletbeli egyenesre egy egységnyi magasságú hasábot!
    Itt a színintenzitást, a térfogat-arány fogja megadni! Ez annyiban jobb az előző módszernél, hogy figyelembe veszi, az egyes pixeleknek, az elméleti egyenestől való távolságát! (nem csak a lefedettség mértékét!)

    - Super-sampling
    Az elsimításnak egy másik módszere, lényege h az éleken elhelyezkedő pixeleket felbontjuk 16 darab további részre, un. subpixel-ekre. (Ezek nem valódi képpontok.) Így képpontokat egy nagyobb felbontásnak megfelelően számítjuk ki. Egy megjelenített pixel színe ezt követően a hozzátartozó részpixelekhez rendelt értékek átlagaként kerül kiszámításra.
    Mutasd a teljes hozzászólást!
  • Erre gondolsz?

    procedure TEasy.AntiAliasRect(clip: Graphics.TBitmap; XOrigin, YOrigin, XFinal, YFinal: Integer);
    var Memo,x,y: Integer; (* Composantes primaires des points environnants *)
    p0,p1,p2:pbytearray;

    begin
    if XFinal<XOrigin then begin Memo:=XOrigin; XOrigin:=XFinal; XFinal:=Memo; end; (* Inversion des valeurs *)
    if YFinal<YOrigin then begin Memo:=YOrigin; YOrigin:=YFinal; YFinal:=Memo; end; (* si diff&#8218;rence n&#8218;gative*)
    XOrigin:=max(1,XOrigin);
    YOrigin:=max(1,YOrigin);
    XFinal:=min(clip.width-2,XFinal);
    YFinal:=min(clip.height-2,YFinal);
    clip.PixelFormat :=pf24bit;
    for y:=YOrigin to YFinal do begin
    p0:=clip.ScanLine [y-1];
    p1:=clip.scanline [y];
    p2:=clip.ScanLine [y+1];
    for x:=XOrigin to XFinal do begin
    p1[x*3]:=(p0[x*3]+p2[x*3]+p1[(x-1)*3]+p1[(x+1)*3])div 4;
    p1[x*3+1]:=(p0[x*3+1]+p2[x*3+1]+p1[(x-1)*3+1]+p1[(x+1)*3+1])div 4;
    p1[x*3+2]:=(p0[x*3+2]+p2[x*3+2]+p1[(x-1)*3+2]+p1[(x+1)*3+2])div 4;
    end;
    end;
    end;
    Mutasd a teljes hozzászólást!
  • Először is köszönöm szépen neked is meg mindenkinek a segítséget!

    Egyébiránt honnan szedted a kódrészletet?
    És hogyan működik?(Örülnék neki ha egy kissé érteném is!)

    Köszönettel: Kenéz
    Mutasd a teljes hozzászólást!
  • Menj sorról sorra (és húzd be a megfelelő sorokat, mert Laca is elfelejtette a forráskód gombot), és elemezd. Semmi bonyolult nincs benne, csak pici középiskolás matematika meg ScanLine.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd