Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Mivoj
Založen: 11. 12. 2012 Příspěvky: 32
|
Zaslal: 27. únor 2014, 18:50:04 Předmět: |
|
|
Jo díky s vyřešením tohoto problému. Debug verzi můžes stáhnout tu
kód: |
http://ulozto.cz/xEwqG96z/sgs-debug-7z |
|
|
Návrat nahoru |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
Zaslal: 27. únor 2014, 19:39:34 Předmět: |
|
|
No, takže to spadlo v v nějakém generovaném kódu volaném z opengl driveru.
Když jsem to krokoval, padá to někde v Case::Render po vykreslení brány.
Jestli se dá věřit call stacku, říká řádek 1788, snad to pomůže.
EDIT: mělo by to být glDrawArrays |
|
Návrat nahoru |
|
|
Mivoj
Založen: 11. 12. 2012 Příspěvky: 32
|
Zaslal: 27. únor 2014, 20:26:08 Předmět: |
|
|
mar: aha díky moc ze pomoc a jak se můžu taky na to podívat přes to pdb nebo přes co se na to díváš? Jinak v tom vertex shaderu stačilo dopsat jenom ten extension a nebo něco ještě dalšího bohužel to nemám jak ověřit.
#extension gl_arb_separate_shader_objects enable |
|
Návrat nahoru |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
Zaslal: 27. únor 2014, 21:17:32 Předmět: |
|
|
Mivoj napsal: |
mar: aha díky moc ze pomoc a jak se můžu taky na to podívat přes to pdb nebo přes co se na to díváš? Jinak v tom vertex shaderu stačilo dopsat jenom ten extension a nebo něco ještě dalšího bohužel to nemám jak ověřit.
#extension gl_arb_separate_shader_objects enable |
Ano, přidání #extension nebo #version 330 funguje taky. No ty to můžeš rovnou ladit (pdb jsou jenom debug symboly + čísla řádků), akorát na ATI (AMD) si moc nepomůžeš. Napadá mě, že možná selhalo bindování nějakých atributů.
Můžeš udělat třeba verzi, která po každém volání OpenGL zavolá glGetError a zaloguje to (včetně __FILE__ a __LINE__)? Aby bylo vidět, kde je přesně problém). Pak se dá pohnout dál.
(samozřejmě pro tebe by bylo nejlepší mít možnost to ladit na nVidii, ale myslím, že to bude nějaká drobnost)
EDIT: samozřejmě myslím nelogovat GL_NO_ERROR
Tak jsem to prohnal ještě gDebuggerem a nic zvláštního tam nebylo.
Problém se objeví v ase.cpp na ř. 1784, voláno z drawglscene.cpp, ř. 507.
Jediné, co to píše, je tohle:
Debug String: Detected error: The debugged process asked for an extension function pointer (glUniform4fv) from one render context, but called this function pointer in another render context (context #2)
(myslím si ale, že tohle nemá na nic vliv. dost pochybuji, že by driver dynamicky generoval virtuální vstupní body těch funkcí pro každý kontext zvlášť).
Jiné chyby to nenašlo (akorát gDebugger pak crashnul taky |
|
Návrat nahoru |
|
|
Mivoj
Založen: 11. 12. 2012 Příspěvky: 32
|
Zaslal: 27. únor 2014, 21:33:37 Předmět: |
|
|
Jasně mohl jsem dát rovnou #version 330 a dát podporu grafik pro Opengl 3.3, ale já chtěl aby to ještě jelo i na HD2000, které podle AMD podporují jen Opengl 3.1, prostě jsem chtěl více méně zajistít, aby to jelo na DirectX 10 kartách kromě Intel grafik, které některé podporují jen do Opengl 2.1.
Díky za rády jak hledat chyby. |
|
Návrat nahoru |
|
|
Spytihněv
Založen: 05. 04. 2011 Příspěvky: 547 Bydliště: Praha
|
Zaslal: 28. únor 2014, 01:27:32 Předmět: |
|
|
Mně přidání extension nepomáhá - stále hlásí stejnou chybu při kompilování shaderu a následně v menu zamrzne při kliknutí na start. Přidání verze 330 nehází chybu, ale mrzne taky. |
|
Návrat nahoru |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
Zaslal: 28. únor 2014, 11:41:36 Předmět: |
|
|
Moc pěkné, koukám že i na grafice jsi zapracoval.
Zkoušel jsem to na AMD FirePro (což je dost lowend) a měl jsem 10-20 fps v 640x480.
Po vypnutí světel jsem měl krásných 80-250, ovšem při kolizích u kulometu mi to spadlo zase na nějakých 10,
myslím že by nebylo špatné zauvažovat přece jen o low poly kolizních modelech
(nikdo nepočítá kolize se vším, pokud je geometrie velmi detailní),
protože pokud ti to v některých případech bude dělat 10 nebo 20 fps na high-end systémech,
kde moderní hry běží naprosto plynule s plnými detaily,
lidé se budou divit (nebo zkus kolize nepočítat každý snímek a interpolovat,
ale myslím že ani to v tomhle případě nepomůže, i když samozřejmě záleží, jak to máš udělané)
A taky vůbec nevím, jak zadat tu adresu, jsem SG-lama
EDIT: bohužel se mi teď stalo, že jsem vypadl z mapy |
|
Návrat nahoru |
|
|
Mivoj
Založen: 11. 12. 2012 Příspěvky: 32
|
Zaslal: 4. březen 2014, 22:02:51 Předmět: |
|
|
Mohli byste někdo zkusit jestli vám pujde testovací mapa na nVidii, kterou jsem vytvořil, abych to mohl rozjet na notebooku s Intel GMA 4500, která podporuje Opengl 2.1 a tak jsem to trochu upravil. Na něm to jede a nepadá.Takže uvidím jestli s tím budou mít problém i nVidie.
http://ulozto.cz/xMVzETdL/testovaci-mapa-7z
mar: ten gDEBugger je dost dobrý akorát se vněm vyznat a pochopit proč mu vadí zrovna ty chyby, i když u některých nevím proč mu to vadí, protože v mém kodu mně nepřijde, že je to špatně definované.
O těch kolizích vím a asi to budu řešit jen jednoduchými modely, ale nemám je vytvořené. No sice s interpolovaním nemám zkušenosti ani nevím jestli to jde nějak řešit v Bullet Physics knihovně, kterou využívám a jaktakž se snažím pochopit. Adresu můžeš zadat automaticky přes klávesu T jinak musíš ji zadat na té virtuální klávesnici. Jinak postup je vysvětlen v infu.
Spytihněv: díky za testování právě vydáním testovacích verzí to diky nim snad opravím. |
|
Návrat nahoru |
|
|
Spytihněv
Založen: 05. 04. 2011 Příspěvky: 547 Bydliště: Praha
|
Zaslal: 4. březen 2014, 22:23:08 Předmět: |
|
|
Funguje! |
|
Návrat nahoru |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
Zaslal: 4. březen 2014, 23:31:21 Předmět: |
|
|
Mivoj napsal: |
No sice s interpolovaním nemám zkušenosti ani nevím jestli to jde nějak řešit v Bullet Physics knihovně, kterou využívám a jaktakž se snažím pochopit. |
No interpolace nijak nesouvisí se simulací.
Jde o to, že budeš počítat simulaci řekněme fixně 20x za vteřinu (možná by stačilo i 15x, uvidíš sám) a budeš interpolovat pozici hráče (tj. v tvém případě kamery).
Máš dvě možnosti:
1) akumulátor (ten budeš potřebovat tak jako tak, pokud budeš chtít fixní time step): tj. na každý snímek přičteš k akumulátoru delta čas a jakmile přesáhneš periodu simulace (tj. 1/f), uděláš krok v simulaci a akumulátor vynuluješ (nebo odečteš 1/f).
aktuální hodnotu akumulátoru pak použiješ k lineární interpolaci hráče,
tj. old + (current - old) * (accum * f), kde f je frekvece simulace (řekněme 20)
nebo si můžeš akumulátor normalizovat a v tom případě budeš přičítat f*dt, to je asi elegantnější (a hlídat dosažení jedničky)
2) dynamická nelineární interpolace (toto používám momentálně já)
tj. na každý snímek spočítáš smooth += (current - smooth)/n (smooth je interpolovaná pozice, current je poslední pozice simulace)
n zvolíš podle delta času, aby to působilo dobře, já používám 0.0625 / dt
ještě musíš ošetřit speciální případ, kdy n <= 1, v tom případě jednoduše přiřadíš smooth = current
Jinými slovy toto plynule přibližuje předchozí pozici k nové - čím je blíž, tím míň se posouvá.
(doufám, že tam někde není překlep nebo blábol
EDIT: testovací mapa u mě taky funguje |
|
Návrat nahoru |
|
|
Mivoj
Založen: 11. 12. 2012 Příspěvky: 32
|
Zaslal: 7. březen 2014, 17:30:44 Předmět: |
|
|
No když fungovalo toto tak by měla i tahle verze. Doufam, že jste si nesmazali Stargate Simulator v0.311, protože ted stačí když do ní přepíšete ten bin a shadery a mělo by to jet. No a pokud to pujde, tak pak v nastavení grafiky povolte vykreslit zbývající objekty a uvidíme.
http://ulozto.cz/xHvLWFjS/sgs-bin-7z
mar: tak bullet tam má na to přímo fůnkci, kterou mam nastavenou asi jako dynamickou interpolaci a právě jsem netušil, že se to tak nazývá.
gScena.m_dynamicsWorld->stepSimulation(frameTime, 1, frameTime);
frameTime název se mně líbí víc než dt a výpočet dt provádí taky sám bullet. Jinak díky za vysvětlení pojmu.
kód: |
// stepSimulation proceeds the simulation over 'timeStep', units in preferably in seconds.
// By default, Bullet will subdivide the timestep in constant substeps of each 'fixedTimeStep'.
// in order to keep the simulation real-time, the maximum number of substeps can be clamped to 'maxSubSteps'.
// You can disable subdividing the timestep/substepping by passing maxSubSteps=0 as second argument to stepSimulation, but in that case you have to keep the timeStep constant.
virtual int stepSimulation(btScalar timeStep,int maxSubSteps=1, btScalar fixedTimeStep=btScalar(1.)/btScalar(60.))=0;
|
|
|
Návrat nahoru |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
Zaslal: 7. březen 2014, 18:24:29 Předmět: |
|
|
Tak bohužel tě nepotěším. Padá |
|
Návrat nahoru |
|
|
Mivoj
Založen: 11. 12. 2012 Příspěvky: 32
|
|
Návrat nahoru |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
Zaslal: 9. březen 2014, 00:07:46 Předmět: |
|
|
Funguje |
|
Návrat nahoru |
|
|
Mivoj
Založen: 11. 12. 2012 Příspěvky: 32
|
|
Návrat nahoru |
|
|
|