DirectX11: смешивание текстур на основе высоты

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

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

Что производит следующее:

Снег выше определенной высоты

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

Спасибо за уделенное время


person onemandan    schedule 17.12.2015    source источник
comment
Так же, как вы сделали с наклоном.   -  person Ivan Aksamentov - Drop    schedule 18.12.2015
comment
Как именно мне интегрировать значение высоты с линейной интерполяцией на основе наклона. Я просто хочу сгладить край снега, чтобы он исчезал по мере спуска вниз по склону.   -  person onemandan    schedule 18.12.2015
comment
Возьмите окончательный цвет после участка склона (назовем его травой), возьмите цвет снега. Рассчитайте коэффициент интерполяции как функцию высоты (например: абсолютный снег: высота 200 и выше, количество цвета снега 100%; абсолютная трава: высота ниже 150, количество цвета снега 0%). Сделайте lerp (или любую другую функцию смешивания, которая вам нравится).   -  person Ivan Aksamentov - Drop    schedule 18.12.2015


Ответы (1)


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

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

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

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

person Francis Cugler    schedule 17.12.2015