Я реализую базовую карту высот с простым затенением (окружающее + рассеянное). Затенение реализовано на фрагментном шейдере, который показан ниже.
#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. Эта переменная передается непосредственно из вершинного шейдера.
Вот скриншот того, что у меня сейчас есть:
Это ожидаемый результат от карты высот с затенением пикселей? Меня немного раздражает тот факт, что поверхность не очень гладкая.
Но если это ожидается, есть ли какая-либо техника, которая улучшит то, что у меня есть сейчас?
Для вычисления нормалей я использовал следующий алгоритм: разностный метод (переполнение стека)