Перейти к публикации

Рекомендованные сообщения

Опубликовано: (изменено)

Приветствую!
 
Здесь я видел некоторые пользователи плакали по поводу DX11, но я хочу предложить способ, как в рамках DX9 практически "нахаляву" улучшить визуальное качество текстур. Описывать буду на примере РОФ, естественно.
Оговорюсь сразу, что в области 3D я всего лишь любитель-теоретик, и может быть кто-то знает причины почему описанное ниже неприменимо.
 
Итак, РОФ, как и многие другие игры, страдает от артефактов сжатия текстур. Они видны в виде квадратов странных цветов, особенно заметных в тени. Это чаще всего видно на нижних крыльях при виде "из кабины", и особенно этим страдает кабина недавно выпущеного Felixstowe (а жаль, красивый самолёт).

felixstowe.jpg


 
Причина этих артефактов в том, что во-первых сжатие текстур первым делом снижает глубину цвета до 16-бит, а во вторых человеческий взгляд лучше различает тёмные полутона, чем светлые. Гамма-коррекция как раз и связана со второй особенностью, и позволяет улучшить качество картинки получаемой на сжатых текстурах. Кстати, в настройках РОФа есть ползунок гамма-коррекции, но что именно он делает мне не понятно, тут речь совсем про другое.
 
Суть в том, что имея ограниченное количество бит на пиксель, вместо линейного кодирования изображения где разница между 10% и 20% такая же как между 80% и 90% яркости, можно использовать нелинейное, выделив больше бит на тёмные тона и соответственно меньше на светлые. Грубо говоря, всё равно разницу между 80% и 90% никто не увидит и оба этих оттенка можно объединить, зато освободившееся место использовать под 15% градацию.
 
Таким образом, первый шаг "понятен" -- рисуем текстуру с использованием гамма-коррекции. На самом деле я ничего не понимаю в рисовании, поэтому не знаю как это сделать правильно. Я для своих экспериментов просто загрузил официальный шаблон текстуры, а потом в фотошопе поднял ему гамму до 2.2 (см. ниже) и сохранил как DDS. В результате такая текстура, если вставить её прямо в игру, выглядит слишком яркой и естественно это не то, что нам надо.
 
Вот тут-то и происходит самое любопытное.
Как я понял, современные видеокарты (NVidia довольно давно, вот про AMD я не смог толком найти информации) поддерживают автоматическое конвертацию текстур из цветового пространства sRGB в линейное, с которым работают шейдеры. При этом гамма 2.2 это как раз распространённая аппроксимация для sRGB (то есть наверно можно получить ещё более правильный результат, если вместо изменения гаммы настроить цветовое пространство, но я в фотошопе не силён).
Итак, взяв исходный код шейдеров (он доступен в РОФ) и добавив одну строчку
SRGBTexture = true;
в сэмплер диффузной текстуры я получаю нужный эффект - яркость моей слишком яркой текстуры возвращается к нормальной.
Правда все остальные текстуры становятся слишком тёмными и, боюсь, по этой причине для РОФа эта фича уже неприменима -- слишком много текстур придётся переделывать, а переделывать их просто пересохранив сжатый DDS бессмысленно, нужны исходники.
 
Итак. Мы сначала подняли яркость (точнее гамму) текстуры, а потом вернули её обратно в шейдере, чтобы получить то же самое. Нафига, спрашивается?
А результат этой операции в том, что на тёмные тона было выделено больше бит и сжатие испортило их меньше:
Сравните без гамма-коррекции -- как оно обычно в РОФ:

part_without_gamma.jpg


 
С гамма-коррекцией -- тот же самый исходник текстуры, точно так же сжат в DXT5, в шейдеры добавлена одна строчка, которая по идее на скорость не влияет:

part_with_gamma.jpg


 
Наконец, текстура без сжатия (32 бита, один скин занимает 21 Мб) просто для чистоты эксперимента, реально такие текстуры нельзя использовать:

Uncompressed.jpg


 
Собственно вот.
Как я сказал, в РОФе уже проблематично что-то поменять. Разве что научить его как-то различать текстуры с гаммой и без и в зависимости от этого включать или выключать конвертацию из sRGB (насколько я понимаю DX11 это умеет делаеть автоматом).
 
Но раз уж вы теперь делаете Ил-2, то может ещё есть шанс заложить поддержку гамма-коррекции для получения более качественных текстур.
 
Мод для РОФа с шейдерами и скином для Альбатроса D3:
http://dl.dropbox.com/u/2918136/rof/Gamma Correction - Test.zip
 
Использованные материалы:
http://en.wikipedia.org/wiki/Gamma_correction
http://http.developer.nvidia.com/GPUGems3/gpugems3_ch24.html

 

Пожалуйста, большие картинки и видео, прячьте под

Изменено пользователем =BY=KAPUTT
  • Поддерживаю! 7

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
×
×
  • Создать...