Нет, вы никогда не должны иметь явную матрицу мира в своем шейдере.
Подробное объяснение причин можно найти здесь , но короткая версия действительно очень проста: она вам никогда не понадобится, и она может убить вашу точность с плавающей точкой.
Если ваше мировое пространство слишком велико, то камера, которая находится далеко от источника, может вызвать проблемы с точностью с плавающей точкой.
Все мировое пространство - не более чем посредник между модельным пространством и пространством камеры. Это место, где вы можете выразить камеру и все другие объекты в одном месте. Но все, что вы используете для этого, это генерировать матрицу мир-камера, которую вы затем применяете ко всем матрицам модель-мир для создания матриц модель-камера.
Вы можете иметь дело с проблемами точности в C ++, используя удвоения вместо вычислений с плавающей запятой. Вы можете преобразовать их обратно в float перед загрузкой в шейдер.
Так зачем вам когда-либо понадобиться явное преобразование пространства мира в вашем шейдере? В вашем исходном коде да. Но в вашем шейдере? Что бы вы сделали с этим, что вы не можете сделать с пространством камеры?
Освещение может быть сделано в пространстве камеры так же легко, как в мировом пространстве; все, что вам нужно сделать, это преобразовать ваши световые позиции / направления в пространство камеры. В конце концов, пространство камеры имеет тот же масштаб, что и мировое пространство. Вы делаете это преобразование один раз за кадр за свет; вряд ли нагрузка на производительность даже на процессоре.
Так что нет абсолютно никакого смысла подвергать ваши шейдеры явному преобразованию пространства мира. Это просто промежуточный шаг, который вы складываете в свои матрицы.