Вы исчерпали 32-битную точность с плавающей точкой в вашей мантиссе. Шейдер не сможет лучше справиться с этим недостатком точности, потому что если вы не используете GL 4.x с поддержкой двойной точности, шейдеры могут обрабатывать только 32-разрядные операции с плавающей точкой.
Если вы запускаете приложение так долго, что точность с плавающей точкой переполняется в миллисекундах (что потребует ~ 10 7 миллисекунд или около 2,7 часов или около того), то вам нужно найти способ, чтобы изящно справиться с этой ситуацией. Как именно вы это сделаете, зависит от того, для чего ваш шейдер использует это значение времени.
Большинству шейдеров не требуется фактическое время в миллисекундах. Подавляющее большинство шейдерных процессов, которым требуется время (или что-то вроде времени), являются циклическими. В этом случае вы можете просто передать им значение, говорящее о том, как далеко они проходят через определенный цикл. Это значение в диапазоне [0, 1) равно 0 в начале цикла, 0,5 в середине и достигает 1 в конце.
Если ваш шейдерный процесс не может быть параметризован, если ему действительно нужно абсолютное время, тогда ваша следующая ставка должна передать два параметра с плавающей запятой. По сути, вам нужно сохранить биты переполнения. Это усложнит всю вашу математику, включая время на графическом процессоре, так как вам нужно использовать два значения и знать, как собрать их вместе для обновления времени. Опять же, как вы это сделаете, зависит от того, что вы делаете в своем шейдере.
Кроме того, вы можете отправить свое время в 32-разрядных целых числах без знака, если ваше оборудование поддерживает GL 3.x +. Это даст вам еще несколько битов точности, так что это удержит проблему дольше. Если вы отправите свое время в десятых долях миллисекунды, то вы сможете получить около 5 дней или около того времени, прежде чем оно переполнится. Опять же, это усложнит всю вашу математику с графическим процессором, поскольку вы не можете просто выполнить преобразование типа int-to-float.