.[ ČeskéHry.cz ].
Raytracer
Jdi na stránku Předchozí  1, 2, 3  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 8. únor 2009, 16:40:13    Předmět: Odpovědět s citátem

Ten stín a stínování na té velké lesklé kouli je divný. Intenzita osvětlení/neosvětlení by neměla mít vliv na emisní složku materiálu (což pixel na zrcadle je).
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 8. únor 2009, 16:43:43    Předmět: Odpovědět s citátem

Máš pravdu, je to počítané špatně ... nicméně nemůžu to opravit, když tomu vzorci kompletně nerozumím. Teda je mi vcelku jasný, jen v něm postrádám barvu objektu.

EDIT: takhle vypadá ten kompletní vzorec, bohužel nechápu, jak tam dostat tu barvu... http://disk.jabbim.cz/matasx@njs.netlab.cz/raytracer12.png
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



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

PříspěvekZaslal: 8. únor 2009, 20:45:00    Předmět: Odpovědět s citátem

Mno, pořád tam násobíš odraz s osvětlením (to je špatně), musí se sčítat. To co jsem já napsal - I je osvětlení, to poté vynásobíš s barvou objektu a získáš finální barvu pixelu.
_________________
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
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 8. únor 2009, 21:06:12    Předmět: Odpovědět s citátem

Tož nevim co dělám špatně (refrakce ještě nemám):
kód:
COut = R * RayTrace(IP, Rout, generation + 1, intensity * R) +
                    (1f - R) * NL * I * C +
                    Convert.ToSingle(Math.Pow(NH, 4)) * I * C;

                COut *= Objects[nearest].GetDiffuse(IP);
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



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

PříspěvekZaslal: 8. únor 2009, 21:11:58    Předmět: Odpovědět s citátem

Mno, ten poslední vypadá dobře (dříve jsem si nevšiml odkazu, sorry, tak jsem to psal k tomu před ním). Mno to by mělo být teď kompletní - tj. nic by ti neměho házet chyby.

Dále budeš mít na řadě asi refrakce - u těch dbej hlavně na to, aby objekt odrážel na okrajích více než v prostřed - jako tady v příkladu s vodou
- tzn. využij fresnelových vzorců, Beer-lambertova zákona. Tady v tom případě - vidíš jak se chová voda (je to celkem mělký povrch), je to renderováno hybridem - rasterizace+raytracing a běhá kolem 4 - 10 fps (kdy globální osvětlení a voda jsou počítány ray tracerem do bufferů se kterými si už pak hraje karta), taky se omlouvám za zrnitost - ale filtr GI už by byl příliš náročný.
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.


Naposledy upravil Vilem Otte dne 8. únor 2009, 21:38:21, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 8. únor 2009, 21:15:51    Předmět: Odpovědět s citátem

Ale je to špatně Sad
a celkem logicky ne? vrátí mi to sice nějakou intenzitu, ale když ji vynásobím bez závislosti na koeficientu reflexe s barvou, tak to nemůže být 100% odrazivé. (ta modrá koule má reflexi 1)
http://disk.jabbim.cz/matasx@njs.netlab.cz/raytracer13.png
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



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

PříspěvekZaslal: 8. únor 2009, 21:43:58    Předmět: Odpovědět s citátem

Teď jsem si všiml chyby - špatně to násobíš i s tou barvou:
kód:

          Color = Object[nearest.GetDiffuse(IP)];
          COut = R * RayTrace(IP, Rout, generation + 1, intensity * R) +
                    (1 - R) * NL * I * C * Color +
                    Convert.ToSingle(Math.Pow(NH, 4)) * I * C;

Nevím teda co přesně vrací RayTrace(), ani proč je tam intensity * R, protože R má být intenzita reflekce. Taky jsi násobil barvou i spekulární odraz, ten musí být pouze přičtený (odražené světlo se nezabarvuje do barvy materiálu).
V tom 12. se ti zobrazuje ta reflexe správně (tj. je konstantně světlá i na tmavých částech).
_________________
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
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 8. únor 2009, 21:51:18    Předmět: Odpovědět s citátem

RayTrace vrací barvu, je to rekurzivní volání, v tomhle případě vrací barvu odrazu z toho místa. Upravil jsem to jak si napsal a porád je to asi špatně. http://disk.jabbim.cz/matasx@njs.netlab.cz/raytracer14.png
R je hodnota reflexe. Intensity je hodnota reflexe z minulého průchodu (tím hodlám ošetřovat, že když to klesne pod učitou mez, tak to dál nepůjde, ale to zatím není napsané správně).

EDIT: jinak ještě upřesnění - nejde mi o realtime render. Jde mi hlavně o to, aby byl výsledek co nejkvalitnější.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 8. únor 2009, 22:08:23    Předmět: Odpovědět s citátem

Špatně tam asi bude víc věcí. Zkrátka a dobře, některé vzorce si můžeš odvodit na základě pozorování v reálném světě, tzn. vypneš počítač, půjdeš se projít po bytě a zkoumat, jak se chovají světla, odrazy a zrcadlení vzhledem k vlastnostem materiálu. Nejprve ovšem jdi do koupelny a zkus si vrhnout stín na zrcadlo, zřejmě to nebude tak snadné jako v tvém raytraceru.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 8. únor 2009, 22:20:27    Předmět: Odpovědět s citátem

Vilem Otte> Slyšel jsi o tom, že GI se dá aproximovat pomocí Screen-Space Ambient Occlusion? (SSAO) Je třeba ale vzít v úvahu mnohem větší vzorkovací oblast. Je možné taky použít SSAO 2x po sobě - jednou jako standardní AO a podruhé jako GI, kde se v podstatě použijí jen jiné parametry efektu. Takhle to mají udělané v enginu StarCraft 2.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



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

PříspěvekZaslal: 8. únor 2009, 22:42:21    Předmět: Odpovědět s citátem

#Eosie - slyšel, četl a dokonce jsem si s ní už trochu hrál. Jde ji taky dobře vyhladit při slušném vzorkování (dá se použít i klasický gaussian blur), ovšem zase nevýhodou je screen-space - pouze v prostoru obrazovky (i když takový malý nápad mě teď chytl - co to zkusit vzorkovat do krychlové mapy kolem kamery - tak by se daly vzít do úvahu i objekty co leží za kamerou ... žeby mě právě napadl nápad nové technologie).
_________________
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
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 9. únor 2009, 07:55:44    Předmět: Odpovědět s citátem

Na ty stíny se vůbec nedívej, ty nejsou směrodatné. Teď řeším ten základ a ten je špatně. Takhle ten vzorec přece nemůže bejt napsanej - to má ten objekt svojí barvu jenom v místech kde je osvětlenej. Viz. zvýraznění: http://disk.jabbim.cz/matasx@njs.netlab.cz/raytracerbug2.png
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 13. červen 2009, 22:47:16    Předmět: Odpovědět s citátem

Doufám že mě neukamenujete, že zase otevírám starej thread Very Happy Dneska sem se po dlouhý době zase nudil tak sem si řikal že bych mohl ten raytracer opravit... tak sem postuju aspoň výsledek: http://disk.jabbim.cz/matasx@njs.netlab.cz/raytracer17.png

Akorát mě trápí rychlost... přemejšlel jsem, že bych napsal celý raytracer v HLSL v SM3 (nebo 4? Very Happy) ... je to vůbec dobrej nápad?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 14. červen 2009, 00:45:19    Předmět: Odpovědět s citátem

Obecný raytracer rozhodně jen tak v HLSL nenapíšeš. Tu jednoduchou scénu bys snad nějak pod SM4.0 vygeneroval, ale bylo by to dost pomalé, neohrabané a téměř needitovatelné za běhu, nicméně asi furt lepší než na CPU.

Nějaký větší možnosti bys měl pomocí Compute shaderu z DX11, podobně schopné je i OpenCL, NVIDIA CUDA nebo ATI Stream. NVIDIA CUDA má hodně dobrou dokumentaci a je tam taky dobře vysvětleno jak to udělat, aby to bylo rychlé. Zajímavé je taky tzv. Bindless Graphics v OpenGL zavádějící do GLSL pointery (psal jsem o tom v novinkách), ale tam už člověk přesně neví, jak to funguje pod kapotou, tzn. ladění výkonu by bylo spíš metodou pokus-omyl a stejně jako CUDA, je to NVIDIA-only.

OpenCL a DX11 Compute asi ještě není použitelné, ATI Stream nevím. Bindless Graphics je zatím ve stavu RFC (request for comment) a spíš jde o proof-of-concept (aspoň mám ten pocit). CUDA se běžně používá +- 2 roky.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



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

PříspěvekZaslal: 14. červen 2009, 11:33:21    Předmět: Odpovědět s citátem

Obecný raytracer v GLSL a HLSL rozhodně nenapíšeš (můžeš se o to pokusit, ale zapomeň na rozumné accelerační metody ... takže ve finále to bude pomalejší než CPU, také rekurze je nemožná a distributed ray tracing raději ani ne) - takže rozhodně horší než CPU se všemi vychytávkami.

Compute shader, CUDA nebo Bindless graphics mohou fungovat - ale narazíš na další problémy (zase především acceleration structures).

Osobně jsem já ale pořád zastánce dobře udělaných a dobře odladěných raytracerů na CPU - a když se to dobře udělá, tak grafická karta se jim i přes svůj obrovský výpočetní výkon nemůže rovnat. A teď pár otázek (nelekni se že jich tady je trochu více):
Každopádně jaké teď používáš optimalizace?
KD-trees, BVH, BIH, QBVH, nebo jen klasické Uniform či Nested Grid?
Na traversal používáš SIMD acceleration, používáš Packet tracing?
Jaký používáš intersection test?
Využíváš všech jader v tvém CPU?
Jak provádíš distributivní ray tracing (na měkké stíny)?
Adaptivní supersampling, nebo?

*OT: jestli budeš chtít tak bych mohl koncem týdne (nebo začátkem příštího - nevím jestli budu mít o víkendu čas) postnout nějaké info a malou ukázku s realtime (i non real time) raytracingem (ForgottenLIB - ano skutečně projekt pořád žije) v podobě v jaké současně je.
_________________
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
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2, 3  Další
Strana 2 z 3

 
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