Линейное освещение - это процесс освещения сцены при полностью линейных входящих данных. Обычно текстуры существуют с заранее применённой к ним гаммой, потому текстуры не линейны, если по ним осуществляется выборка в материале. Если такие текстуры используются в формулах расчёта стандартного освещения, это приведёт к неправильному результату формул, т.к. они ожидают, что все входящие данные будут линеаризованы перед использованием.
Линейное освещение - это процесс подтверждения того, что и входящие и исходящие данные шейдеров находятся в правильном цветовом пространстве, что в результате позволяет получить более точное освещение.
В существующем конвейере рендеринга все цвета и текстуры выбираются в гамма пространстве (Gamma Space на изображениях ниже), то есть гамма коррекция не убирается из изображений и цветов перед тем как они передаются в шейдер. Из-за этого возникает ситуация, когда входящие данные шейдера находятся в гамма пространстве. Если это случается, то формула освещения воспринимает такие данные как если бы они были в линейном пространстве (Linear Space на изображениях ниже), и в итоге к окончательному пикселю не применяется гамма коррекция. В большинстве случаев это выглядит приемлемо, т.к. две ошибки в итоге друг друга нивелируют. Но это не правильно.
Если линейное освещение включено, тогда входящие данные шейдерной программы поставляются вместе с удалённой из них гамма коррекцией. Для цветов это преобразование применяется автоматически, если вы в линейном пространстве. Текстуры выбираются с использованием аппаратных sRGB считываний; исходная текстура поставляется в гамма пространстве и затем при выборке в графическом оборудовании результат автоматически конвертируется. Затем эти входящие данные поставляются шейдеру и освещение рассчитывается так, как оно рассчиталось бы в обычной ситуации. Затем результат записывается в кадровый буфер (framebuffer). Затем это значение либо подвергнется гамма коррекции и снова будет записан в кадровый буфер, либо оно останется в линейном пространстве для того, чтобы позже подвергнуться гамма коррекции; это зависит от текущей конфигурации рендеринга.
При использовании линейного освещения, входящие значения уравнений расчёта света не такие, как в гамма пространстве. Это значит, что при столкновении с поверхностями, пучки света будут иметь иную ответную кривую, чем при текущем конвейере рендеринга Unity.
Спад от освещения, основанного на расстоянии (distance-based) или нормалях (normal-based), меняется двумя способами. Во-первых, при рендеринге в линейном режиме, дополнительная производимая гамма коррекция заставит радиус источника света казаться больше. Во-вторых края освещения станут более крутыми. Это правильнее моделирует спад интенсивности света на поверхностях.
Когда вы используете освещения в гамма пространстве, к цветам и текстурам, передаваемым в шейдер, применена гамма коррекция. Когда они используются в шейдере, цвета высокой яркости на самом деле ярче, чем они должны быть при линейном освещении. То есть яркость поверхности будет расти нелинейно при увеличении интенсивности света. Это приводит к слишком яркому освещению во многих местах, и также может привести к ощущению, что все модели и сцены вымыты. Когда вы используете линейное освещение, интенсивность подсвечивания поверхности остаётся линейной при увеличении интенсивность источника света. Это приводит к более реалистичному затенению поверхности и намного более красивой цветовой чувствительности поверхности.
Infinite 3D Head Scan сделанный Lee Perry-Smith лицензирован под лицензией Creative Commons Attribution 3.0 Unported License. Доступен тут: http://www.ir-ltd.net/
При осуществлении смешивания для кадрового буфера, оно происходит в пространстве цветов или в кадровом буфере. При использовании гамма рендеринга нелинейные цвета смешиваются вместе. Но это не правильно. При использовании линейного пространства, смешивание происходит в линейном пространстве. Это правильно и даёт ожидаемые результаты.
Линейное освещение придаёт иной вид отрисовываемой сцене. Когда вы собрали проект под линейное освещение, он, скорее всего, не будет выглядеть корректно, если вы переключитесь на гамма освещение. Поэтому, если вы переходите к линейному освещению от гамма освещения, вам потребуется какое-то время, чтобы привести проект к виду, который был до перехода. Тем не менее, включение линейного освещения в Unity осуществляется довольно просто. Настройка должна производиться для каждого проекта в отдельности, с помощью Player Settings, которые можно найти тут: Edit -> Project Settings -> Player -> Other Settings
Когда вы используете линейное освещение, всё освещение и текстуры линеаризуются, поэтому передаваемые в лайтмаппер значения тоже должны изменяться. После переключения между линейным и гамма освещением, вам потребуется заново запечь карты освещения. Лайтмаппинг интерфейс Unity предупредит вас, когда карты освещения находятся в неправильном пространстве цветов.
Линейное освещение поддерживается не на всех платформах. Текущие целевые платформы, в которых поддерживается этот функционал:
Хоть на этих платформах и поддерживается линейное освещение, нет никаких гарантий, что графическое оборудование сумеет правильно отрендерить сцену. Вы можете проверить желаемого пространство цветов и текущее пространство цветов используя свойства QualitySettings.desiredColorSpace и QualitySettings.activeColorSpace. Если желаемое пространство цветов линейное, но активное - гамма, это значит, что проигрыватель откатился к гамма пространству. Это можно использовать, чтобы показать пользователю окно с предупреждением о том, что игра не будет корректно выглядеть, либо чтобы принудительно завершить приложение.
Когда вы не используете HDR, используется специальный тип кадрового буфера, поддерживающий чтение и запись sRGB (отмена гаммы при чтении и применение при записи). Это значит, что как и текстура, значения в кадровом буфере хранятся с применённой гамма коррекцией. Когда этот кадровый буфер используется для смешивания, или связан как текстура, гамма убирается из значений перед использованием. Когда в эти буферы записывают данные, записываемые значения конвертируются из линейного в альфа пространство. Если вы рендерите в линейном режиме, все эффекты пост-обработки будут иметь свои исходные и целевые буферы, созданные с включенной поддержкой sRGB чтения и записи, так что пост-обработка и смешивание пост-обработки происходит в линейном пространстве.
When using HDR, rendering is performed into floating point buffers. These buffers have enough resolution not to require conversion to and from gamma space whenever the buffer is accessed. This means that when rendering in linear mode, the render targets you use will store the colors in linear space. Therefore, all blending and post process effects will implicitly be performed in linear space. When the backbuffer is written to, gamma correction is applied.
При отрисовке Unity GUI, мы не производим рендеринг в линейном пространстве. Это значит, что у GUI текстур при чтении не должна удаляться гамма-коррекция. Этого можно достичь двумя путями:
It is also important that lookup textures, masks, and other textures whose RGB values mean something specific and have no gamma correction applied to them should bypass sRGB sampling. This will cause the sampled texture not to remove gamma before it is used in the shader, and calculations will be done with the same value as is stored on disk.