ENAleksey
> над созданием мода для игры WarCraft 3
а позвольте задать вопрос: что за мод?
ENAleksey
А вы знаете толк в извращениях. С одной стороны мысль достаточно занятная. С другой же это всё(мне) напоминает костыли для костылей для костылей. Я люблю war3. Но вот сколько переизданий под hd/directx9 не видел, всё это выглядит откровенно плохо за счёт низкополигональных моделей. К примеру, взять тех же третих героев HD) А если всё это мутить ещё и с моделями, то стоит ли овчинка выделки?
Но таки за проектом буду следить)
float3 vInBinormalOS : BINORMAL,
float3 vInTangentOS : TANGENT )
А ты уверен что W3 передает в шейдер тангент и бинормаль?
Тему не читай, на нульпост отвечай....
Можно ли всё это сделать, если есть доступ к буферу вершин и индексов, к переменным baseVertexIndex, minIndex, startIndex, numVertices и primCount? Или я не так понял способ расчёта Tangent и Binormal. Может есть другой способ?
Можно. Буфер вершин - указатель на массив вершин. Саму структуру буфера можно получить когда приложение вызывае: IDirect3DDevice9::SetFVF или IDirect3DDevice9::SetVertexDeclaration. Тебе всего лишь надо будет подменить буфер на свой, и установить свой FVF/VertexDeclaration
Кстати, вот видео (tangent space не используется):
philosoph
Я делаю этот мод в первую очередь для того, чтобы доказать себе, что я на это способен. Во-вторых, кроме меня работать над этим модом никто не будет, что очень меня расстраивает.
"Очень жаль, что до меня этого никто не сделал. Здесь нет ничего сложного, можно было спокойно реализовать поддержку Direct3D9 ещё в 2004 году. Тогда это было бы очень актуально, а сейчас картостроение стремительно угасает, уступает место полноценному gamedev'у. Конечно, это к лучшему, я и сам очень хочу наконец продолжить разработку игры, но у меня уже столько сделано в варкрафте... Я не люблю останавливаться на полпути, я должен довести дело до конца!"
ENAleksey
> я должен довести дело до конца
Всё это замечательно. А в какой срок вы собираетесь оное закончить? Ваш энтузиазм по оживлению этой игры впечатляет)
ENAleksey
> я и сам очень хочу наконец продолжить разработку игры
вы ещё какую то игру делаете?
philosoph
Максимум ещё два года буду делать, если к этому времени ничего не выйдет, то перейду к разработке полноценной игры.
philosoph
> вы ещё какую то игру делаете?
Уже 6 лет (но только у себя в голове). Очень давно хотел сделать rpg карту для варкрафта с крутым сюжетом и управлением на стрелочках :) Со временем понял, что всё, что я задумал реализовать невозможно и решил сделать игру на Unity3d, даже забросил варкрафт (правда только на две недели), но
> у меня уже столько сделано в варкрафте...
А дальше я наткнулся на мод Nirvana для варкрафта, где автор реализовал Normal Mapping, Shadow Volumes и различные пост процессы. И я решил продолжить его дело.
За эти годы скопилось достаточно идей для хорошей rpg игры, каждую из которых я тщательно продумывал, надеюсь, что получится что-то очень интересное.
ENAleksey
> Максимум ещё два года
жесть. Правда жесть. За такой срок как по мне, можно запилить если не полноценную игру, то достойную демоверсию. Правда с определёнными знаниями в программировании и гд, но всё же...
ENAleksey
> Максимум
Может я всё сделаю за пару месяцев, кто знает... Хотелось бы конечно сделать следующее:
1. "У меня в голове уже давно вертится идея демки с сюжетом к моей будущей игре, но для начала нужно заставить всё работать как нужно. Будут тени, пост-эффекты, отражения, боевая система как в Mount and Blade, небольшой сюжет."
2. "Ещё хочу облегчить жизнь будущим картоделам - добавить в World Editor редактор материалов (например, как в UE4), Content Manager (тоже UE4 или Unity3D), управление графикой и создание интерфейса через jass. И многое другое... Лишь бы не забил..."
3. "Стандартные юниты, способности, предметы не будут использоваться: всё будет как в UE4 или Unity3D, т.е импортируешь, например, .fbx меш и текстурки для него в Content Browser, перетаскиваешь меш на рабочую область, а с помощью SharpCraft'а пишешь для него скрипты."
Но оказывается не всё так просто: например, про импорт мешей - не сложно сделать поддержку static meshes, но только вчера я вспомнил про skeletal meshes, а тратить время на них уже не хочется.
MrShoor
Вот пример ShadowVolume из мода Nirvana, где происходят манипуляции с буфером вертексов варкрафта:
#include "ShadowType.h" #include <stdio.h> namespace SV { bool IsHeroShadow(IDirect3DDevice9* pd3dDevice, IDirect3DVertexBuffer9* pVertexBuffer, IDirect3DIndexBuffer9* pIndexBuffer, DWORD startIndex, DWORD primCount, DWORD baseVertexIndex) { // Warcraft3 FVF struct SHADOWVERTEX { D3DXVECTOR3 p, n; D3DCOLOR cl; FLOAT tu, tv; }; SHADOWVERTEX* pVerticesData; WORD* pIndicesData; // Lock the geometry buffers pVertexBuffer->Lock( baseVertexIndex * sizeof( SHADOWVERTEX), 8 * sizeof( SHADOWVERTEX), ( LPVOID*)&pVerticesData, D3DLOCK_DONOTWAIT | D3DLOCK_READONLY | D3DLOCK_NOOVERWRITE | D3DLOCK_NOSYSLOCK | D3DLOCK_NO_DIRTY_UPDATE); pIndexBuffer->Lock( startIndex * sizeof( WORD), 4 * sizeof( WORD), ( LPVOID*)&pIndicesData, D3DLOCK_DONOTWAIT | D3DLOCK_READONLY | D3DLOCK_NOOVERWRITE | D3DLOCK_NOSYSLOCK | D3DLOCK_NO_DIRTY_UPDATE); WORD idx0 = pIndicesData[0]; WORD idx2 = pIndicesData[2]; WORD idx3 = pIndicesData[3]; float tu0 = pVerticesData[idx0].tu; float tu3 = pVerticesData[idx3].tu; float tv0 = pVerticesData[idx0].tv; float tv2 = pVerticesData[idx2].tv; // Unlock the geometry buffers pVertexBuffer->Unlock( ); pIndexBuffer->Unlock( ); float scale_x = 100.00f * 1.28f / ( tu3-tu0); float scale_y = 100.00f * 1.28f / ( tv0-tv2); /* char buffer[64]; memset(buffer, 0, 64); sprintf_s(buffer, 64, "x: %f - y: %f", scale_x, scale_y); MessageBox(NULL, buffer, buffer, MB_OK); */ float remainder_x = fmod( scale_x , 10.0f); float remainder_y = fmod( scale_y , 10.0f); if ( abs( remainder_x-5.0f) < 2 || abs( remainder_y-5.0f) < 2) // threshold, in WC3 unit shadow scale format { return true; } return false; } }
Т.е. мне нужно в структуру вершины добавить ещё 2 вектора - tangent и binormal.
А между pVertexBuffer->Lock и pVertexBuffer->Unlock проводить их расчёт?
Или лучше проводить вычисления в другом месте, а потом передавать получившиеся tangent'ы и binormal'и в функцию, в которой происходит только их запись в буфер?
И какие Vertex Data Flags использовать?
ENAleksey
> Т.е. мне нужно в структуру вершины добавить ещё 2 вектора - tangent и binormal.
> А между pVertexBuffer->Lock и pVertexBuffer->Unlock проводить их расчёт?
Тот кусок, что ты привел - только читает текстурные координаты из буфера (D3DLOCK_READONLY), а не пишет данные в буфер.
Так что однозначно не тут.
MrShoor
> И какие Vertex Data Flags использовать?
А, да, еще у тебя скорее всего не подойдет твой шейдер:
float3 vInNormalOS : NORMAL, float3 vInBinormalOS : BINORMAL, float3 vInTangentOS : TANGENT
Он рассчитан на использование IDirect3DDevice9::SetVertexDeclaration, а судя по комментарию в коде ( // Warcraft3 FVF ) в W3 используется IDirect3DDevice9::SetFVF. Так что в шейдере надо будет поменять семантику на текстурные координаты, но лучше уйти на использование IDirect3DDevice9::SetVertexDeclaration
А еще можно попробовать посчитать TBN basis в скринспейсе. Вон тут как раз в соседней теме подкинули решение: http://www.gamedev.ru/code/forum/?id=205849#m4
А убрать неподходящие флаги и вместо чтения из буфера записывать в него данные не получиться?
Доступ к буферу вершин получаю через IDirect3DDevice9::ProcessVertices.
А как перейти на использование SetVertexDeclaration вместо SetFVF?
ENAleksey
> А убрать неподходящие флаги и вместо чтения из буфера записывать в него данные не получиться?
нет
> А как перейти на использование SetVertexDeclaration вместо SetFVF?
гугл в помощь
Ну, уже получается, осталось сделать чтение координат вершин, текстурных координат и нормалей из стандартного буфера вершин.
Вот, что получилось на примере кубика (скриншот из Warcraft'а):
Тема в архиве.
Тема закрыта.