Ahoj,
nevim presne, kde by se ty chyby mely vyskytovat, ale vzhledem k vyssi slozitosti nekterych operaci predpokladam, ze to bude bud trimming NURBS ploch, nebo tesselace.
Ostatni veci jsou v GLU celkem jednoduche, tam se chyba snad po delsim testovani musi projevit.
Jinak tento clanek a jeho pokracovani bude porad o "zakladnim" OpenGL, na GLU se chystam nastedne.
Dobry den,
pekny clanek, jen bych mozna pro uplnost zminil ten Bernsteinuv polynom.
Trosku off topic: pokud pouzivate Radeon 8500 a vyssi, tak neupgradujte jadro na verzi 2.6 ... s jadrem 2.6 nefungujou moc dobre proprietarni ovladace od ATI. Nejde nacist jadernej modul fglrx.ko a tudiz nefunguje hardwarova akcelelerace OpenGL.
K tomu Bernsteinovu polynomu - vypada nasledovne:
B(n,k,x)=(n nad i) x^k (1-x)^(n-k)
(omlouvam se za ten format, HTML proste neni TeX :-)
Vidite, ze vypocet je dost slozity (pro pocitac), takze jeho primy vypocet u Bezierovych krivek a ploch neni zdaleka idealni. Ani uvnitr OpenGL se takhle primo nepouziva - viz napriklad zdrojaky Mesy.
Zdravim, ano v te knizce je to take napsano (doufam, ze jsem se nespletl, kdyz me ted budete kontrolovat).
Bezierovy plochy a NURBS se mohou klidne provadet i na GPU, nejenom na CPU, stejne jako ostatni vypocty a renderovani. Zalezi to na vlastnostech GPU, ovladaci a verzi OpenGL (muzete natvrdo pouzit klidne SW implementaci).
Pockejte si na dalsi dily, tam si evaluatory probereme, tyto prvni dily jsou pouze "zahrivaci", aby bylo jasno, co to vlastne ty "Bezierky" jsou.
Nakonec jsem to vyresil. Na www.rage3d.com je vynikajici diskuzni forum o linuxovyjch driverech pro ATI a jeden frajer napsal patch, ktery umoznuje rozchodit proprietarni driver od ATI na kerndelu 2.6.
http://www.rage3d.com/board/
showthread.php?s=8c02dcd3cc580b39961e2f10619ea
54f&threadid=33748041&highlight=fglrx.ko
Navic jsem mel tu moznost mluvit s chlapikem, ktery je u ATI zodpovedny za linuxove ovladace a ten mi tvrdil, ze pristi tyden vydaji ovladace, ktere by tyto problemy mely resit.
Mierne zrychlit vypocet Bezierovej kubiky (a vlastne lubovolneho polynomu) sa da aj takto:
namiesto:
x = mx+nx*t+px*t*t+qx*t*t*t;
y = my+ny*t+py*t*t+qy*t*t*t;
pisat:
x = mx+t*(nx+t*(px+t*qx));
y = my+t*(ny+t*(py+t*qy));
Mimochodom, pekny prehlad kriviek (myslim tych parametrickych :) je na:
http://www.cse.unsw.edu.au/~lambert/splines/
Su tam aj interaktivne Java applet-y (veru, lepsie je raz vidiet, ako stokrat citat), vratane zdrojovych kodov.
No docela me to prekvapilo, ale optimalizace to nezvladnou. Sice se pri -O9 -ffast-math nektere operace zprehazi a vse se dela na zasobniku, ale vsechny ty nasobeni (6x) tam zustanou.
Uz neznam presne pipeliny procesoru >Pentium, ale asi se to diky zmenenemu adresovani operandu na zasobniku koprocesoru zrychli.
A bude hur :-)))
V pristim dile totiz budou informace o Bezierovych plochach (predevsim, kvuli jednoduchosti bikubickym). Je totiz dulezite porozumet trosku i teorii, z toho totiz vychazi i zpusoby hladkeho navazani krivek i ploch atd.
Kdyz pretrpite ty tri uvodni dily, dockate se implementace s evaluatory.
To je sice pekne ze chcete najprv vysvetlit teoriu bezierovych kriviek, ale predsa netreba zacinat od velkeho tresku, tejto teme sa venuje nespocetne mnozstvo clankov, stacilo by to opisat v skratke a udat linku a uz sa pustit do evaluatorov. Ved ani pri inych clankoch na tejto stranke sa nezacina s tym co je linux alebo ako sa pise na klavesnicy
Ano, mate pravdu, ze se v prvnich trech dilech venuju trosku teorii. Urcite to ale neni od velkeho tresku, z vlastni zkusenosti vim, ze znalosti interpolacnich a aproximacnich krivek je dobre pred vysvetlovanim evaluatoru a NURBS osvetlit.
Mrzi me, ze jsem Vas nazvem celeho serialu zmatl, ale mel vas "varovat" alespon perex, kde jsem psal, ze to bude trosku o teorii.