.[ ČeskéHry.cz ].
SW Rendering v JavaScriptu
Jdi na stránku 1, 2, 3, 4, 5  Další
 
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
nou



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

PříspěvekZaslal: 17. březen 2013, 16:18:04    Předmět: SW Rendering v JavaScriptu Odpovědět s citátem

MODERATOR: Vytrzeno z kontextu http://www.ceske-hry.cz/forum/viewtopic.php?t=3651

1Pupik1989 clovece preco ty nepouzivas WebGL? co som pochopil tak si vlastne pises vlastny rasterzier od piky. viem je to zaujimava robota ale realne to nevidim ze by to bolo pouzitelne. jedine ze pridu moznost spustat viacvlaknovy JS kod.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
1Pupik1989



Založen: 06. 02. 2013
Příspěvky: 58

PříspěvekZaslal: 17. březen 2013, 18:36:42    Předmět: Odpovědět s citátem

nou: WebGL nemá takovou podporu v prohlížečích. S 2D contextem mám šanci, že s excanvasem to rozjedou v rámci možností i lidi s Internet Explorerem. Sice pro ně už mám hotové jiné prostředí (jentak na oko) z pohledu boha, ale 3D by bylo hezčí. Samozřejmě počítám s tím, že to budou nějaké super low-poly modely, ale i tak by to bylo fajn. Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 17. březen 2013, 18:45:55    Předmět: Odpovědět s citátem

1Pupik1989> a zkousel jsi merit, kolik polygonu zvladnes zobrazit v primerene velkem okne? Abys pak nezjistil, ze jsi nekde u 100 polygonu na frame...
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
1Pupik1989



Založen: 06. 02. 2013
Příspěvky: 58

PříspěvekZaslal: 17. březen 2013, 19:38:20    Předmět: Odpovědět s citátem

OndraSej: cca. 1000 trojúhelníků při rozlišení 1280x1024 běží u mě na 40 - 50 fps. Pokud domyslím to Octree, tak by se ještě fps mohli navýšit. Jako první jsem chtěl Z-buffer, ale to by se asi nejspíš zaseklo úplně. Nebo nemám představu jak bych to udělal s ohledem na nároky. Hodně toho udělá Backface Culling.



To první byl můj úplně počáteční pokus. Byl špatný, takže jsem ho smazal.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Hunter



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

PříspěvekZaslal: 17. březen 2013, 20:02:56    Předmět: Odpovědět s citátem

1Pupik1989 napsal:
cca. 1000 trojúhelníků při rozlišení 1280x1024 běží u mě na 40 - 50 fps.
Potřebuješ aspoň 100x vyšší výkon na to, aby se na tom dala postavit rozumně vypadající 3D hra.

Nevím tedy co znamená "u mě" za HW, ale 100k polygonů (to je pořád cca 50x míň než současné AAA hry - ideální by byl milion) by ti mělo ve FullHD běžet plynule.
_________________
Sharing is caring.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1534
Bydliště: u Prahy

PříspěvekZaslal: 17. březen 2013, 21:12:30    Předmět: Odpovědět s citátem

To FPS hodně klesne, až bude překreslovat každý pixel viewportu, nejlépe víckrát Smile (překrývající se polygony). WebGL mi přijde jako lepší nápad, přestože v IE nebude podporován nikdy Sad (třeba někdo udělá nějakej ActiveX).
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 17. březen 2013, 21:31:33    Předmět: Odpovědět s citátem

1Pupik1989> octree te moc nezachrani - umozni ti orezat polygony, co nejsou videt, ale porad budes mit na obrazovce max 1000 polygonu, coz je dost malo na zobrazeni cehokoliv detailnejsiho. Ber to tak, ze pokud postava ma 200 polygonu (coz je priblizne odpovida prvnimu Quakovi), tak muzes mit na obrazovce soucasne 5 postav a uz ti nic nezbyde na prostredi.

Napsat si softwarovy 3d engine v javascriptu rozhodne je frajerina a klidne v tom pokracuj, ale na neco jineho nez demo (ve smyslu demoscena) to nebude a mas lepsi pouzit to webGL a spolehat na to, ze nez hru dokoncis, tak uz ho bude podporovat i IE (v te dobe treba IE13).
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
1Pupik1989



Založen: 06. 02. 2013
Příspěvky: 58

PříspěvekZaslal: 18. březen 2013, 01:11:35    Předmět: Odpovědět s citátem

Hunter: Tohle je softwarové, nemůžeš chtít nemožné v nemožném. "u mě" znamená Phenom II X4 955 BE, 8Gb DDR3 1333 (@1466Mhz) a Radeon HD 6850.

Ladis: Překreslovat každý pixel nemám proč, proto jsem Z-Buffer vzdal, i když ani ten by nemusel být po pixelech. Smile

OndraSej: Octree nepomůže tolik, ale pomůže přeci jen. Když ho dám místo momentálního třídění podle osy Z, tak je jednak rychlejší a druhak ušetřím spoustu trojúhelníků už v cyklu.

Vymyslet to opravdu není sranda. Jen 14 dní jsem ladil objekt pro matice 4x4, aby běžely nějak rozumně. Nechci se chvástat, ale momentálně je to jedna z nejrychlejších matematických knihoven, leč mi to je prd platné a pořád je to pomalé. 40fps to má při neustálém překreslování 1000 trojúhelníků, ty se ale tak často překreslovat v reálu nebudou. Navíc to pouštím ve smyčce opožděné o 1ms, takže nakonec i tam by se to mohlo zrychlit. Zkusím requestAnimationFrame co ukáže. Nicméně to celé vytvářet je celkem sranda. Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Hunter



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

PříspěvekZaslal: 18. březen 2013, 09:47:02    Předmět: Odpovědět s citátem

1Pupik1989 napsal:
Hunter: Tohle je softwarové, nemůžeš chtít nemožné v nemožném.

Tak pokud to je nějaké matamatické cvičení, tak to je OK.
Ale nepočítej s tím, že na takové technologii můžeš postavit skutečnou 3D hru.
Věř, že hráče nikdy nezajímají sebestředné argumenty programátora _proč_ je to pomalé Smile
_________________
Sharing is caring.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
1Pupik1989



Založen: 06. 02. 2013
Příspěvky: 58

PříspěvekZaslal: 18. březen 2013, 11:39:33    Předmět: Odpovědět s citátem

Hunter: No RPG ala Skyrim to určitě být nemůže. Nejspíš to asi skončí tak, že s tím 2D to nechám jen opravdu na nějaké demo postav, objektů atd. Jen takovou prezentaci. Pokud ovšem nevymyslím způsob jak z toho vytáhnout víc, což asi už nejde. Kolikrát mám nutkání s tím seknout a napsat to v pořádném jazyce. Jenže když si představím tu celou cestu třeba s C#, jako když jsem začínal s javascriptem, tak to potěš koště. Znovu 7 let už bych asi nechtěl trpět. Very Happy
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: 18. březen 2013, 12:09:23    Předmět: Odpovědět s citátem

#Pupik1989 - Nebudu se vyjadřovat k tématu, u sebe jsem ho zařadil do balíku "Yet another flamewar". Nicméně na něco zareaguji:

Hráčům je úplně jedno na čem hra běží a v čem byla napsaná. Psát softwarový rasterizér v Managovaném jazyku je nepoužitelné (rychlost), psát jej v javascript je mimo demoscény absolutně k ničemu. Pokud to napíšeš v nativním Céčku, využiješ alespoň SSE2 (který má dnes dle Steam stats 99.9% mašin), a více-jádrové procesory, dostaneš se u nejmodernějších (Ivy Bridge arch.) někam k výkonu několik let staré generace GPU - tipl bych tak GeForce 8800. S tím, že budeš používat hodně optimální algoritmy jako paralelní halfspace triangle rasterizaci, a ideálně data ukládat v AoS místo SoA. Takový rasterizér je použitelný pro hry (zvládne statisíce trianglů vč. shadingu i na klasických low-end Core i3).
Druhou možností je napsat rasterizér v CUDA/OpenCL, kde to má větší smysl, nicméně stále budeš pomalejší než D3D/OpenGL ... nicméně už to bude více použitelné.

Se slovem "nejrychlejší" matematická knihovna opatrně. Klidně uploadni její zdroják a můžeme udělat benchmark s ostatními známými knihovnami (glm, glsl-sse2, eigen, vectormath, a další), nicméně pochybuji že tyto knihovny trumfneš, dělá na nich více lidí celá léta, s léty zkušeností v této oblasti.

Zajímalo by mě, jak chceš řešit např. prolínající se polygony bez z-bufferu?

Octree (ani jeho efektivnější varianta KD-tree), ani jakákoliv jiná hierarchie scény (BVH, BIH, QBVH, LBVH, etc. etc.) ti nepomůže s rychlostí u rasterizéru o více než pár procent (pokud nemáš prasáckou scénu), vysoké zvýšení výkonu dávají u ray tracingu.

Celkově vzato k rychlosti které dostahuješ, je příliš nízká. Podívej se na scény zde - http://graphics.cs.williams.edu/data/meshes.xml ... až dokážeš že ti alespoň Sibenik nebo Dabovicova Sponza běží stabilně při 50 - 60 fps na tvé mašině doma s texturováním a alespoň lambertem a phongem, pak to bude teoreticky použitelné, do té doby nikoliv. Např. nám se momentálně daří dosahovat při ray tracingu kolem 100 MRays/s Conference hall (282k trianglů) na fermi kartách (gtx 580). Což ti dá pro primary rays kolem 48 fps na 1920x1080 rozlišení. Pro hry je to však stále příliš málo.

EDIT: Malý note, napsat rasterizér v C, který je použitelný se dá cca za týden lehké práce (cca 3 - 4 hodiny denně) bez jakýchkoliv dependencies - tedy když máš znalosti matematiky kolem, a zkušenosti v daném jazyce.

EDIT2: Překlep, záměna AoS za SoA.
_________________
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
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 18. březen 2013, 12:31:10    Předmět: Odpovědět s citátem

1Pupik1989> Asi jsem to spatne napsal - schvalne si to zkus v profileru, ale muj odhad je, ze te nebrzdi ani tak detekce neviditelnych polygonu nebo jejich razeni, ale jen jejich vykreslovani na obrazovku. Coz znamena, ze i kdyz budes mit perfektni orezavani neviditelnych polygonu, tak viditelnych polygonu nemuzes mit vic jak 1000 soucasne (a to porad je strasne malo).

Ale jak psal Dlaha, pokud jsi zvladnul napsat zakladni SW renderer v JavaScriptu, uz mas nejspis dost zkusenosti, aby pro tebe prechod na jiny jazyk nebyl nejak zasadni problem.
_________________
http://trionteam.net
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: 18. březen 2013, 23:51:04    Předmět: Odpovědět s citátem

Přidávám zde benchmark naší knihovny scMath (je obdobná glsl-sse2, nicméně podporuje navíc quaterniony, aos-soa transformace, a lze zapnout it sse4 mód přes makro - avšak to nebylo použité) psané v C/C++ - zde je pár výsledků na notebooku s Core i3:
http://pastebin.com/emPcx1mG

Knihovna je v C++, nicméně to je pro hráče unrelated (je NEZAJÍMÁ v čem daný výrobek je, pouze jak rychle funguje a jaké má výsledky).

Kód který jsem použil používá stejnou sérii operací jako ty - inverze matice, násobení matice, sečtení vektorů a násobení vektor krát matice. Zpracoval jsem to dávkově z náhodně generovaných vektorů a matic (velikost dávky byla 10000000 matic a 10000000 vektorů).

Pro fetching jednotlivých matic a vektorů z paměti na 1 vlákně dostávám cca 8771929 takových operací za sekundu - v porovnání s tvým javascript kódem (566047 takových operací za sekundu - note. ten používá jeden vector a matici - což není zrovna ideální pro benchmarking, ale budiž) je to 15.49x rychlejší. Nicméně jen blázen by dnes nedělal věci multicore a s řádným fetchingem s paměti. Ideální warp size pro mě bylo 128 nebo 256 matic a vektorů, implementováno na persistentních vláknech, kdy jsem je spustil 4 (což je logické, jelikož Core i3 je dvoujádro s hyperthreadingem). Výsledek byl 26525198 (pro warp=128) a 26738310 (pro warp=256) - což je 46.86x, potažmo 47.23x rychlejší.
Jinými slovy jen lepším přístupem do paměti a použitím obou fyzických jader naplno jsem svůj kód zrychlil cca 3.048x - to ti javascript nikdy neumožní. V praxi to znamená, že na stejné mašině tím dokážu kreslit 3x tolik trianglů co v původní verzi.

Note. je možné, že pro použití více vláken tam budou o nějaký zlomek procenta lepší/horší výsledky, což je dáno vlastností implementace pomocí persistentních vláken).

Testovací systém je Windows 7, aplikace byla 32-bit. Kompilátor MSVC2010 (nicméně knihovna je psaná v SSE2 intrinsics, takže moc optimalizací na ní MSVC provést stejně nemůže).

Nechci tě zde od ničeho odrazovat, ale chci ti tímto říci, že psát pro engine software rasterizér v javascriptu je nesmysl.
_________________
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
gindar



Založen: 05. 10. 2007
Příspěvky: 86

PříspěvekZaslal: 19. březen 2013, 08:51:34    Předmět: Odpovědět s citátem

1Pupik1989 napsal:
napsat to v pořádném jazyce. Jenže když si představím tu celou cestu třeba s C#, jako když jsem začínal s javascriptem, tak to potěš koště. Znovu 7 let už bych asi nechtěl trpět. Very Happy


Řešením je třeba Python Smile

A k věci:
citace:
Navíc to pouštím ve smyčce opožděné o 1ms, takže nakonec i tam by se to mohlo zrychlit.

Pokud děláš hlavní smyčku takto:
kód:

function tick(){
....
setTimeout(tick, 1);
}

nebo takto
kód:

function tick(){
....
}
setInterval(tick, 1);


pak je to špatně. S každým voláním setTimeout se vytváří nový subprocess, tzn. pokud ten subprocess nestíhá a už vytváříš nový, tak se ti to zaseká. U setInterval už si nejsem tak jistý.

Je rok 2013 a jsou k dispozici lahůdky jako requestAnimationFrame a WebWorkers (vlákna) http://www.w3.org/TR/workers/.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
1Pupik1989



Založen: 06. 02. 2013
Příspěvky: 58

PříspěvekZaslal: 19. březen 2013, 12:27:05    Předmět: Odpovědět s citátem

gindar: Mám trochu jinak, ale principálně to je verze se setTimeout.

kód:
function prerender(){
  obj.transformation.rotateY = deg * $Math.PiOver180;
  $Game.render();
 
  $Game.status.complete(function(){
    setTimeout(prerender,1);
  });
 
  $Game.status.error(function(msg){
    console.log(msg);
  });       
};;


requestAnimationFrame už mám připravený déle, nevím proč jsem ho ještě nepoužil.

kód:
(function() {
  var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||
                              window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
  window.requestAnimationFrame = requestAnimationFrame;
})();


Vilem Otte: Takže už jen vyřešit problém, jak spouštět C++ v internetovém prohlížeči, jelikož to má být browser hra. Smile
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
Jdi na stránku 1, 2, 3, 4, 5  Další
Strana 1 z 5

 
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