Я работаю над лучей с использованием C++ и OpenGL (glDrawPixels), и пока все идет хорошо. Тем не менее, моя затенение, похоже, немного выключена. Я хочу, чтобы мои сферы выглядели немного более гладкими, не имея вопиющих линий между интенсивностями. На данный момент я просто пытаюсь реализовать ламбертовское затенение, которое является Intensity = Id * pd * (N точка L). Я знаю, как мне нужно вычислить (N точка L), нормализуя вектор вектора вектора и света, но как насчет Id и pd (интенсивность диффузии и коэффициент пропорциональности)? Я только с помощью постоянного значения 2,5 для достижения следующих:Как реализовать ламбертовское затенение
(Here is a picture of what my shading looks like)
Очевидно, что 2,5 совершенно произвольно, и я только использовать его, потому что другие мои попытки даже не похожи на надлежащее затенение. Вышеприведенное уравнение, по-видимому, предполагает, что я должен умножить цвет на интенсивность. Это мой метод:
Color simpleIlluminate(Vector3D normal, Vector3D light, Color color) {
float intensity = dotProduct(normal, light)*2.5f;
color = Color((unsigned int)intensity*color.r, (unsigned int)intensity*color.g, (unsigned int)intensity*color.b);
return color;
}
Предположим, что нормальный вектор и вектор света верны. Цвет - это только цветная структура, которую я создал, которая имеет unsigned int для каждого из значений RGB. Параметр Color color - цвет сферы, которую я хочу затенять, например. красный = цвет (255,0,0). Чтобы изменить интенсивность цвета, я просто умножаю каждое значение на рассчитанную интенсивность, но при запуске я не выгляжу правильно.
Может кто-нибудь объяснить, что мне не хватает, и показать мне, как должна выглядеть правильная функция, учитывая данные о векторах и сфере сферы? Я везде искал, но я не могу найти хорошее решение. Возможно, я также ошибаюсь в том, что мой float для неподписанного преобразования int ошибочен, но я не уверен. Любая помощь приветствуется.
Возможно, вам придется исправить гамму. Масштабируйте значения RGB с силой 2,2. Вычисленная интенсивность является линейной, но значения RGB настраиваются так называемым «гамма». Проверьте sRGB в wiki. Кроме того, убедитесь, что самые яркие значения RGB поверхности меньше 255, или они будут зажиматься. – doug