[Shader HLSL] Génération d'un reflection map
Bonjour,
Je souhaite créer un shader qui utilise une reflectionMap pour simuler des reflets. En suivant ce très bon tuto, j'arrive à :
- Positionner ma caméra de manière à regarder la scène à refléter
- Ne conserver que la partie qu'il m'intéresse de refléter (dans le tuto en l'occurence, ce qui se situe au-dessus du niveau de l'eau)
- Enregistrer dans un fichier le rendu de la scène
- Afficher enfin ma scène à l'écran
Toutefois, quelle que soit la position "reflétée" de ma caméra, impossible de rendre dans mon fichier la scène reflétée (j'obtiens systématiquement la scène "non reflétée").
Parce qu'une illustration vaut mieux qu'un long discours :
http://img842.imageshack.us/img842/8885/rendu.png
Sur l'illustration 1, c'est ma scène telle qu'elle devrait être affichée, aucun souci mais sur l'illustration 2 ("fichier enregistré"), je devrais avoir quelque chose de ce style (à la couleur de fond près, et sans tenir compte du masquage d'une partie de la scène, je l'ajouterai une fois mon problème actuel réglé) :
http://img837.imageshack.us/img837/7...ndusouhait.png
Mon code permettant le rendu dans un fichier est le suivant :
Code:
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
| public static void UpdateReflectionMap(GraphicsDevice device) {
// First, we reflect the camera to look at the reflected scene
Vector4 planeCoeffs = new Vector4(Vector3.UnitY, 5.0f);
Plane worldReflectionPlane = new Plane(planeCoeffs);
CameraManager.ReflectCamera(worldReflectionPlane);
// PLOP
// if (debug == true)
// CameraManager.ReflectCamera(worldReflectionPlane);
// Prepare the graphics device
device.SetRenderTarget(0, reflectionRenderTarget);
device.Clear(Color.Crimson);
DisplayManager.RenderScene();
// Dispose the graphics device
device.SetRenderTarget(0, null);
reflectionMap = reflectionRenderTarget.GetTexture();
if (SceneManager.HasSceneLoaded() && debug == true) {
debug = false;
Console.WriteLine("Camera position for saving : " + CameraManager.Position);
// ... qui affiche : Camera position for saving : {X:8 Y:-10 Z:12}
reflectionMap.Save("reflectionMap.png", ImageFileFormat.Png);
Console.WriteLine("Saved. Camera position is now " + CameraManager.Position);
// ... qui affiche : Saved. Camera position is now {X:8 Y:-10 Z:12}
}
CameraManager.ReflectCamera(worldReflectionPlane);
DisplayManager.ClearGraphics();
} |
Pire encore : si je décide de faire un 3ème CameraManager.ReflectCamera(worldReflectionPlane); (en décommentant le bloc "PLOP" du code ci-dessus), ma scène s'affiche renversée (logique…) mais mon fichier enregistre toujours la même chose.
Merci d'avance pour votre aide.