2015-12-17 3 views
0

В настоящее время у меня есть 3 текстуры, которые смешиваются с использованием величины уклона в моем проекте ландшафта. Я делаю это путем выборки каждой текстуры, определения величины уклона и установки цвета текстуры на основе lerp между двумя текстурами. Это фрагмент кода это от моего пиксельного шейдера:DirectX11: Смешивание текстуры на основе высоты

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; 
} 

Я хочу добавить последний снег текстуру, чтобы применить выше определенной высоты. Я получаю значение высоты в моей вершинных шейдеров с помощью:

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

Затем я могу просто установить цвет текстуры на снегу выше определенной высоты, используя это в моем пиксельного шейдера:

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

Который производит следующее:

Snow above a certain height

Как я могу смешать край снега с другими текстурами, так что край не столь суровы. Принимая во внимание, что другие текстуры, возможно, уже были зажаты, и я хотел бы сохранить цвет текстуры.

Спасибо за ваше время

+0

Так же, как и с наклоном. – Drop

+0

Как именно я интегрирую значение высоты с линейной интерполяцией на основе наклона. Я просто хочу смешать край снега, так что он исчезает дальше по холму. – Daniel

+0

Примите окончательный цвет после части склона (назовем это «травой»), возьмите снежный покров. Вычислите коэффициент интерполяции как функцию высоты (например: абсолютный снег: высота 200 и выше, количество снежного покрова 100%, абсолютная трава: высота ниже 150, количество снежного покрова 0%). Сделайте lerp (или любую функцию смешивания, которая вам нравится). – Drop

ответ

1

Вы можете сделать в принципе то же самое, вы просто делали при добавлении в цвете для снежных шапок, но то, что вам нужно будет здесь дальняя вход, чтобы определить, если он близок к край. Существует несколько подходов к этому. Одним из методов может быть смешение значений пикселей с добавлением или вычитанием цвета, а затем нормализация между диапазоном значений цвета. Другим было бы применение множественного смешивания текстур. Как вы заявили в своем состоянии выше if (pin.WHeight > 35.0f) , мы знаем, что 35.0f - это максимальное значение высоты, прежде чем вы начнете применять текстуру снега. В зависимости от ваших желаемых результатов вход на основе диапазона может быть примерно таким: if (height > 34.8f && height < 35.2f) { apply texture blending or color blending; }.

Другим методом будет использование альфа-значения с уровнем затухания прозрачности поверх исходного слоя с использованием того же входного диапазона, чтобы получить желаемый результат.

Единственное, с этим типом подхода или алгоритма состоит в том, что оно может показаться не таким реалистичным, как хотелось бы. Это связано с тем, что все снежные шапки будут иметь точно такое же значение высоты, создавая нереалистичный периметр.

Предложение, которое будет близко к вашему первоначальному подходу, может работать лучше. При нанесении текстуры или цвета на ваши снежные шапки вы можете иметь недетерминированный алгоритм, который случайным образом выбирал бы определенные высоты в пределах минимального диапазона для применения смешивания текстуры - текстуры, тогда любое более чем на определенную высоту выше, которое затем сглаживалось бы до чисто белого , Таким образом, у каждой вершины горы была бы белая кепка, но не все высоты были бы одинаковыми на нижних границах.