Na wat geflans en gedoe heb 'k eens een 3D-engine gemaakt. Met OBJ-lezer, levellezer, programmeerbare shaders, dynamische camera, lost device-handling, en al de andere shiny termen die je eropaf kunt gooien.

Leuk allemaal met al die verschillende modellen, maar het is een beetje een straf om maar één technique tegelijk te kunnen(?) gebruiken. Laten we eens als voorbeeld zeggen dat we als techniquegeschut hebben:

Voor de duidelijkheid, de directionele lichtbron zit achter de camera, en laat nu net dit deel van skybox volgens dat Phongmodel goed reflecteren doordat de normaal overeenkomt met -lichtrichting. Slaat natuurlijk nergens op.
Ik wil dus die skybox een andere shader geven, de tweede uit de lijst, die alleen de texture als kleur op het model plakt zonder shading, maar ik heb echt geen idee hoe dat moet, en ik kan het ook nergens vinden. Even voor de duidelijkheid hoe ik de boel in elkaar heb zitten:
Globals worden geset, en model wordt getekend. Simpel. Alleen krijgt elk model zo wel dezelfde shader. En shaders veranderen mag binnen de pass niet meer(?), waardoor ik dan in principe voor elke shader een passloop moet maken, wat sterk wordt afgeraden door bijv. Frank Luna met zijn boek(je). Weet iemand hier hoe het wel netjes moet? Gebruikte bronnen:

Leuk allemaal met al die verschillende modellen, maar het is een beetje een straf om maar één technique tegelijk te kunnen(?) gebruiken. Laten we eens als voorbeeld zeggen dat we als techniquegeschut hebben:
- Per Pixel Phong Fog Texture (voor modellen)
- Per Vertex Diffuse No Fog Texture 'ZFunc = Always' (voor de skybox)

Voor de duidelijkheid, de directionele lichtbron zit achter de camera, en laat nu net dit deel van skybox volgens dat Phongmodel goed reflecteren doordat de normaal overeenkomt met -lichtrichting. Slaat natuurlijk nergens op.
Ik wil dus die skybox een andere shader geven, de tweede uit de lijst, die alleen de texture als kleur op het model plakt zonder shading, maar ik heb echt geen idee hoe dat moet, en ik kan het ook nergens vinden. Even voor de duidelijkheid hoe ik de boel in elkaar heb zitten:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
| SetSomeTechnique(); FX->Begin(0,0); FX->BeginPass(0); for(int a = 0;a < nummodels;a++) { /* WORLDSPACE EN SCREENSPACE EN TEXTURE EN COMMIT EN BUFFERS */ d3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 0, 0, models[a].numfaces); } FX->EndPass(); FX->End(); |
Globals worden geset, en model wordt getekend. Simpel. Alleen krijgt elk model zo wel dezelfde shader. En shaders veranderen mag binnen de pass niet meer(?), waardoor ik dan in principe voor elke shader een passloop moet maken, wat sterk wordt afgeraden door bijv. Frank Luna met zijn boek(je). Weet iemand hier hoe het wel netjes moet? Gebruikte bronnen:
- Introduction to 3D Game Programming with DirectX 9.0c - A Shader Approach (blijft bij een enkele pass)
- MSDN (prima in zoektocht naar vergeten functieparameters, verder niks hierover gevonden)
- Microsoft DirectX SDK (June 2010) (kunnen niet van DXUT afblijven, dus nutteloze voorbeelden)