Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Solid.Sn
Založen: 08. 08. 2009 Příspěvky: 55
|
Zaslal: 8. srpen 2009, 17:50:51 Předmět: VertexShader v DirectX |
|
|
Ahoj,
snažím se dojít na to jak používat VertexShader v DirectX ale asi (určitě) dělám něco špatně a nemůžu dojít na to co. Myslím, že nejlépe pomůže část kodu...
Assembler VertexShaderu - měl by jen prohodit souřadnice, nic složitého (mimochodem zkoušel jsem pár zdrojáků již napsaných):
kód: |
vs.1.0
dcl_position v0
mov r1.x, v0.y
mov r1.y, v0.z
mov r1.z, - v0.x
mov r1.w, v0.w
mov oPos, r1
|
Vytvoření VertexShaderu (s tím není problém, funguje správně):
kód: |
IDirect3D9 * D3D;
IDirect3DDevice9 * D3DD;
ID3DXMesh * D3DM;
IDirect3DVertexShader9 * D3DVS;
ID3DXBuffer * D3DB;
...
D3DXAssembleShaderFromFile( "vertexshader.vs", 0, 0, 0, &D3DB, 0 );
D3DD -> CreateVertexShader( ( DWORD * ) D3DB, &D3DVS );
... |
Použití při renderování:
kód: |
...
D3DD -> BeginScene();
D3DD -> SetVertexShader( D3DVS );
D3DM -> DrawSubset( 0 );
D3DD -> EndScene();
D3DD -> Present( 0, 0, 0, 0 );
... |
Klasicky kreslím mesh konvičky, problém je v tom že mi ve scéně onen VertexShader prostě nic nedělá a nedaří se mi dojít na to proč.
Díky za rady... |
|
Návrat nahoru |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 8. srpen 2009, 19:07:30 Předmět: |
|
|
2 veci:
1. Kontroluj si error code KAZDEJ dx funkcie a oddebuguj si to, urcite budes prekvapeny
2. Zapni si Debug verziu DLLiek directu v Control Panel a nastav si vyssiu intenzitu vystupov
3. Sedi ti format (FVF) ? |
|
Návrat nahoru |
|
 |
Solid.Sn
Založen: 08. 08. 2009 Příspěvky: 55
|
Zaslal: 8. srpen 2009, 19:42:54 Předmět: |
|
|
VladR napsal: |
1. Kontroluj si error code KAZDEJ dx funkcie a oddebuguj si to, urcite budes prekvapeny
|
Chyby kontroluju, právě proto, že jsem při běhu programu nepřišl na žádnou chybu a kvůli přehlednosti jsem to sem vložil bez debugu...
VladR napsal: |
2. Zapni si Debug verziu DLLiek directu v Control Panel a nastav si vyssiu intenzitu vystupov
|
Tohle jsem nějak nepobral, nemohl bys mi to líp popsat?
VladR napsal: |
3. Sedi ti format (FVF) ?
|
Vzhledem k tomu, že zkouším VertexShader poprve tak jsem chtěl aby to bylo co nejjednodušší, takže reneruju konvičku z D3DXCreateTeapot, která má co já vím (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE, ale FVF v tomto případě nenastavuju), nedošel jsem ale na to jaký vliv by to na můj problém mělo? |
|
Návrat nahoru |
|
 |
Solid.Sn
Založen: 08. 08. 2009 Příspěvky: 55
|
Zaslal: 9. srpen 2009, 01:27:54 Předmět: |
|
|
Ach jo, konečně jsem na to došel, měls pravdu, i když to zrovna moc nechápu.
Testoval jsem D3DXAssembleShaderFromFile a pak SetVertexShader a protože tyto dvě metody byly úspěšně provedeny, neřešil jsem metodu CreateVertexShader (která je volána "mezi nimi").
Nechápu sice jak může CreateVertexShader vyhodit chybu a následně SetVertexShader chybu nevyhodit (i když to nefunguje)...
Problém byl tady:
kód: |
D3DD -> CreateVertexShader( ( DWORD * ) D3DB, &D3DVS ); //chyba
D3DD -> CreateVertexShader( ( DWORD * ) D3DB -> GetBufferPointer(), &D3DVS ); //správně
|
Díky za radu  |
|
Návrat nahoru |
|
 |
Khaj

Založen: 16. 01. 2008 Příspěvky: 49
|
Zaslal: 9. srpen 2009, 08:45:59 Předmět: |
|
|
Ahoj, brzy pochopíš
I. D3DD -> CreateVertexShader(..., &D3DVS );
Pokud nastane chyba, tak DSDVS se nastaví na NULL.
II. Volání
D3DD -> CreateVertexShader( ..., NULL);//s parametrem NULL
je samozřejmě správně a vypne shadery a zapne FFP. |
|
Návrat nahoru |
|
 |
Solid.Sn
Založen: 08. 08. 2009 Příspěvky: 55
|
Zaslal: 9. srpen 2009, 12:25:36 Předmět: |
|
|
Ahoj, už je mi to jasný (předpokládal jsem, že když CreateVertexShader neprojde tak nezmění D3DVS (který jsem měl nedefinovaný, takže by mi to pěkně vyhodilo error )).
Aspoň už jsem se poučil a už vím, že musím debugovat fakt všechny metody.
Já jsem původně i špatně pochopil princip VertexShaderu, ale s mojí angličtinou aní není čemu se divit... Myslel jsem si, že na vertexy se nejdřív provede transformace ve Fixed Pipeline a pak až pomocí VertexShaderu upravím vertexy. Nikde jsem se nedočetl opak a tak jsem na to přišel až když jsem to zkoušel...
Pokud to teda dobře chápu, jakmile zapnu před vykreslováním VertexShader tak všechno co nastavím ve Fixed Pipeline (SetTransform) prostě nebude na vykreslované vrcholy použito a půjde to pouze přes VertexShader?
Díky  |
|
Návrat nahoru |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 9. srpen 2009, 13:25:14 Předmět: |
|
|
Z FFP ti zostane predovsetkym nastavenie render states.
Akakolvek praca s vertexami (transform/lighing) uz ale bude robena cez ten Shader.
Inak, preco sa chces trapit s DX8 a assemblerovskymi shadermi ? Dnes uz mozes pohodlne pracovat s HLSL, na ktorych debugovanie/editovanie su podstatne lepsie tooly.
Ale ked uz sa trapis s ASM shdermi, tak si aspon stiahni nejaku starsiu verziu NVSDK browseru, kde si mozes postupne prechadzat vsetky efekty a pozerat ako to robili.
Rozhodne si stiahni tieto PDFka, ktore su poslednymi dobrymi kniznymi verziami zaoberajucimi sa ASM shadermi : http://tog.acm.org/resources/shaderx/ |
|
Návrat nahoru |
|
 |
|