nxEngine 0.4 Présentation  
   
nxEngine 0.4 - Présentation - Gestion du rendu via le "scène graph"
 

Le mode de fonctionnement du nxEngine a changé dans cette version afin de permettre une grande souplesse au niveau des la gestion du rendu et de la relation entre les nœuds composants la scène.
Une scène va accepter 2 grands types de nœuds :

Nous allons nous concentrer sur les relations entre les nœuds de contexte (IContextNode), car c’est le plus important ici.
Nous allons donc prendre pour exemples plusieurs cas afin de bien comprendre les relations entre ces nœuds et leur impact sur le rendu. Dans un premier temps un petit rappel sur le mode de fonctionnement de l’ancienne version

 

 
1er cas : Affichage d’un champ d’astéroïdes à matériau identiques
 

Pour ce cas, le mode d’affichage le plus optimisé est celui qui était présent dans la version 0.3.

  • Dans un premier temps, on doit mettre à jour les paramètres du shader associé, puis lancer son rendu.
  • Dans un second temps, on défini la géométrie à afficher.
  • Dans un troisième temps on passe la transformation en espace monde d’un astéroïde.
  • Enfin on lance le rendu de la géométrie.
 
2nd cas : Affichage d’un champ d’astéroïdes aux paramètres de matériau différents
 

Maintenant imaginons que nous voulons pouvoir changer les paramètres du matériau de certains astéroïdes (couleurs, textures…). Les paramètres du matériau deviennent alors dépendants du nœud de transformation. Dans le nxEngine 0.3 il fallait utiliser un autre type de modèle gérant le mode de rendu suivant :

  • Dans un premier temps, on défini la géométrie à afficher.
  • Dans un second temps, on passe la transformation en espace monde d’un astéroïde.
  • Dans un troisième temps, on doit mettre à jour les paramètres du shader associé, puis lancer son rendu.
  • Enfin on lance le rendu de la géométrie.
 
3ème cas : Affichage d’un champ d’astéroïdes aux matériaux différents
 

Dans ce cas nous utilisions le même type de modèles que dans le cas 2.

La nouvelle version n’a plus de concept préétabli au niveau du système de rendu. C’est donc à vous d’indiquer au moteur dans quel ordre vous voulez que les différents éléments de rendu doivent être mis en relation.
Cette ordre se défini dans la scène.

 
1er cas : Affichage d’un champ d’astéroïdes à matériau identiques dans la v0.4
 

Idéalement :

  • Mettre à jour les paramètres du shader, puis le lancer.
  • Définir la géométrie à afficher.
  • Passage des informations de transformations en espace monde.
  • Lancement du rendu de la géométrie.

Quelques conclusions :

Le shader est le « maître » du processus (point d’entrée). La géométrie vient ensuite. La transformation est la finalité du processus (juste avant le rendu en lui-même).

Organiser ce système de rendu dans le nxEngine 0.4 :

On considère que le shader s’appelle « MyShader », la géométrie « MyGeometry » et la transformation « MyWorldNode ».

  • « MyShader » est un objet de type « Material ».
  • « MyGeometry » est un objet de type « GeometryBuffer ».
  • « MyWorldNode » est un objet de type « WorldNode ».

Notez que ces 3 objets sont interfacés en tant de nœuds de contexte : « IContextNode ».
Afin de reproduire le schéma de rendu vu plus haut on défini les relations suivantes.

  • MyWorldNode est attaché à MyGeometry
  • MyGeometry est attaché à MyShader
Il me reste plus qu’a ajouter le nœud de contexte « MyShader » au root de la scène et le rendu sera effectué dans l’ordre souhaité.
 
2nd cas : Affichage d’un champ d’astéroïdes aux paramètres de matériau différents dans la v0.4
 

Idéalement :

  • Lancer le shader.
  • Définir la géométrie à afficher.
  • Passage des informations de transformations en espace monde.
  • Mettre à jour les paramètres du shader.
  • Lancement du rendu de la géométrie.

Comme vous pouvez le constater l’idéal n’était pas ce que faisait la version 0.3 dans ce cas.

Quelques conclusions :

Le shader est toujours le « maître » du processus (comme dans le cas 1). La géométrie vient ensuite, puis la transformation qui n’est plus la finalité du processus puisque les paramètres du shaders doivent être mis à jour en fonction du nœud de transformation. Il faut donc ajouter une dernière étape. Nous allons appeler cet objet « MyMaterial » qui est de type « MaterialParameters ».

Organiser ce système de rendu dans le nxEngine 0.4 :

  • « MyShader » est un objet de type « Material ». On passe dans le constructeur l’option afin de définir que ce matériau voit ses paramètres « déportés ».
  • « MyGeometry » est un objet de type « GeometryBuffer ».
  • « MyWorldNode » est un objet de type « WorldNode ».
  • « MyMaterial » est un objet de type « MaterialParameters ». (paramètres de matériau déportés)

Afin de reproduire le schéma de rendu vu plus haut on défini les relations suivantes.

  • MyMaterial est attaché à MyWorldNode
  • MyWorldNode est attaché à MyGeometry
  • MyGeometry est attaché à MyShader

Il me reste plus qu’a ajouter le nœud de contexte « MyShader » au root de la scène et le rendu sera effectué dans l’ordre souhaité.

 
3ème cas : Affichage d’un champ d’astéroïdes aux matériaux différents
 

Idéalement :

  1. Définir la géométrie à afficher.
  2. Passage des informations de transformations en espace monde.
  3. Lancer le shader.
  4. Mettre à jour les paramètres du shader.
  5. Lancement du rendu de la géométrie.

Quelques conclusions :

La géométrie devient le « maître » du processus. La transformation vient ensuite, le shader cette fois étant la finalité du processus.

Organiser ce système de rendu dans le nxEngine 0.4 :

  1. MyShader est attaché à MyWorldNode
  2. MyWorldNode est attaché à MyGeometry

Il me reste plus qu’a ajouter le nœud de contexte « MyGeometry » au root de la scène et le rendu sera effectué dans l’ordre souhaité.

Voilà pour les exemples.
 
Récapitulatif
 

Comme vous pouvez le voir vous pouvez organiser très facilement le rendu de A à Z

 

 
Schéma du 2nd cas
 

Pour allez un peux plus loin imaginons que nous devions changer le matériau d’un objet lors d’une sélection de celui-ci via un picking. Le nœud « MyMaterial » modifie donc les paramètres de notre matériau si l’objet est sélectionné. Si ce n’est pas le cas vous pouvez simplement fixer le statut de ce nœud de contexte à « Disable ». Ce qui donne :

 
 
 
 
©2007 Cédric Montagne - Hébergement : developpez.com - Forum développement : .NET -- 2D/3D/Jeux