пятница, 20 февраля 2009 г.

Тени в OpenGL рендере. Прогресс и дальнейшие планы.

Сначала я сделал тени для Direct3D 9. Потом переделал для OpenGL. Тени работали, но отличались в OpenGL по сравнению Direct3D в худшую сторону. Эту задачу я отложил до лучших времен. Иногда к ней возвращался но так и не мог понять в чем дело. Реализация у меня была с использованием рендера в текстуру и с использованием расширений GL_ARB_vertex_program и GL_ARB_fragment_program. (Код получен как результат компиляции Cg компилятором.)На данный момент частично используется GLSL полученный как результат компиляции из Cg.Сначала я думал что проблема в проблема была в использовании или инициализации рендера в текстуру с использованием GL_EXT_frame_buffer_object в связке с текстурами с плавающей точкой через расширение GL_ARB_texture_float. Но вскоре выяснилось что я немного неправильно построил матрицу источника света и матрицу текстуры. Теперь тень пиксель в пиксель совпадает с Direct3D.

OpenGL:

Direct3D:


В общем я решил пока не удалять OpenGL рендер из движка. Не так все плохо. Но еще есть проблемы на ATI.

На данный момент добавил рендер всей сцены в глубину. Результат сохраняется в float текстуру. Используя это эту возможность расширил в связи с этим менеджер постропцессинга, который может использовать эту текстуру. К примеру к примеру на основании этого реализовал эффект постпроцессинга Dof - Depth of Filed. Спасибо за переработанный шейдер из различных SDK Глебу Гущину(innuendo), а помощь в исправлении расчета преобразования глубины Арсению Капулкину(Zeux).
На данный момент идет улучшение теней с использованием алгоритма
Parallel Split Shadow Map.

В дальнейших планах исправление ошибок. Сейчас их накопилось много. Есть серьезные, а есть просто много мелочей. Параллельно буду писать редактор. Пусть пока простой - расстановка объектов, cохранение и загрузка.

8 комментариев:

Neill комментирует...

у меня в ОГЛ вылезла подобная проблема, реализовать было легко, но вот совместимость даже на некоторых нвидиа хромает. хотя здесь в общем-то достаточно знать тонкости реализации этих отдельных ситуаций и если бы они были бы где-то протестированы и описаны вот это была бы действительно ценная информация! )
если будет возможность, поделись какими-то моментами по split shadows, я до них так и не добрался еще, сделал пока только сэмплирование, но на будущее интересно будет почитать...
p.s. редактор - это отдельный камень и вместе с движком будут давить в двое крепче, так что мой совет, использовать внешнюю среду будь то макс, блендер, лайтвейв, потому как написание движка и написание редактора это разные задачи.

orange комментирует...

В общем я решил пока не удалять OpenGL рендер из движка.

Очень надеюсь что и не удалишь. У тебя хорошо получается. Сейчас не часто увидишь движок на одинаковом уровне поддерживающий Direct3D + OpenGL.

А по поводу редактора -
использовать внешнюю среду будь то макс, блендер, лайтвейв
зачем? да и как? да, в максе можно создать геометрию, оттекстурить, расставить объекты... но не больше! Такой функционал пишется одним человеком за 8 рабочих дней (проверено :)). Функционал свыше тоже несложно наращивается. Все что нужно от редактора - использовать функции движка: вставь объект, передвинь, поверни, присоедини эффект и т.п. А для облегчения написания редактора мы используем managed-С++ и .NET Framework 2.0 - и любой самый сложный интерфейс редактора набрасывается за пол часа.

Так что Андрюха - дерзай! У тебя классно выходит. А как я доберусь до теней у себя, буду тебя терзать по поводу CSM ;)

Andrey комментирует...

Сергей(Neil) на nVidia как раз все вроде нормально. Я вот умудрился до конца почти пересесть на GLSL полученный из Cg. на nVidia как часы работает. На ATI исчезают объекты :( не буду винить пока дрова от ATI. Видать что-то я еще не учел.
По поводу Split Shadows конечно поделюсь.Сейчас пытаюсь найти почему выпадаю куски геометрии(листья)ландшафта ну и проблема с буфером глубины. Буду дебажить по усердней и поглубже.
Насчет редактора подумаю над советом. Я уже начал реализовывать все что что связано с объектами в другом классе сцены наследником от сцены движка. Насчет внешних сред это может быть сложнее. в общем буду пробовать.
Сергей(Orange) обращайся по теням помогу :)

Nikolay Partas комментирует...

Neill
Вот я не согласен с утверждением, что написание редактора и движка это разные задачи. Скажу не первый, что возможно редактор должен быть началом движка и определять его внутреннюю структуру. Ну или хотябы нужно предусматривать варианты как редактировать, скажем тот же DOF-эффект из редактора. Такие не продуманный моменты могут повлечь в будущем серьезный пересмотр архитектуры движка.
Советую вести параллельно.

Andrey
Увидел у тебя на скрине информацию "SetVertexShader 194". Не влияет так много установок вершинных шейдеров на fps? Их смена довольно тяжелая. Хм.. или dx просекает одинаковые шейдеры?

offtop
на одном скрине кобанчик есть, а на другом уже нет, побежал дальше наверное :)))

Nikolay Partas комментирует...

Andrey
Забыл. Скажи пожалуйста, на какой видеокарте сделаны эти скрины?

Andrey комментирует...

Nikolay Partas
Конечно число установок влияет на производительность. Direct3D конечно наверняка проверяет но лучше сделать это самому, что и делаю. Я немного неправильно реализовал. Если NULL шейдер приходит то я считаю число установок и ставлю его. А нужно проверить что текущий тоже NULL и выходить. Спасибо за замечание.Уже исправил, теперь число около 150, т.е. примерно равно числу объектов.
Карта nVidia 8600 GT.

Анонимный комментирует...

Так и не стал юзать DepthTexture c сравнением ?

Andrey комментирует...

Я не вижу в этом абсолютно никакого смысла. Прекрасно все работает с ручным сравнением в шейдере.