En fait, je me suis grandement inspiré du système de moteurs 3D comme horde3d(En xml aussi) et Ogre3D (Système de compositor en format texte).On peut scripter le rendu dans un fichier XML, pour définir l'ordre de rendu des géométries, et leurs cibles.Par exemple, le pipeline avec lequel je travail en ce moment, et qui permet le Light pre pass est celui ci :
Dans ce pipeline je déclare des buffers (Render Target) qui seront ensuite utilisés dans la boucle de rendu. Dans la boucle de rendu on définit à quels moments seront rendus les géométries et dans quel contexte. Tout les contextes sont reliés à un shader. Par exemple, si j'ai besoins d'un buffer qui enregistre les normales de chacune des géométries, je peux associer un shader qui affiche les normales d'une géométrie pour chacun des pixels au contexte, et ensuite exploiter ce buffer pour de la lumière en screen space pour le deffered lighting, ou dans ce cas ci, le Light pre-pass. Puisque le pipeline est compilé, on peut aussi définir des macro pour la compilation, très utile ou gérer les effets, par exemple, pour désactiver les effets avancés sur les ordinateurs plus faibles.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 <Pipeline> <IfDef Name="PreLight"> <CreateRenderTarget Name="GBUFFER_RT" Type="HalfVector4" Size="1.0" NbBuf="1" /> <CreateRenderTarget Name="LIGHTING_RT" Type="Color" Size="1.0" NbBuf="1" /> <IfDef /> <CreateRenderTargetScreen Name="SCREEN_RT" /> <RenderingLoop> <IfDef Name="PreLight"> <!-- RENDER GBUFFER --> <SetTarget Target="GBUFFER_RT" /> <ClearRenderTarget /> <RenderGeometry Context="1" /> <!-- CREATE LIGHT BUFFER --> <SetTarget Target="LIGHTING_RT" /> <ClearRenderTarget /> <RenderPrePassLighting LightShader="PreLight\Light.fx" NormalRT="GBUFFER_RT" /> <IfDef /> <SetTarget Target="SCREEN_RT" /> <ClearRenderTarget /> <!-- RENDER DIFFUSE AND FORWARD-LIGHTING --> <IfDef Name="PreLight"> <RenderGeometry Context="0" > <BindBuffer RenderTarget="LIGHTING_RT" BufIdx="0" /> </RenderGeometry> <IfDef /> <!-- RENDER FOWARD LIGHTING --> <RenderGeometry Context="2" /> <RenderForwardLighting /> </RenderingLoop> </Pipeline>
Éventuellement, j'ai le plan de faire la même chose pour les matériaux. En fait, les matériaux de chacune des géométries sont déjà définis à l'aide de XML, et ils sont liés à des shaders. Puisque la programmation de shaders n'est pas évident pour tout le monde, et aussi pour accentuer le développement, je compte créer un système XML pour définir des effets qui généreront des shaders automatiquement d'une façon transparente. Mais ça, ce n'est pas pour le moment...
Partager