Войти
ПрограммированиеФорумГрафика

[Решено] Перенос данных из одного буфера вершин в другой. (2 стр)

Страницы: 1 2 3 Следующая »
#15
19:17, 17 сен 2015

ENAleksey
> над созданием мода для игры WarCraft 3
а позвольте задать вопрос: что за мод?

#16
19:21, 17 сен 2015

philosoph
http://www.gamedev.ru/code/forum/?id=204891#m3

#17
19:41, 17 сен 2015

ENAleksey
А вы знаете толк в извращениях.  С одной стороны мысль достаточно занятная. С другой же это всё(мне) напоминает костыли для костылей для костылей. Я люблю war3. Но вот сколько переизданий под hd/directx9 не видел, всё это выглядит откровенно плохо за счёт низкополигональных моделей. К примеру, взять тех же третих героев HD) А если всё это мутить ещё и с моделями, то стоит ли овчинка выделки?
Но таки за проектом буду следить)

#18
19:44, 17 сен 2015

float3 vInBinormalOS : BINORMAL,
                        float3 vInTangentOS  : TANGENT )

А ты уверен что W3 передает в шейдер тангент и бинормаль?

Тему не читай, на нульпост отвечай....

Можно ли всё это сделать, если есть доступ к буферу вершин и индексов, к переменным baseVertexIndex, minIndex, startIndex, numVertices и primCount? Или я не так понял способ расчёта Tangent и Binormal. Может есть другой способ?

Можно. Буфер вершин - указатель на массив вершин. Саму структуру буфера можно получить когда приложение вызывае: IDirect3DDevice9::SetFVF или IDirect3DDevice9::SetVertexDeclaration. Тебе всего лишь надо будет подменить буфер на свой, и установить свой FVF/VertexDeclaration

#19
19:56, 17 сен 2015

Кстати, вот видео (tangent space не используется):

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

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

"Очень жаль, что до меня этого никто не сделал. Здесь нет ничего сложного, можно было спокойно реализовать поддержку Direct3D9 ещё в 2004 году. Тогда это было бы очень актуально, а сейчас картостроение стремительно угасает, уступает место полноценному gamedev'у. Конечно, это к лучшему, я и сам очень хочу наконец продолжить разработку игры, но у меня уже столько сделано в варкрафте... Я не люблю останавливаться на полпути, я должен довести дело до конца!"

#20
20:13, 17 сен 2015

ENAleksey
> я должен довести дело до конца
Всё это замечательно. А в какой срок вы собираетесь оное закончить?  Ваш энтузиазм по оживлению этой игры впечатляет)
ENAleksey
> я и сам очень хочу наконец продолжить разработку игры
вы ещё какую то игру делаете?

#21
20:37, 17 сен 2015

philosoph
Максимум ещё два года буду делать, если к этому времени ничего не выйдет, то перейду к разработке полноценной игры.
philosoph
> вы ещё какую то игру делаете?
Уже 6 лет (но только у себя в голове). Очень давно хотел сделать rpg карту для варкрафта с крутым сюжетом и управлением на стрелочках :) Со временем понял, что всё, что я задумал реализовать невозможно и решил сделать игру на Unity3d, даже забросил варкрафт (правда только на две недели), но
> у меня уже столько сделано в варкрафте...
А дальше я наткнулся на мод Nirvana для варкрафта, где автор реализовал Normal Mapping, Shadow Volumes и различные пост процессы. И я решил продолжить его дело.

За эти годы скопилось достаточно идей для хорошей rpg игры, каждую из которых я тщательно продумывал, надеюсь, что получится что-то очень интересное.

#22
20:49, 17 сен 2015

ENAleksey
> Максимум ещё два года
жесть. Правда жесть. За такой срок как по мне, можно запилить если не полноценную игру, то достойную демоверсию.  Правда с определёнными знаниями в программировании и гд, но всё же...

#23
21:01, 17 сен 2015

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, а тратить время на них уже не хочется.

#24
18:19, 18 сен 2015

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 использовать?

#25
20:31, 18 сен 2015

ENAleksey
> Т.е. мне нужно в структуру вершины добавить ещё 2 вектора - tangent и binormal.
> А между pVertexBuffer->Lock и pVertexBuffer->Unlock проводить их расчёт?
Тот кусок, что ты привел - только читает текстурные координаты из буфера (D3DLOCK_READONLY), а не пишет данные в буфер.
Так что однозначно не тут.

#26
20:39, 18 сен 2015

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

#27
20:59, 18 сен 2015

А убрать неподходящие флаги и вместо чтения из буфера записывать в него данные не получиться?
Доступ к буферу вершин получаю через IDirect3DDevice9::ProcessVertices.
А как перейти на использование SetVertexDeclaration вместо SetFVF?

#28
21:41, 18 сен 2015

ENAleksey
> А убрать неподходящие флаги и вместо чтения из буфера записывать в него данные не получиться?
нет

> А как перейти на использование SetVertexDeclaration вместо SetFVF?
гугл в помощь

#29
11:12, 19 сен 2015

Ну, уже получается, осталось сделать чтение координат вершин, текстурных координат и нормалей из стандартного буфера вершин.
Вот, что получилось на примере кубика (скриншот из Warcraft'а):

+ Показать
Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

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

Тема закрыта.