Тени "лесенкой", "пилой", "зубчатые" тени в исполнении современных видеокарт Nvidia и ATI
Столкнулся с одной очень неприятной проблемой в играх после покупки новой видеокарты Nvidia. Дело в том, что тени на некоторых поверхностях отображаются некорректно, а именно: можно наблюдать раздражающий эффект "лесенки" или "пилы", часто такие кривые тени называют также "зубчатыми".
Я пытался найти решение этой проблемы в Интернете, но так и не нашёл не то чтобы решения, но даже внятного объяснения, почему тени становятся "зубчатыми". Форумные "гуру" с десятком тысяч постов посылают нести видеокарту в сервисный центр, люди поумнее начинают копать глубже. Вот, например, одно из объяснений причины появления теней "лесенкой":
При резком падении высоты ромбы, из которых состоят поверхности объектов, разбиваются на два треугольника не по короткой диагонали, а по длинной, в результате чего и получается сей неприятный эффект. Как мне ответили на одном из форумов, лечится такое только правильным подбором углов наклона поверхностей в 3D-редакторе, т.е. вся вина при данном объяснении возникновения "зубчатых" теней лежит на дизайнерах локаций.
Однако, встретив такие тени в разных играх не раз и не два, я начал сомневаться в правдоподобности данного объяснения. Особенно неприятно выглядят тени "лесенкой" в динамике, т.е. когда источник света движется (солнце, луна и т.п.). В этом случае эта "лесенка" приходит в движение и наблюдаются т.н. "мерцающие тени" или эффект "пилы". Обычно этот эффект можно наблюдать на удалённых склонах гор и холмов, но иногда бывает, что "зубчатые" тени оказываются у тебя прямо перед носом: например, на ближайшем дереве.
Ещё одно объяснение теней "лесенкой" сводится к погрешностям Z-буффера. Данная проблема известна как Z-fighting или Z-конфликт. Вот цитата из "Википедии":
"Если два объекта имеют близкую Z-координату, иногда, в зависимости от точки обзора, показывается то один, то другой, то оба полосатым узором. Это называется Z-конфликт (англ. Z fighting). Чаще всего конфликты присущи спецэффектам (декалям), накладывающимся на основную текстуру, например, дырам от пуль. Решаются Z-конфликты сдвигом одного объекта относительно другого на величину, превышающую погрешность Z-буфера."
Такая проблема встречается во многих играх. Вот, например, описание проблемы в Skyrim:
"Наверное, многие из вас сталкивались с проблемой Z-Fighting и не только в Скайриме. Z-Fighting возникает из-за ограничения точности вычислений с плавающей точкой в Z-буфере GPU. При этом графический процессор не способен определить, какая поверхность ближе к камере, а какая - дальше. Поэтому создаётся впечатление мерцания текстур."
* * *
Сейчас играю в RPG "Bound by Flame", в которой проблема теней "лесенкой" также присутствует. Сначала не обращаешь внимания, но со временем данный эффект начинает раздражать всё больше. Если кто знает, как решить данную проблему (если она вообще решаема на современных видеокартах), welcome в тему!
В заключение приведу интересную мысль о том, что причиной теней "лесенкой" является жадность производителей Nvidia и ATI, которые в погоне за быстродействием и вычислительной мощностью упрощают многие алгоритмы и ограничивают точность вычислений, из-за чего и появляются такие дефекты как тени "лесенкой" или "зубчатые" тени. Очень похоже на правду, т.к. я не припоминаю, чтобы на моей старенькой GeForce 9600 GT когда-либо наблюдались подобные проблемы. А я бы уж точно такой бросающийся в глаза дефект не пропустил...