Затенение пикселей не такое гладкое

Я реализую базовую карту высот с простым затенением (окружающее + рассеянное). Затенение реализовано на фрагментном шейдере, который показан ниже.

#version 330

in  vec3 fragNormal;
out vec4 outColor;

uniform vec3 lightDirection;
uniform vec3 lightColor;
uniform vec3 objectColor;

void main()
{
    float ambientStrength = 0.1f;
    vec3 ambientColor = ambientStrength * lightColor;

    vec3 norm = normalize(fragNormal);
    float diff = max(dot(norm, -normalize(lightDirection)), 0.0f);
    vec3 diffuseColor = diff * lightColor;

    outColor = vec4((ambientColor + diffuseColor) * objectColor, 1);
}

Что я делаю, так это вычисляю простой диффузный компонент на основе нормали fragNormal. Эта переменная передается непосредственно из вершинного шейдера.

Вот скриншот того, что у меня сейчас есть:

введите здесь описание изображения

Это ожидаемый результат от карты высот с затенением пикселей? Меня немного раздражает тот факт, что поверхность не очень гладкая.

Но если это ожидается, есть ли какая-либо техника, которая улучшит то, что у меня есть сейчас?

Для вычисления нормалей я использовал следующий алгоритм: разностный метод (переполнение стека)


person lhahn    schedule 19.07.2015    source источник


Ответы (1)


Использование пиксельного шейдера не дает вам плавного затенения бесплатно. В общем, наличие только нормали для треугольника дает вам плоское затенение, которое вы видите на скриншоте. Что вам нужно, так это какой-то метод вычисления средневзвешенного значения нормалей для каждой вершины - метод взвешивания действительно зависит от вас (вот список возможных вариантов).

И здесь - сообщение SO, в котором содержится псевдокод для нахождения взвешенных нормалей вершин.

Опубликованный вами метод кажется быстрым способом аппроксимации нормалей для точки на карте высот. Эта страница, по-видимому, указывает на выполнение чего-то подобного (вычисление суммы нормалей вокруг точки) для достижения аналогичного эффекта сглаживания при использовании конечной разницы.

person xlem    schedule 19.07.2015
comment
Странно, что последняя ссылка, которую вы разместили, похоже, является тем же алгоритмом, который я реализую. - person lhahn; 19.07.2015