*255f
уже был подозрительным (типичное использование OpenGL работает с цветными компонентами в диапазоне [0 ... 1]), и вы добавили комментарий
выводом являются значения с плавающей запятой для цвета, выводимого прямо на экран.
Это простая проблема переполнения. Ваш вес представляет собой сумму 0,1+ [0 ... 1] + [0 ... 1] (окружающий, рассеянный и зеркальный), которая попадает в [0,1 ... 2,1], и когда вы умножаете его на цвет Компонент больше 0,5 (приблизительно, 1 / 2,1 является точным пределом), их произведение превышает 1. Затем это число умножается на 255, и результат будет выше 255, а при сокращении до байта он «начинается заново» с черный, по компонентам.
Исходя из кода, который вы показываете, вы, вероятно, можете попробовать что-то вроде
return glm::min(outColor * objectColor * 255.0f, glm::vec3(255f, 255f, 255f));
но для этого может быть лучшая функция.