.[ ČeskéHry.cz ].
Solid/shaded vykreslování - jak na vyplnění polygonů?

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
costa



Založen: 10. 10. 2011
Příspěvky: 29
Bydliště: u hranic s malým 'h'

PříspěvekZaslal: 14. listopad 2011, 22:09:58    Předmět: Solid/shaded vykreslování - jak na vyplnění polygonů? Odpovědět s citátem

Zdravím, zkouším si napsat svoje vlastní sw vykreslování, wireframe už mám, právě řeším, jak vykreslit vyplněné polygony - pro začátek stačí flat shadingem Smile .... Zajímalo by mě, jak se v praxi řeší vyplňování polygonů.. Řádkové vyplňování? Semínkové vyplňování? Jak je to vyřešené v OpenGL? Díky, costa
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 14. listopad 2011, 22:34:21    Předmět: Odpovědět s citátem

velmi pravdepodobne to bude riadkove. viac sa mozes docitat tu

http://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 14. listopad 2011, 23:07:35    Předmět: Odpovědět s citátem

Nedávno jsem toto programoval do školy.

Jsou dva hlavní rozdílné typy problému vyplňování. Jedno je vyplňování oblasti dané nějakou hranicí v rastru (semínkové vyplňování), nebo vyplňování oblasti zadané např. množinou hran. (řádkové vyplňování)

Najdeš k tomu info v knize Moderní počítačová grafika, kapitola Vyplňování geometricky určené hranice. (tam Řádkové vyplňování se seznamem aktivních hran - anglicky nevím název algoritmu)
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 15. listopad 2011, 10:16:28    Předmět: Odpovědět s citátem

Mám dojem, že v HW je ještě jiný způsob - nevím jak se jmenuje :-). Ale ten neni vhodný pro SW renderer. Tam se, co tak vím, používá to řádkové vyplňování.
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 15. listopad 2011, 11:38:18    Předmět: Odpovědět s citátem

Ono hardware předpokládám má hlavně rychlé vykreslování trojúhelníků, na což je velice jednoduchá a účinná metoda.

http://www-users.mat.uni.torun.pl/~wrona/3d_tutor/tri_fillers.html

Takže promysli, jak složité polygony chceš vyplňovat. Jestli jen trojúhelníky a čtyřúhelníky, tak bych použil něco jako ve výše zmíněném odkazu.
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 15. listopad 2011, 16:26:49    Předmět: Odpovědět s citátem

AFAIK hardware používá scanline algoritmus (tedy plní po řádcích), ale najednou provádí NxN počet pixelů (což na procesoru taky můžete, pomocí threadingu).

citace:
Ale ten neni vhodný pro SW renderer.

Řádkové vyplňování (scanline) je vhodný a ryhlejší než semínkové vyplňování, i na CPU.

Malý pseudo kód vytáhnutý z první verze SW rasterizéru, který jsem napsal několik let zpět - teď používám jeho zoptimalizovanou verzi pro occlusion culling.

Pozn. jde to napsat i líp a správně (bez kondicionálů, bez early returnu, etc.). Kód snad je easy-to-understand, kdyby něčemu nebylo rozumět, ptej se (algoritmus by měl být pochopitelný z kódu).
kód:

void DrawSpan(int x1_in, int x2_in, int y_in)
{
  int y = max(min(y_in, fboHeight), 0);
  int x1 = max(min(x1_in, fboWidth), 0);
  int x2 = max(min(x2_in, fboWidth), 0);

  if(x2 - x1 == 0)
  {
    return;
  }

  if(x2 < x1)
  {
    swap(x1, x2);
  }

  for(int i = x1; i < x2; ++i)
  {
    WritePixel(x1, x2);
  }
}

// CEdge je class, ktery obsahuje 4 float hodnoty = 2 2D body - (x1, y1) a (x2, y2)
// eps je neco maleho (ugly epsilon)

void DrawSpanBetweenEdges(CEdge e1, CEdge e2)
{
  if(fabs(e1.y2 - e1.y1) < eps)
  {
    return;
  }

  if(fabs(e2.y2 - e2.y1) < eps)
  {
    return;
  }

  float e1_xdiff = e1.x2 - e1.x1;
  float e2_xdiff = e2.x2 - e2.x1;
 
  float factor1 = (e2.y1 - e1.y1) / (e1.y2 - e1.y1);
  float factorstep1 = 1.0f / (e1.y2 - e1.y1);
  float factor2 = 0.0f;
  float factorstep2 = 1.0f / (e2.y2 - e2.y1);

  for(int i = (int)e2.y1; i < (int)e2.y2; ++i)
  {
    int x1 = (int)e1.x1 + factor1 * e1_xdiff;
    int x2 = (int)e2.x1 + factor2 * e2_xdiff;

    DrawSpan(x1, x2, i);

    factor1 += factorstep1;
    factor2 += factorstep2;
  }
}


Tyto funkce ti v praxi staci na vykresleni trojuhelnika, budes vykreslovat pomoci 2x funkce DrawSpanBetweenEdges, kdy dosadis prvne 2 hrany a to od spodniho do stredniho bodu (vertikalne) + od spodniho smerem k vzdalenejsimu ale jen do vysky toho stredniho bodu; a podruhe od stredniho do horniho a od horniho do spodniho.

Velmi lehce lze do těchto funkcí dosadit depth test, texturování (no u něj to chce maličký trik, aby bylo správné), atd.

IMHO ale dnes nemá SW rasterizér (mimo occlusion cullingu - kde je mimochodem rychlejší než použití HW occlusion queries, pokud je dobře napsaný) moc velký význam - maximálně tak k naučení (příp. se ho pokoušet napsat v OpenCL/CUDA - kde ale bude zpravidla pomalejší než HW cesta).

EDIT:
citace:
Takže promysli, jak složité polygony chceš vyplňovat. Jestli jen trojúhelníky a čtyřúhelníky, tak bych použil něco jako ve výše zmíněném odkazu.

Vždycky můžeš vše rozbít na triangly - a pravděpodobně to bude rychlejší (pokud bude kód dobře napsaný), než semínkové vyplňování.
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
costa



Založen: 10. 10. 2011
Příspěvky: 29
Bydliště: u hranic s malým 'h'

PříspěvekZaslal: 16. listopad 2011, 20:31:31    Předmět: Odpovědět s citátem

Díky vám všem za odpovědi.. Mám v plánu vykreslovat pouze trojúhelníky, tzn když mně v budoucnu při ořezání ve frustum vzniknou polygony, budu se je snažit rozbít... Nastuduju, a snad i pochopím Smile (kdyžtak se tady poptám) .... EDIT: teda až najdu, kde mně haprujou rotace Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna