Advanced: Тема повышенной сложности или важная.
FROL
>Хм, пардон если вопрос уже задавали, так у тебя транслятор GLSL=> HLSL ко всему прочему есть?
Direct3D не в этом проекте. Тут просто улучшенная библиотека для OpenGL ты глянь описание что за эффекты она добавляет.
Глянул исходники. Шейдера Doom 3 используются как обычно. Финальную картинку автор просто наверняка делает постпроцессом используя шейдера написанные на GLSL + остальные эффекты.
Да, тут только OpenGL-игры.
Andrey
>>голые asm шейдера
Чего? какой еще асм?? вот этот? (http://en.wikipedia.org/wiki/ARB_%28GPU_assembly_language%29)
Моласар
> Да, тут только OpenGL-игры.
То есть эта штука (Qeffects) не имеет отношения к твоей имплементации OpenGL через DirectX ?
Понял, все, спасибо. Сорри за невнимательность.
Привет всем!
Захотелось вдруг дико зарубиться в Brutal Doom с современными наворотами, нашел модификацию QEffectsGL. Под современные порты пришлось самолично править шейдеры. Но по крайней мере вернулись к поддержке SSAO (Screen Space Ambient Occlusion), пусть и глючной. Установку - распаковываем в корневую папку Зандронума. Все уже настроено.
Я еще покопаюсь в исходниках и попробую решить следующие проблемы:
* отрисовать пост-эффекты ДО оружия, HUD и меню
(распознать начало отрисовки HUD и вставить пост-процессинг туда... теоретически можно отследить по отключению проверки Z-буффера)
* убрать SSAO на небе
(опять же отследить этот момент, врубить, например Scissor-тест, выявляющий геометрию кроме неба, а все прочее отрисовать так далеко, как это возможно... ну или просто плоской линией, на которой следов SSAO не будет :) надеюсь обойтись без правки исходников Zandronum, опять же по коссвенным параметрам...)
LifeKILLED
> отрисовать пост-эффекты ДО оружия, HUD и меню
Там надо поиграться с переменной RenderFrame.
При каждой установке 2д-матрицы игрой её значение увеличивается на единичку (в рамках одного кадра).
Следовательно, надо экспериментально подобрать значение.
Если же поставить -1, но постэффекты будут применяться перед SwapBuffers, т.е. в самом конце.
> убрать SSAO на небе
Для этого есть перменная SSAOMaxZ. Например, в играх на движках ку1 и ку2 разумное значение 0.56, тогда ссао не затрагивает небо.
Правда, это будет работать только в том случае, если небо рисуется в конце с большим значением глубины, чем мир.
>> Там надо поиграться с переменной RenderFrame.
Все эффекты работают только при RenderFrame = 2.
Хотя мысль хорошая.
>> Для этого есть перменная SSAOMaxZ
Нет. Небо, очевидно, рисуется в начале. Затем, поверх него, в ZBuffer рисуются невидимые стенки комнаты (чтобы отсекать невидимые участки карты).
Мне кажется, можно попробовать отследить именно момент отрисовки НЕВИДИМЫХ стенок, то есть BlendFunc равная GL_SOURCE или типа того.
И с помощью Stencil-буфера выделить эти невидимые стенки. А уже потом, перед пост-эффектами, отрисовать туда далекий полигон.
Раз уж САМ автор модификации на связи, предложу КОНКРЕТНЫЕ мысли по улучшению оригинала (с сохранением поддержки всего остального).
Очевидно, нужно добавить новых переменных, что я и сделал. Я добавил переменную SSAODistance, которая уменьшает "разлет" выборок из текстуры глубины. Почему-то в Зандронуме и ЗДуме пришлось уменьшить этот "разлет" в 30 раз, чтобы добиться нормального эффекта (в версии 1.2 модификации был черный фон).
В фрагментарном шейдере есть переменные "float w" и "float h". После их вычисления я помножил их на новый атрибут (там как раз было место в Local1.w) и вынес как в конфиг, как SSAODistance = 0.03
Это может пригодиться и для других игр. Также, наверное, стоит вынести из шейдера aoRange, например... Я этого пока не сделал.
Было бы неплохо сделать что-то наподобие, но для старых версий DX.
Попытки распознать небо по прозрачному блендингу провалились.
Наверное, небо отрисовывали на стены секторов и накладывали текстуру проекционно... Либо третий вариант... Лень копаться в Зандронуме. Попробую разобраться с небом попозже :)
Гадать, конечно, интересно, но залез я в исходники GZDoom (основа Зандронума) и офигел. Сделано все по правилам, четкие разграничения по абстракции, т.е. там, где есть слово Sky, команд OpenGL нет, и наоборот. Молодцы.
Видимо, там на определенном этапе (а там этих этапов до...) рисуется вся геометрия в ZBuffer - ради освещения. Вааще красавцы, нечего сказать. Ну ладно, продолжим копаться. Интересно ведь :)
P.S.: Проблема с оружием игрока и меню решилась командой RenderFrame=0 (в прошлый раз было 2).
Ура! Проблема с SSAO на небе была решена!
bool SkyFixStarted=0; // Need for SkyFix (helps with SSAO) void WINAPI glDisable(GLenum cap ) { // SkyFix // Disable all invisible walls drawing in ZBuffer - like sky (need for SSAO) if ( QFXRenderer::Instance( ).GetSkyFix( )) { if ( cap == GL_TEXTURE_2D) SkyFixStarted=1; // Disable textures? I know what you need! xD if ( SkyFixStarted) { gl::qglEnable( GL_DEPTH_TEST ); gl::qglDepthFunc( GL_NEVER ); // Just push'em out! return; // And don't let any changes } } gl::qglDisable( cap ); } void WINAPI glEnable( GLenum cap ) { if ( cap == GL_MULTISAMPLE_ARB ) QFXRenderer::Instance( ).SetupMultisample( ); // SkyFix // We not drawn invisible geometry in ZBuffer - need for SSAO if ( SkyFixStarted ) if ( QFXRenderer::Instance( ).GetSkyFix( )==1) { if ( cap == GL_TEXTURE_2D) { // I excuse you, but not do this anymore :) SkyFixStarted=0; // Render returned back! gl::qglDepthFunc( GL_LEQUAL ); } } gl::qglEnable( cap ); }
LifeKILLED
Это хорошо, но, вероятно, имеет смысл сделать ещё и проверку на саму игру, т.к. в других играх этот хак может помешать.
Я понимаю, поэтому сделал опцию по умолчанию выключенной. В конфиге она прописывается как SkyFix=1. Фирма веников не вяжет :)
P.S.: Проблемы есть и в порте дум... То есть в секторе с небом во дворе в map01 Дума 2 появляется странный пол. Но в остальных картах я этого не заметил. Буду теперь пиарить сборку :)
UPDATE:
Возникла проблема с SSAO на другом компе. Возможно, из-за настроек драйверов видеокарты, но SSAO отображается как бы наоборот - везде тьма, а на стыках геометрии светло xD И еще вместе с выше перечисленным хаком возникла проблема с DoF, опять же на небе. Может, удастся исправить через шейдер. Но главное, все сдвинулось с мертвой точки :)
Я вообще кроме Brutal Doom'а и любительских вадов в последнее время почти ни во что не играю. Так тут еще одна забава появилась в виде программирования xD
UPDATE #2:
Попробую улучшить шейдеры по своему вкусу. Постараюсь вынести переменные в ini-файл, оставив полную совместимость. Ну, а если не получится, будет сборка отдельно под Zandronum.
LifeKILLED
> В конфиге она прописывается как SkyFix=1
А, ну да. Что-то я не сообразил. Там же переменные можно переопределять в профилях разных игорей.
> Ну, а если не получится, будет сборка отдельно под Zandronum.
Сделайте форк, потом если всё хорошо работать будет - можно будет и транк обновить.
Все закончил, отстроил. Проблема с глюками, возникшими из-за убирания невидимых стенок, решена. Я убирал стенки только в определенном RenderFrame, плюс отсчитывал пропуски стен с начала кадра. Теперь все выглядит нормально.
Ради Zandronum'а добавлено 2 переменные в конфиге (если их не писать, настройки останутся прежними):
SSAODistance=0.03
GZDoomSkyFix=1
Первая уменьшает разброс при SSAO (добавлена в шейдер).
Вторая отлавливает невидимые стенки в самой программе.
Есть один вопрос. На картинке ниже изображено SSAO у стенки (она слева от игрока). SSAO видно только на одном участке, который я выделил, а по остальной длине - нет. И еще видно, что радиус отраженного затемнения одинаковый относительно кадра, хотя при отдалении он по идее должен уменьшаться. Так и надо? В смысле, это недостаток шейдера был изначально, или это возникло из-за моих изменений?
Судя по тому, что там какие-то хитрые формулы с квадратным корнем, зависимость "разлета" SSAO от дальности пикселя присутствует, но в моем варианте почему-то не работает. В шейдере были переменные w и h, я тупо уменьшил их в 30 раз (SSAODistance=0.03). Сколько ни пытался сделать по-красивее, не получилось.
Тема в архиве.