Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
andy
Založen: 20. 09. 2007 Příspěvky: 54
|
Zaslal: 20. září 2007, 13:01:59 Předmět: Load .x file |
|
|
Mám problém s prekladom tohto riadku kódu vo funkcii nacitania suboru .x
g_pTexture = new IDirect3DTexture9*[g_NumMaterials];
Vypisuje mi to tuto chybu:
cannot allocate an object of type `IDirect3DTexture9'
because the following virtual functions are abstract:
Ide o to že mi nechce vytvoriť pole premenných IDirect3DTexture9. Pole materialov vytvorilo, len s texturami je problem. Neviete náhodov kde by mohol byť problem. dik |
|
Návrat nahoru |
|
|
Quiark
Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 20. září 2007, 14:06:22 Předmět: |
|
|
IDirect3DTexture je interface, což je abstraktní třída => nelze vytvořit její instanci pomocí IDirect3DTexture *t = new IDirect3DTexture(); Proto ani nejde udělat pole těchto objektů.
Ty potřebuješ pole ukazatelů na IDirect3DTexture, to půjde vytvořit bez problémů, a po jeho vytvoření si každý ukazatel nastavíš na nově vytvořenou instanci textury (a tu vytvoříš tak, jak se standardně v D3D textury vytvářejí).
Takže bys měl mít něco jako
kód: |
IDirect3DTexture **pole = new IDirect3DTexture*[3];
for (int i .... ) {
pole[i] = Direct3D vytvor texturu(...);
}
|
_________________ Mám strach |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 20. září 2007, 14:58:13 Předmět: |
|
|
Pro vytvoreni textury se pouziva metoda IDirect3DDevice9::CreateTexture, viz dokumentace nebo tutorialy v DX SDK. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
andy
Založen: 20. 09. 2007 Příspěvky: 54
|
Zaslal: 21. září 2007, 14:32:52 Předmět: |
|
|
Fajn dik na to by som asi neprisiel, kedže doteraz som vytvaral premenne textur iba s jednou hviezdickou |
|
Návrat nahoru |
|
|
krkovicka
Založen: 24. 11. 2007 Příspěvky: 14
|
Zaslal: 28. listopad 2007, 13:25:51 Předmět: vykresleni .x modelu pomoci shaderu |
|
|
jak napovida titulek, mam nasledujici problem s vykreslenim modelu. Model je slozen radove ze stovek casti. na kazde casti muze byt natazena jina textura a material muze mit jine vlastnosti, ale nemusi. Napriklad listnaty strom se sklada z nekolika set listu a nekolika desitek casti kmene. Mam tedy stovky casti, dva druhy materialu a prislusne textury. A ted to co mne zajima:
- zatim to mam tak ze mam v shaderu jen texture,diffuse,ambient,specular a pred kazdou casti nastavim pomoci setvalue tyto parametry, nedoslo mi ale ze to prepisuju v pameti graficky karty a cely objekt se pak na konci vykresli s hodnotami parametru kterejma sem to prepsal naposled(vysledne strom je pak celej zelenej, vetne kmene), ve skutecnosti se to zrejme nevykresluje po prikazu drawsubset(), ale az na konci OnPaint()
- mam mit v shaderu jen texture,diffuse,ambient,specular a pro kazdou cast inicializovat novej shader? tj asi blbost co?
- mam to vykreslovat tak, ze napred seradim jednotlivy casti a nastavim do shaderu neco jako texture1, texture2, .., textureN, materialDiff1...N, materialAmb1..N, materialSpec1..N(pro vsechny druhy casti zvlast) a nasledne vykreslim pomoci jednoho shaderu vsechny casti. Tohle mne ted napadlo jako reseni, ale prijde mi to trochu krkolomny a nerad bych se doto poustel, pokud exituje elegantnejsi reseni.
jestli jsou moje dosavadni poznatky uplne mimo skutecnost, tak mne prosim opravte/poradte, diky |
|
Návrat nahoru |
|
|
krkovicka
Založen: 24. 11. 2007 Příspěvky: 14
|
Zaslal: 28. listopad 2007, 13:32:21 Předmět: |
|
|
jen doplnuji ze pouzivam Manged Dx9, C#, shader 2.0 |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 28. listopad 2007, 15:29:49 Předmět: Re: vykresleni .x modelu pomoci shaderu |
|
|
krkovicka napsal: |
- zatim to mam tak ze mam v shaderu jen texture,diffuse,ambient,specular a pred kazdou casti nastavim pomoci setvalue tyto parametry, nedoslo mi ale ze to prepisuju v pameti graficky karty a cely objekt se pak na konci vykresli s hodnotami parametru kterejma sem to prepsal naposled(vysledne strom je pak celej zelenej, vetne kmene), ve skutecnosti se to zrejme nevykresluje po prikazu drawsubset(), ale az na konci OnPaint() |
Vykreslování pomocí efektů se dělává tak, že iteruješ pro všechny subsety v meshi a v každé této iteraci nastavíš parametry efektu (SetValue...) a provedeš vykreslení (typicky pomocí DrawSubset).
krkovicka napsal: |
- mam mit v shaderu jen texture,diffuse,ambient,specular a pro kazdou cast inicializovat novej shader? tj asi blbost co? |
To že máš v efektu jednotlivý textury je v pořádku, tak to má být. Nějak ale nevím, co myslíš tou inicializací
krkovicka napsal: |
- mam to vykreslovat tak, ze napred seradim jednotlivy casti a nastavim do shaderu neco jako texture1, texture2, .., textureN, materialDiff1...N, materialAmb1..N, materialSpec1..N(pro vsechny druhy casti zvlast) a nasledne vykreslim pomoci jednoho shaderu vsechny casti. Tohle mne ted napadlo jako reseni, ale prijde mi to trochu krkolomny a nerad bych se doto poustel, pokud exituje elegantnejsi reseni.
jestli jsou moje dosavadni poznatky uplne mimo skutecnost, tak mne prosim opravte/poradte, diky |
Z hlediska efektivity by bylo lepší předgenerovat si ten mesh tak, aby měl co nejmíň subsetů, tj. sloučit subsety se stejnýma textura, materiálama atd. Následně pak provádíš vykreslování jak jsem psal výše, tj. pro každý subset začneš efekt, nastavíš parametry, pro každý pass efektu vykreslíš subset, ukončíš pass, ukončíš efekt.
Kostra kódu by vypadala teda nějak takhle:
kód: |
foreach mesh
foreach subset in mesh
effect.Technique = subset.Material.Technique
effect.Begin
effect.SetValue(...)
foreach pass in effect
pass.Begin // effect.BeginPass(pass)
subset.draw // mesh.DrawSubset(subset)
pass.End // effect.EndPass
effect.End
|
Z hlediska efektivity pak obecně těžko říct, podle čeho je nejlepší řadit (textury, efekty, ...) - o tom bylo napsáno hodně paperů. Mně se třeba kdysi osvědčilo na jednom projektu řadit podle textur, takže můžeš zkusit třeba to Pak si musíš pamatovat, jakou texturu jsi nastavoval jako poslední a pokud je ta, kterou bys chtěl nastavit jako další, shodná s tou poslední uloženou, tak už tu texturu znova nenastavovat. Tj. udělat si takovou vlastní cache. Teď mě napadá, že tuhle cache je vhodný mít pro většinu parametrů, které se posílají do gr. karty. Akorát se pak musí vybrat vhodný způsob řazení, aby se tahle cache využila... |
|
Návrat nahoru |
|
|
krkovicka
Založen: 24. 11. 2007 Příspěvky: 14
|
Zaslal: 28. listopad 2007, 15:39:58 Předmět: |
|
|
super,
uz chapu to begin effect a pass. Slouceni meshu zni skvele, do toho jdu. diky za vycerpavajici odpoved
|
|
Návrat nahoru |
|
|
|