Question

J'ai eu du mal à jours pour trouver les ressources pour me aider à écrire simple lueur / flou shaders en utilisant de haut niveau Shader Language et DirectX 9 Géré Bibliothèques.

Tout ce que je besoin de faire est d'avoir un tableau de sommets de CustomVertex.TransformedColored dessinés comme des lignes simples, puis floue / rayonnait par l'effet HLSL.

J'ai cherché sur internet pendant environ trois jours maintenant avec quelques résultats, mais je ne peux pas trouver un très bon tutoriel ou par exemple. J'ai une compréhension de base de HLSL mais je ne comprends pas assez pour comprendre comment écrire ce shader (j'ai lu le chapitre HLSL dans 3 livres DirectX ainsi).

Voici quelques (abrégé) code:

CustomVertex.TransformedColored[] glowVertices = new CustomVertex.TransformedColored[4];
glowVertices[0] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Cyan.ToArgb());
glowVertices[1] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Blue.ToArgb());
glowVertices[2] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Cyan.ToArgb());
glowVertices[3] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Blue.ToArgb());

this.device.BeginScene();
int passes = this.glowEffect.Begin(0);
for (int i = 0; i < passes; i++)
 {
     this.glowEffect.BeginPass(i);
     this.device.DrawUserPrimitives(PrimitiveType.LineStrip, glowVertices.Length - 1, glowVertices);
     this.glowEffect.EndPass();
 }
 this.glowEffect.End();
 this.device.EndScene();

Je suppose que je ne suis pas tellement chercher de l'aide sur une partie spécifique de HLSL, compte tenu du nombre de questions et de quantité de code que je dois poster que je suis vraiment à la recherche d'une aide pour trouver des ressources!

Était-ce utile?

La solution

Le problème immédiat que je vois avec votre code est que vous appliquez un shader aux lignes elles-mêmes. Pixel Shaders ne fonctionnent pas vraiment de cette façon. Vous ne pouvez pas interagir avec l'un des pixels autour du pixel ombragé. Tout ce que vous obtenez est des registres (position, la couleur, la texture de coordonnées, etc.) et échantillonneurs (textures) pour qu'un pixel qui est en cours de sortie.

Pour éviter cela, le processus de base de faire un effet de flou (comme pour lueur ou la floraison) est de dessiner la scène que vous voulez flou à une cible de rendu. Ensuite, utilisez cette cible comme render texture sur un quad plein écran que vous dessinez avec un shader flou. Un simple shader flou prend prend plusieurs échantillons de cette texture - chacun avec une coordonnée texture légèrement décalée. Le résultat est une image floue de la texture.

Habituellement, vous répétez ce processus (rendu maintenant le rendu-cible sur un plein écran quad à une autre cible de rendu), en faisant un flou horizontalement et un verticalement, pour obtenir le plus flou avec le plus petit nombre d'échantillons .

Je recommande regarder XNA Bloom Sample . Il y a une documentation plus approfondie sur le processus là-dedans. Bien que l'API est XNA, et non DirectX, ils sont assez similaires et ils ont tous deux HLSL d'utilisation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top