Эксперементы с террайном

Правила форума
Раздел посвящен трехмерному графическому движку Irrlicht.
Перед созданием темы с вопросами, просьба ознакомиться с FAQ и уроками, представленными на сайте.

Сайт | Скачать | API 1.7.2 | API 1.8.0 | Уроки
Ответить
SEvg
Алхимик
Сообщения: 1930
Зарегистрирован: 04 фев 2012, 17:57
Откуда: Россия

Эксперементы с террайном

Сообщение SEvg » 16 июл 2017, 00:07

Решил возобновить свои опыты с шейдерами, давно не брался заних... Под рукой Иррлихт готовый к работе, буду пробовать - пока не упрусь в ограничения накладываемые движком ;)
Для начала попробовал Tri-Planar прикрутить к террайну, на основе карты высот. Карта высот и текстурка из 12 туториала. Генерация терайна - тоже Иррлихтом сделана (но не как в 12 уроке, без лодов чтобы было). В общем на первом скрине просто наложеная текстура, на втором уже с шейдером.
1.png
Обчное наложение текстуры
1.png (156.87 КБ) 143 просмотра
2.png
Tri-Planar
2.png (212.93 КБ) 143 просмотра
На мой взгляд картинка стала привлекательней, но кое что испортилось - тени, что были заложены в текстуру, плюс полоски возникли, кое-где..
Интересно то, что в этой технике не нужны текстурные координаты, вместо них позиция и нормали используются. Когда то мне не хватило стандартных верших Ирлихта дляэксперементов, но я тогда незнал, что можно паковать даные более плотно,а в шейдере разворачивать ;)
...

SEvg
Алхимик
Сообщения: 1930
Зарегистрирован: 04 фев 2012, 17:57
Откуда: Россия

Re: Эксперементы с террайном

Сообщение SEvg » 18 июл 2017, 08:31

Забыл шейдеры выложить ))

Код: Выделить всё

// Вершинный шейдер
#version 400

// Это всё пойдёт во фрагментный шейдер

out vec3 normal; // нормаль вершины
out vec3 vPos; // позиция вешины, в координатах терайна

void main(void)
{
    //
    vPos = gl_Vertex.xyz;

    // Стандартные действия, если не Compatibility Contexts (случай Иррлихта)
    normal = normalize( gl_NormalMatrix * gl_Normal );
    gl_Position = ftransform();
}

Код: Выделить всё

// Фрагметный шейдер
#version 400
uniform sampler2D TextureMap;

// Маштабирование текстуры
uniform float Scale = 0.002;

in vec3 normal;
in vec3 vPos;

// Смешивание TriPlanar
vec3 blendTriPlanar(vec3 norm)
{
    // Выкидываем знак
    vec3 blending = abs(norm);
    // Нормализуем, и если значение слишком маленькое, то подменяем его на 0.0001
    blending = normalize(max(blending, 0.0001));
    // Вся магия тут ))
    return blending / vec3(blending.x + blending.y + blending.z);
}

void main(void)
{
    vec3 blending = blendTriPlanar(normal);
    // Получаем тексели из кажой плоскости
    vec3 axisX = texture( TextureMap, vPos.yz * Scale).rgb;
    vec3 axisY = texture( TextureMap, vPos.zx * Scale).rgb;
    vec3 axisZ = texture( TextureMap, vPos.xy * Scale).rgb;

    // Смешиваем всё, для получения итогового цвета
    gl_FragColor = vec4(vec3 (axisX * blending.x + axisY * blending.y + axisZ * blending.z), 1.0);
}
Scale - зависит от количества квадратов, на сетке 1.f/количество, мне было лень их в шейдер передавать и я поставил нужное мне значение по умолчанию ( у меня сетка была 500х500 ).
...

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя