Ik ben al een aantal maanden bezig aan mijn game engine, en hij begint nu vorm te krijgen. Dat wil zeggen: ik ben verschillende componenten nu met elkaar aan het verbinden.
Een aantal dingen zijn zo goed als af of iig bruikbaar. Denk aan: shaders, materials, basic geometry, lighting, etc.
Materials zijn bomen die dmv een gui in elkaar gezet worden, gecombineerd met textures. Deze worden op runtime gecompiled naar hlsl, en vervolgens naar een xna.effect. Materials worden gekoppeld aan geometry. Dit is een ´unified´ systeem: alle materialen kunnen aan alle geometry gekoppeld worden. Ook genereerd de compiler automatisch de benodigdheden voor lichten.
Lighting ben ik een aantal dagen mee bezig. Tot dusver: multipass lighting. Ambient, Directional en Point lights. Verder heb ik tot dusver alleen een sphere en een plane geometry gemaakt. (meer heb ik op dit moment niet echt nodig!). Punt van verbetering: Meerdere lichten per pass. Maar dit staat niet hoog op de prioriteiten lijst op dit moment.
De scenegraph begint ook vorm te krijgen: Het enige wat hij doet is transformaties bijhouden. Ik heb er bewust voor gekozen de graph erg beperkt te houden in wat hij doet. Er zijn op dit moment pas een paar nodes: transform, geometry en light (Light is WIP). Alpha transparancy wordt bijgehouden in de material en NIET in de scenegraph.
Waar ik nu echter mee bezig ben is het koppelen van de scenegraph aan de renderer. Op het moment is er een Draw() functie in de scenegraph, die vervolgens alle geometry sorteert en een voor een de renderer instuurt. Op dit moment rendert hij alle lichten in de LightManager, ipv wat hij zou moeten: alle lichten in de scenegraph.
Echter, nu vraag ik me af wat slimmer is:
1. De world manager retrieved op de world.Draw() alle geometry en lichten van de scenegraph en stopt ze in de renderer. Deze sorteert vervolgens op alpa/opaque en doet wat magie in de 'culling tree' om vervolgens te vinden welke lichten per geometry gerenderd moeten worden.
2. Als de worldmanager SceneGraph.Draw() aanroept kijkt de scenegraph welke objecten getekend moeten worden en sorteert deze (zie boven). Vervolgens kijkt men in de culling tree en bepaalt welke lichten met welk object getekend moeten worden. De scenegraph set de material/geometry EN de benodigde lichten op de device, stuurt de transformation matrix mee (translation, rotation) en tekent de geometry.
Het dilemma is dus eigenlijk:
Is de scenegraph verantwoordelijk voor het aanroepen van de renderer, of is dit het werk van een world manager die alle geometry binnenhaalt (of in een flat list bewaard) en ze vervolgens laat tekenen door de renderer.
Zelf neig ik naar het eerste, omdat dit alles een stuk makkelijker maakt. De scenegraph zorgt voor het scenemanagment: visibility, sorteren, en naar de renderer sturern, terwijl de renderer alleen maar tekent wat hij binnenkrijgt.
De vragen:
Is het slim om de renderer en SceneGraph te scheiden? (lijkt me een ja)
Wat is de elegantste manier om de renderer te benaderen? Vanuit een world manager, of vanuit een scenegraph?
Waar zou een culling tree moeten komen? Is deze onderdeel van de scenegraph of van de world manager?
Wat is de slimste manier om lichten te cullen/vinden? Ik dacht aan boundingsphere, in de culling-tree, en vervolgens testen tegen geometry.
Een hoop vragen, ik hoop dat het enigsinds duidelijk is!
Een aantal dingen zijn zo goed als af of iig bruikbaar. Denk aan: shaders, materials, basic geometry, lighting, etc.
Materials zijn bomen die dmv een gui in elkaar gezet worden, gecombineerd met textures. Deze worden op runtime gecompiled naar hlsl, en vervolgens naar een xna.effect. Materials worden gekoppeld aan geometry. Dit is een ´unified´ systeem: alle materialen kunnen aan alle geometry gekoppeld worden. Ook genereerd de compiler automatisch de benodigdheden voor lichten.
Lighting ben ik een aantal dagen mee bezig. Tot dusver: multipass lighting. Ambient, Directional en Point lights. Verder heb ik tot dusver alleen een sphere en een plane geometry gemaakt. (meer heb ik op dit moment niet echt nodig!). Punt van verbetering: Meerdere lichten per pass. Maar dit staat niet hoog op de prioriteiten lijst op dit moment.
De scenegraph begint ook vorm te krijgen: Het enige wat hij doet is transformaties bijhouden. Ik heb er bewust voor gekozen de graph erg beperkt te houden in wat hij doet. Er zijn op dit moment pas een paar nodes: transform, geometry en light (Light is WIP). Alpha transparancy wordt bijgehouden in de material en NIET in de scenegraph.
Waar ik nu echter mee bezig ben is het koppelen van de scenegraph aan de renderer. Op het moment is er een Draw() functie in de scenegraph, die vervolgens alle geometry sorteert en een voor een de renderer instuurt. Op dit moment rendert hij alle lichten in de LightManager, ipv wat hij zou moeten: alle lichten in de scenegraph.
Echter, nu vraag ik me af wat slimmer is:
1. De world manager retrieved op de world.Draw() alle geometry en lichten van de scenegraph en stopt ze in de renderer. Deze sorteert vervolgens op alpa/opaque en doet wat magie in de 'culling tree' om vervolgens te vinden welke lichten per geometry gerenderd moeten worden.
2. Als de worldmanager SceneGraph.Draw() aanroept kijkt de scenegraph welke objecten getekend moeten worden en sorteert deze (zie boven). Vervolgens kijkt men in de culling tree en bepaalt welke lichten met welk object getekend moeten worden. De scenegraph set de material/geometry EN de benodigde lichten op de device, stuurt de transformation matrix mee (translation, rotation) en tekent de geometry.
Het dilemma is dus eigenlijk:
Is de scenegraph verantwoordelijk voor het aanroepen van de renderer, of is dit het werk van een world manager die alle geometry binnenhaalt (of in een flat list bewaard) en ze vervolgens laat tekenen door de renderer.
Zelf neig ik naar het eerste, omdat dit alles een stuk makkelijker maakt. De scenegraph zorgt voor het scenemanagment: visibility, sorteren, en naar de renderer sturern, terwijl de renderer alleen maar tekent wat hij binnenkrijgt.
De vragen:
Is het slim om de renderer en SceneGraph te scheiden? (lijkt me een ja)
Wat is de elegantste manier om de renderer te benaderen? Vanuit een world manager, of vanuit een scenegraph?
Waar zou een culling tree moeten komen? Is deze onderdeel van de scenegraph of van de world manager?
Wat is de slimste manier om lichten te cullen/vinden? Ik dacht aan boundingsphere, in de culling-tree, en vervolgens testen tegen geometry.
Een hoop vragen, ik hoop dat het enigsinds duidelijk is!