Работаю над созданием мода для игры WarCraft 3: добавляю поддержку Direct3D9 и возможность использовать соответствующие шейдеры/эффекты.
Вот в чём проблема:
Попробовал использовать эффект ParallaxOcclusionMapping.fx из DirectX SDK за 2010 год: текстуры накладываются правильно, bump эффект работает, но specular статичен - не меняется, если передвигать камеру, реагирует только на вращение и перемещение самого объекта.
Проблема возникла из-за того, что в варкрафте изначально не рассчитываются тангенты.
Теперь я пытаюсь перенести данные из оригинального буфера вершин в новый, где рассчитываю тангенты, и подменять его на этапе визуализации. Рисовать объекты из инициализированной переменной получается, но читать данные вершин из оригинального буфера - нет. В чём проблема?
Код здесь.
В коде шейдера, отредактированного мной, оригинальный код закоментирован.
Переменной vInViewWS не было, внимание на неё не обращайте, я её сам добавил: сначала пробовал сделать по-другому.
В данном эффекте матрица вида вообще не использовалась.
А как Вы добавили поддержку самого D3D9 в WarCraft 3?
[RenderEdge] Первое Demo (http://xgm.guru/p/wc3/155094)
[RenderEdge] Старые размышления (http://xgm.guru/p/wc3/149614)
[Warcraft 3] Перенос рендера: D3D8 -> D3D9 -> D3D11 (http://warcraft3ft.info/forum/29-57424)
Есть исходники шейдеров варкрафта на DX8? То есть оригинальные шейдеры. Надо посмотреть, как он рендерит источники света.
К сожалению, нет.
Если у Вас есть WarCraft, может посмотрите на Parallax Mapping в живую?
И да, если код оригинального шейдера верен, то почему он не работает?
Похоже, проблема в самой программе. Но все входные данные корректны.
В программе я отлавливаю функцию DrawIndexedPrimitive и пишу в ней приведённый выше код.
g_LightDir - только один источник света? И то в виде направления. Вот вам и статичные спекуляры. На сколько мне известно, в варкрафте источники света еще и точечные есть - свет от факелов, к примеру. А где вы его в шейдер передаете? А нигде.
Пока больше одного источника не надо. И что ещё надо передавать кроме направления?
Ничего больше не надо передавать. Просто это спекуляр от солнца, как я понял? А по вашему описанию я не понял, в чем проблема. Он же и должен реагировать только на перемещение и поворот.
Он должен реагировать на перемещение и поворот камеры, а не только самого объекта.
В варкрафте позиция солнца относительно камеры всегда на одном и том же месте.
Я создаю источник света из программы, а не беру его из варкрафта.
Дело в том, что с шейдером, до того, как я его отредактировал, specular покрывал объект практически равномерно, как обычная статичная текстура. После редактирования всё стало работать нормально, но остались проблемы с параллаксом.
Понятно, всё дело в том, что у меня не рассчитываются Tangent и Binormal. Нормали рассчитываются WarCraft'ом, дальше нашёл пример расчёта Tangent и Binormal, но для этого нужны переменные vertexCount, Vertex, numFaces и Triangle. Можно ли всё это сделать, если есть доступ к буферу вершин и индексов, к переменным baseVertexIndex, minIndex, startIndex, numVertices и primCount? Или я не так понял способ расчёта Tangent и Binormal. Может есть другой способ?
Тема в архиве.
Тема закрыта.