24-битной Colordepth недостаточно?

30

Я заметил, что в очень мягких градиентах 24-битной глубины цвета недостаточно, поскольку вы можете видеть переходы цвета. Это выскакивает больше всего в темных сценах или ночном небе.

Почему никто не меняет глубину цвета на два байта на канал? Я знаю, что это было бы много работы, и многие аппаратные средства должны быть заменены, но я нахожу это немного раздражает. Я действительно не думаю, что технология оборудования недостаточно развита.

Так почему никто этого не делает?

Вот картина "Война Z", где вы можете увидеть, что я имею в виду:

The War Z цветовые переходы

Лис Джемай
источник
12
Ваше изображение в формате JPEG, которое тоже может создавать артефакты. Можете ли вы представить пример в формате без потерь?
Император Орионий
Ты шутишь, что ли? Вы жалуетесь на битовую глубину, но загружаете файл JPEG?
Тара
1
В точку. Нет необходимости в формате без потерь, когда JPG демонстрирует, что я имею в виду. Кстати: это не сжатие, которое вызвало этот эффект. Сохраните ваши ресурсы, человек ...
Liess Jemai

Ответы:

19

Вы более или менее сказали это сами: «Я знаю, это было бы много работы, и многие аппаратные средства должны быть заменены». В то время как графическое и аппаратное обеспечение на самом деле было бы относительно простым (если дорогое - удвоить размер всех текстур и буферов кадров - далеко не тривиально), «экосистема» для изображений с большей глубиной цвета просто не существует для В некоторой степени это делает это достойным расходом от чьего-либо имени, так как ни один производитель ЖК-дисплеев не пытается сосредоточиться на попытке получить до 16 бит на пиксель (хотя были некоторые эксперименты с 10BPP, который удобно все еще вписывает сигнал RGB в 32 битовый канал).

Короче говоря, это просто слишком много работы для того, что большинство людей считают еще слишком малой прибылью. Это может быть «немного раздражающим», но этот уровень раздражения настолько мал, что другие улучшения качества изображения были приоритетными.

Стивен Стадницки
источник
1
Хотя они и не доступны напрямую для конечных пользователей, некоторые высококачественные 27/30 "мониторы, предназначенные для профессионалов в области изображений и видео, имеют 14-битный внутренний / 10-внешний формат и используют дополнительные 4-битные для хранения справочной таблицы, чтобы помочь в калибровке цветов на дисплее.
Дэн Нили
@DanNeely: у любого «конечного пользователя» может быть один на пару тысяч долларов США. Им также нужна видеокарта профессионального уровня, как Quadro. Учитывая, что некоторые люди платят за телевизор и звуковую систему, это неплохо.
Зан Рысь
@ZanLynx Я использовал фразу, нацеленную на профессионалов, а не только на профессионалов. Любой может купить полный стек; но цены настолько высоки, а выгоды настолько редки, что мало кто делает. Например, только 1,17% пользователей Steam имеют 2560 дисплеев. А монитор - это единственная часть необходимого стека, которую опытный пользователь, скорее всего, в конечном итоге получит случайно, потому что некоторые (все?) Дисплеи марки 2560 модели 2011 года от основных производителей включали 10/14-битный цвет; и более дешевый корейский импорт некоторое время не был широко доступен. Карты Quadro / etc ничего не предлагают геймерам по сравнению со стандартными.
Дэн Нили
1
Возможно ли, что такая полоса на самом деле является текстовой оптимизацией, чтобы уменьшить объем работы рендеринга неба? Когда я создаю 24-битный градиент в GIMP, это не выглядит так. Смотрите static.inky.ws/image/4306/gradient.png для 24- битного градиента.
ldrumm
2
@ldrumm нет, не совсем, вы действительно воспользовались самым экстремальным диапазоном и включили дизеринг в gimp, посмотрите на этот пример с дизерингом (видимая легкая полосатость) и здесь без дизеринга . Проблема в том, что вы не можете просто повсеместно обрабатывать дизеринг в текстурах, и большинство текстур не создаются с помощью градиентов. Если они окрашены вручную и имеют некоторую форму большой области с градиентом между 2 довольно похожими цветами тогда будет полоса
PeterT
44

Да, вы не первый человек, который заметит это . :) С сегодняшними высококонтрастными коэффициентами 8 бит на компонент недостаточно для получения плавного градиента без видимых полос - если только не используется сглаживание.

Использование более 8 бит на канал на дисплее называется « глубоким цветом » изготовителями дисплея. Это не очень широко распространено из-за проблемы курицы и яйца. Глубокий цветной дисплей бесполезен без видеокарты, которая может выводить глубокие цвета, и игрового движка, который поддерживает рендеринг в глубокие цвета. Кроме того, нет никакого смысла в игровом движке или видеокарте, которая поддерживает глубокие цвета без дисплея. Таким образом, у производителей оборудования и разработчиков игр нет особого стимула добавлять поддержку этой технологии, так как с обеих сторон нет рынка, который оправдывал бы стоимость разработки.


Кроме того, существуют другие способы исправить полосу из-за ограниченной 8-битной точности. Как я упоминал ранее, игровые движки могут использовать дизеринг, чтобы скрыть полосу.


(Изображение кота с 256-цветовой палитрой, без и с размытием. Создано пользователем Wikipedia Wapcaplet , используется по лицензии CC-By-SA 3.0 .)

Добавление небольшого сглаживания ± 0,5 / 255 перед записью значения пикселя в буфер кадров чрезвычайно эффективно при скрытии полос на плавных градиентах и ​​по существу незаметно. Если вы работаете с движком HDR, вы делаете это на этапе создания тональной карты.


Наконец, как уже отмечали другие, сжатие текстур может быть большим источником полосообразных артефактов в изображении, чем 8-битная точность. Это может быть то, что происходит с небом на этом изображении, хотя трудно сказать - в нем столько сжатия JPEG, что любые артефакты из-за сжатия DXT в значительной степени затоплены.

Натан Рид
источник
+1 - отличный ответ, и я полностью упустил вероятность того, что у группы были другие причины.
Стивен Стадницки,
1
+1 за то, что заметил, что файл в формате JPEG. Пример без потерь от OP предотвратит неправильное суждение из-за шума в данных.
ldrumm
@ldrumm Также игра / движок, который не страшен ...
Брайан Ортис
Я добавил картинки, чтобы подчеркнуть разницу, которую может создать дизеринг. Не стесняйтесь вернуться, если вам это не нравится :)
BlueRaja - Дэнни Пфлугхофт
13

Стоит также отметить, что многие ЖК-панели не имеют даже 8 бит на канал. Более дешевые имеют тенденцию использовать меньше битов и использовать различные уловки, чтобы скрыть это. Например, они могут быстро переключаться между двумя смежными цветами, чтобы представлять один из них. http://www.anandtech.com/show/1557/3

Некоторые подробности о том, как DXGI поддерживает 10 бит на канал и ярче, чем белые цвета, можно найти по адресу http://msdn.microsoft.com/en-us/library/windows/desktop/jj635732%28v=vs.85%29.aspx.

D3D также поддерживает более 8 бит на канал в течение многих лет. Нет ничего, что мешало бы разработчикам делать некоторые колебания от 16 бит на канал до 8 бит, если они думают, что это хорошая идея.

Конечно, это не очень поможет, если исходные данные (текстура и т. Д.) Являются только 8-битными (или, более вероятно, DXT1, что составляет 5-6-5 бит на канал). Я полагаю, что это то, что происходит с небом на этом скриншоте (размытие по Гауссу с 8 битами на дюйм делает его намного более плавным для меня), но трудно быть уверенным.

Адам
источник
10

Ответ Стивена Стадницки правильный: в играх редко используются текстуры с более высокой точностью, поскольку для этого требуется слишком много памяти текстур и, следовательно, слишком большая пропускная способность памяти при выборке текстуры в пиксельном шейдере. Однако есть решения, которые не требуют больших текстур. (Я бы опубликовал это как комментарий, но это слишком долго.)

Homeworld решает эту проблему путем кодируя изображение неба как градиенты вершин . Этот метод отлично подходит для больших низкочастотных изображений (например, плавных градиентов) - например, неба - где текстура покрывает огромное количество игровых пикселей.

Другое возможное решение - применить нормализацию гистограммы. к изображению вашего неба. Если данные текстуры находятся в узком диапазоне значений, как темное ночное небо, большинство битов в каждом цветовом канале не содержат полезных данных. Вместо этого сделайте это:

  • Создайте оригинальную текстуру в 16-битном формате, например 16-битном TIFF.
  • Когда вы подготавливаете свои текстуры для игрового движка, найдите самый темный пиксель, присутствующий на изображении, и запомните это как смещение. Допустим, это значение пикселя составляет 0,1 в возможном диапазоне 0-1.
  • Затем найдите самый яркий пиксель и вычтите самый темный пиксель, чтобы получить диапазон значений в изображении. Таким образом, если самый яркий пиксель все еще довольно темный - скажем, 0,35 - диапазон составляет всего 0,35 - 0,1 = 0,25. Только 25% диапазона значений присутствует на изображении.
  • Создайте свою DXT / BC-сжатую текстуру в игре. Вычтите самое темное значение из каждого пикселя и умножьте, чтобы использовать весь цветовой диапазон. В примере расчета мы вычитаем наше темное значение 0,1 и, поскольку присутствует только 25% доступного диапазона значений, мы умножаем каждое значение пикселя в 4 раза, чтобы создать текстуру в игре. Обязательно сделайте все это, прежде чем квантовать исходное 16-битное изображение на вход 8bpp компрессора DXT. Выходное изображение теперь будет использовать весь диапазон значений, поддерживаемых игровым форматом. Мы выделяем все наши биты для представления значений, фактически присутствующих на изображении.
  • Сохраните смещение темного значения (0,1) и диапазон (0,25) в метаданных где-нибудь. Передайте их как входные данные для вашего пиксельного шейдера.
  • В коде пиксельного шейдера сэмплируйте свою сдвинутую, расширенную текстуру, преобразуйте ее в значение с плавающей запятой, а затем выполните умножение / сложение, чтобы восстановить исходное значение цвета. Другими словами, умножьте на 0,25 и добавьте 0,1, чтобы восстановить значение, сохраненное в исходном изображении.

Убедитесь, что код шейдера является гамма-верным . Если вы выполняете математику (освещение и последующую обработку) для образцов текстуры, которые не преобразованы из цветового пространства sRGB в линейное пространство, вы увидите артефакты полосатости, подобные описанным вами. Гамма-коррекция была создана, чтобы помочь решить проблему такого рода, выделяя больше битов темным значениям, когда ваши глаза более чувствительны к изменениям значений. Но вы можете легко сломать вещи, если не учитываете гамма-коррекцию при расчете, например, освещения, экспозиции или постобработки эффектов. Gamma FAQ полезно.

ThisIsTheDave
источник
1

24 бита недостаточно, но гораздо чаще встречаются такие проблемы, как алгоритмы сжатия изображений, сглаживание или другие цифровые артефакты. Кроме того, не забывайте о роли технологии дисплея - независимо от того, какие цифровые входы, дисплей может не производить соответствующие шаги в реальной яркости.

ddyer
источник