Я просто попытался реализовать зеркальные блики. Проблема в том, что при движении вдали от поверхности подсветка становится все сильнее и сильнее, а край подсветки становится очень суровым. При движении слишком близко к поверхности, подсветка полностью исчезает.Зеркальные блики зависят от расстояния до камеры
Это связанная часть моего фрагментарного шейдера. Все вычисления находятся в поле зрения. Я использую направленный солнечный свет.
// samplers
vec3 normal = texture2D(normals, coord).xyz;
vec3 position = texture2D(positions, coord).xyz;
float shininess = texture2D(speculars, coord).x;
// normalize directional light source
vec3 source;
if(directional) source = position + normalize(light);
else source = light;
// reflection
float specular = 0;
vec3 lookat = vec3(0, 0, 1);
float reflection = max(0, dot(reflect(position, normal), lookat));
int power = 5;
specular = shininess * pow(reflection, power);
// ...
// output
image = color * attenuation * intensity * (fraction + specular);
Это скриншот моего буфера освещения. Вы можете видеть, что передняя бочка не имеет зеркальной подсветки, в то время как те, кто далеко, сияют слишком сильно. Бочка посередине подсвечивается по желанию.
Что я делаю неправильно?
Показать код на стороне клиента, особенно светлые векторы. Убедитесь, что вы не путаете позиции с указаниями. –
Для источников направленного света я рассматриваю положение как направление. Например, солнце имеет положение «0,5, 1,0, 1,5». Это создает проблемы? Тем не менее проблема одинакова для огней направления и точечных огней. – danijar
Недостаточно кода. Покажите, как вы создаете матрицы вида модели. Например, если ваш взгляд на вектор равен x, y, z, 1, это может быть проблема –