Войти
ПроектыФорумОцените

QeffectsGL (графический мод для OpenGL-игр) (4 стр)

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 3 4 5 Следующая »
#45
18:27, 23 ноя. 2012

FROL
>Хм, пардон если вопрос уже задавали, так у тебя транслятор GLSL=> HLSL ко всему прочему есть?
Direct3D не в этом проекте. Тут просто улучшенная библиотека для OpenGL ты глянь описание что за эффекты она добавляет.
Глянул исходники. Шейдера Doom 3 используются как обычно. Финальную картинку автор просто наверняка делает постпроцессом используя шейдера написанные на GLSL + остальные эффекты.


#46
22:41, 23 ноя. 2012

Да, тут только OpenGL-игры.

#47
23:51, 23 ноя. 2012

Andrey
>>голые asm шейдера
Чего? какой еще асм?? вот этот? (http://en.wikipedia.org/wiki/ARB_%28GPU_assembly_language%29)

Моласар
> Да, тут только OpenGL-игры.
То есть эта штука (Qeffects) не имеет отношения к твоей имплементации OpenGL через DirectX ?

#48
23:51, 23 ноя. 2012

Понял, все, спасибо. Сорри за невнимательность.

Прошло более 11 месяцев
#49
14:53, 9 ноя. 2013

Привет всем!

QEffects под Zandronum

Захотелось вдруг дико зарубиться в Brutal Doom с современными наворотами, нашел модификацию QEffectsGL. Под современные порты пришлось самолично править шейдеры. Но по крайней мере вернулись к поддержке SSAO (Screen Space Ambient Occlusion), пусть и глючной. Установку - распаковываем в корневую папку Зандронума. Все уже настроено.

Изображение

Я еще покопаюсь в исходниках и попробую решить следующие проблемы:

* отрисовать пост-эффекты ДО оружия, HUD и меню
(распознать начало отрисовки HUD и вставить пост-процессинг туда... теоретически можно отследить по отключению проверки Z-буффера)

* убрать SSAO на небе
(опять же отследить этот момент, врубить, например Scissor-тест, выявляющий геометрию кроме неба, а все прочее отрисовать так далеко, как это возможно... ну или просто плоской линией, на которой следов SSAO не будет :) надеюсь обойтись без правки исходников Zandronum, опять же по коссвенным параметрам...)

#50
16:11, 9 ноя. 2013

LifeKILLED
> отрисовать пост-эффекты ДО оружия, HUD и меню
Там надо поиграться с переменной RenderFrame.
При каждой установке 2д-матрицы игрой её значение увеличивается на единичку (в рамках одного кадра).
Следовательно, надо экспериментально подобрать значение.
Если же поставить -1, но постэффекты будут применяться перед SwapBuffers, т.е. в самом конце.
> убрать SSAO на небе
Для этого есть перменная SSAOMaxZ. Например, в играх на движках ку1 и ку2 разумное значение 0.56, тогда ссао не затрагивает небо.
Правда, это будет работать только в том случае, если небо рисуется в конце с большим значением глубины, чем мир.

#51
16:26, 9 ноя. 2013

>> Там надо поиграться с переменной RenderFrame.

Все эффекты работают только при RenderFrame = 2.
Хотя мысль хорошая.

>> Для этого есть перменная SSAOMaxZ
Нет. Небо, очевидно, рисуется в начале. Затем, поверх него, в ZBuffer рисуются невидимые стенки комнаты (чтобы отсекать невидимые участки карты).

Мне кажется, можно попробовать отследить именно момент отрисовки НЕВИДИМЫХ стенок, то есть BlendFunc равная GL_SOURCE или типа того.

И с помощью Stencil-буфера выделить эти невидимые стенки. А уже потом, перед пост-эффектами, отрисовать туда далекий полигон.

Раз уж САМ автор модификации на связи, предложу КОНКРЕТНЫЕ мысли по улучшению оригинала (с сохранением поддержки всего остального).

Очевидно, нужно добавить новых переменных, что я и сделал. Я добавил переменную SSAODistance, которая уменьшает "разлет" выборок из текстуры глубины. Почему-то в Зандронуме и ЗДуме пришлось уменьшить этот "разлет" в 30 раз, чтобы добиться нормального эффекта (в версии 1.2 модификации был черный фон).

В фрагментарном шейдере есть переменные "float w" и "float h". После их вычисления я помножил их на новый атрибут (там как раз было место в Local1.w) и вынес как в конфиг, как SSAODistance = 0.03

Это может пригодиться и для других игр. Также, наверное, стоит вынести из шейдера aoRange, например... Я этого пока не сделал.

#52
16:42, 9 ноя. 2013

Было бы неплохо сделать что-то наподобие, но для старых версий DX.

#53
14:08, 10 ноя. 2013

Попытки распознать небо по прозрачному блендингу провалились.

Наверное, небо отрисовывали на стены секторов и накладывали текстуру проекционно... Либо третий вариант... Лень копаться в Зандронуме. Попробую разобраться с небом попозже :)

#54
0:07, 11 ноя. 2013

Гадать, конечно, интересно, но залез я в исходники GZDoom (основа Зандронума) и офигел. Сделано все по правилам, четкие разграничения по абстракции, т.е. там, где есть слово Sky, команд OpenGL нет, и наоборот. Молодцы.

Видимо, там на определенном этапе (а там этих этапов до...) рисуется вся геометрия в ZBuffer - ради освещения. Вааще красавцы, нечего сказать. Ну ладно, продолжим копаться. Интересно ведь :)

P.S.: Проблема с оружием игрока и меню решилась командой RenderFrame=0 (в прошлый раз было 2).

#55
17:32, 11 ноя. 2013

Ура! Проблема с 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 );
}
#56
17:48, 11 ноя. 2013

LifeKILLED
Это хорошо, но, вероятно, имеет смысл сделать ещё и проверку на саму игру, т.к. в других играх этот хак может помешать.

#57
18:10, 11 ноя. 2013

Я понимаю, поэтому сделал опцию по умолчанию выключенной. В конфиге она прописывается как SkyFix=1. Фирма веников не вяжет :)

P.S.: Проблемы есть и в порте дум... То есть в секторе с небом во дворе в map01 Дума 2 появляется странный пол. Но в остальных картах я этого не заметил. Буду теперь пиарить сборку :)

UPDATE:

Возникла проблема с SSAO на другом компе. Возможно, из-за настроек драйверов видеокарты, но SSAO отображается как бы наоборот - везде тьма, а на стыках геометрии светло xD И еще вместе с выше перечисленным хаком возникла проблема с DoF, опять же на небе. Может, удастся исправить через шейдер. Но главное, все сдвинулось с мертвой точки :)

Я вообще кроме Brutal Doom'а и любительских вадов в последнее время почти ни во что не играю. Так тут еще одна забава появилась в виде программирования xD

UPDATE #2:

Попробую улучшить шейдеры по своему вкусу. Постараюсь вынести переменные в ini-файл, оставив полную совместимость. Ну, а если не получится, будет сборка отдельно под Zandronum.

#58
23:05, 11 ноя. 2013

LifeKILLED
> В конфиге она прописывается как SkyFix=1
А, ну да. Что-то я не сообразил. Там же переменные можно переопределять в профилях разных игорей.
> Ну, а если не получится, будет сборка отдельно под Zandronum.
Сделайте форк, потом если всё хорошо работать будет - можно будет и транк обновить.

#59
2:30, 12 ноя. 2013

Все закончил, отстроил. Проблема с глюками, возникшими из-за убирания невидимых стенок, решена. Я убирал стенки только в определенном RenderFrame, плюс отсчитывал пропуски стен с начала кадра. Теперь все выглядит нормально.

Ради Zandronum'а добавлено 2 переменные в конфиге (если их не писать, настройки останутся прежними):
SSAODistance=0.03
GZDoomSkyFix=1

Первая уменьшает разброс при SSAO (добавлена в шейдер).
Вторая отлавливает невидимые стенки в самой программе.

Есть один вопрос. На картинке ниже изображено SSAO у стенки (она слева от игрока). SSAO видно только на одном участке, который я выделил, а по остальной длине - нет. И еще видно, что радиус отраженного затемнения одинаковый относительно кадра, хотя при отдалении он по идее должен уменьшаться. Так и надо? В смысле, это недостаток шейдера был изначально, или это возникло из-за моих изменений?
Изображение

Судя по тому, что там какие-то хитрые формулы с квадратным корнем, зависимость "разлета" SSAO от дальности пикселя присутствует, но в моем варианте почему-то не работает. В шейдере были переменные w и h, я тупо уменьшил их в 30 раз (SSAODistance=0.03). Сколько ни пытался сделать по-красивее, не получилось.

Страницы: 1 2 3 4 5 Следующая »
ПроектыФорумОцените

Тема в архиве.