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'
|
Zaslal: 14. listopad 2011, 22:09:58 Předmět: Solid/shaded vykreslování - jak na vyplnění polygonů? |
|
|
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 .... 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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
|
Návrat nahoru |
|
 |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 14. listopad 2011, 23:07:35 Předmět: |
|
|
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 |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 15. listopad 2011, 10:16:28 Předmět: |
|
|
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 |
|
 |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 15. listopad 2011, 11:38:18 Předmět: |
|
|
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 |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 15. listopad 2011, 16:26:49 Předmět: |
|
|
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 |
|
 |
costa
Založen: 10. 10. 2011 Příspěvky: 29 Bydliště: u hranic s malým 'h'
|
Zaslal: 16. listopad 2011, 20:31:31 Předmět: |
|
|
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 (kdyžtak se tady poptám) .... EDIT: teda až najdu, kde mně haprujou rotace  |
|
Návrat nahoru |
|
 |
|