2015-12-17 1 views
0

J'ai actuellement 3 textures mélangées en utilisant une quantité de pente, dans mon projet de terrain. Je le fais en échantillonnant chaque texture, en déterminant la quantité de pente et en définissant la couleur de texture en fonction d'un lerp entre deux textures. Ceci est l'extrait de ce de mon pixel shader:DirectX11: Mélange de texture basé sur la hauteur

static const float TEX_LOW_BOUND = 0.4f; 
static const float TEX_HIGH_BOUND = 0.7f; 

...  

float4 texColour; 
float4 lowColour = lowerTex.Sample(SWrap, pin.Tex); 
float4 midColour = middleTex.Sample(SWrap, pin.Tex); 
float4 hiColour = upperTex.Sample(SWrap, pin.Tex); 
float slope  = 1.0f - pin.Normal.y; 

if (slope < TEX_LOW_BOUND) 
{ 
    texColour = lerp(lowColour, midColour, slope/TEX_LOW_BOUND); 
} 
else if (slope >= TEX_LOW_BOUND && slope < TEX_HIGH_BOUND) 
{ 
    texColour = lerp(midColour, hiColour, (slope - TEX_LOW_BOUND) * (1.0f/(TEX_HIGH_BOUND - TEX_LOW_BOUND))); 
} 
else if (slope >= TEX_HIGH_BOUND) 
{ 
    texColour = hiColour; 
} 

Je veux ajouter une texture de la neige finale, à appliquer une certaine hauteur. Je reçois la valeur de hauteur dans mon vertex shader en utilisant:

vout.WHeight = mul(vin.Pos, worldMatrix).y; 

Je peux ensuite définir simplement la couleur de la texture à la neige au-dessus d'une certaine hauteur à l'aide dans mon pixel shader:

if (pin.WHeight > 35.0f) 
{ 
    texColour = snowTex.Sample(SWrap, pin.Tex); 
} 

qui produit les éléments suivants:

Snow above a certain height

Comment puis-je mélanger le bord de la neige avec les autres textures afin que le bord n'est pas si dur. En gardant à l'esprit les autres textures peuvent avoir déjà été lerped, et je voudrais maintenir la couleur de la texture.

Merci pour votre temps

+0

De la même manière que vous l'avez fait avec la pente. – Drop

+0

Comment exactement j'intègre la valeur de hauteur avec l'interpolation linéaire basée sur la pente. Je veux juste mélanger le bord de la neige, donc il s'estompe le long de la colline. – Daniel

+0

Prendre la couleur finale après la partie de la pente (appelons-le "herbe"), prendre la couleur de la neige. Calculez votre coefficient d'interpolation en fonction de la hauteur (ex: neige absolue: hauteur 200 et plus, quantité de neige 100%, herbe absolue: hauteur inférieure à 150, quantité de neige 0%). Faites lerp (ou n'importe quelle fonction de mélange que vous aimez). – Drop

Répondre

1

Vous pouvez faire essentiellement la même chose que vous venez de faire lors de l'ajout de la couleur pour les chapeaux de neige, mais ce que vous auriez besoin ici est une entrée à distance pour déterminer si elle est proche de le bord. Il y a plusieurs approches pour le faire. Une méthode pourrait être de mélanger les valeurs de pixels avec l'addition ou la soustraction de couleurs, puis de normaliser entre la plage de la valeur de couleur. L'autre serait d'appliquer plusieurs mélanges de texture. Comme vous l'avez indiqué dans votre condition ci-dessus if (pin.WHeight > 35.0f) nous savons que 35.0f est la valeur de hauteur maximale avant de commencer à appliquer la texture de la neige. En fonction de vos résultats souhaités, votre entrée à distance peut être quelque chose comme: if (height > 34.8f && height < 35.2f) { apply texture blending or color blending; }.

L'autre méthode consisterait à utiliser une valeur alpha avec une couche d'évanouissement de transparence sur le dessus de la couche d'origine en utilisant la même entrée à distance pour produire la sortie désirée. La seule chose avec ce type d'approche ou d'algorithme est qu'il peut ne pas sembler aussi réaliste que vous le souhaitez. C'est parce que toutes les calottes de neige auront exactement la même valeur de hauteur créant un périmètre irréaliste.

Une suggestion qui serait proche de votre approche originale pourrait mieux fonctionner. Lorsque vous appliquez la texture ou la couleur à vos calottes de neige, vous pourriez avoir un algorithme non déterministe qui sélectionnerait aléatoirement des hauteurs spécifiques dans une gamme min pour appliquer le mélange texture - texture, puis tout ce qui dépasserait cette hauteur serait blanc pur . De cette façon, chaque sommet de montagne aurait un chapeau blanc, mais toutes les hauteurs ne seraient pas les mêmes dans les limites inférieures.