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

[D3D9] Skinning

Страницы: 1 2 Следующая »
#0
13:01, 10 июня 2016

Всем привет,

Я адаптирую под себя скининг из примеров DirectX9 SDK, планирую временно использовать Animation Controller для бленда анимаций, пока нет времени писать как положено. Но не в том суть. У меня вопрос по Vertex Declaration. Вот так выглядит стандартный шейдер:

struct vertexInput 
{
float3 position      : POSITION;
float4 BlendWeights      : BLENDWEIGHT;
float4 BlendIndices        : BLENDINDICES;
float3 normal      : NORMAL;
float2 texCoordDiffuse  : TEXCOORD0;
};

а вот так к нему объясвление вершин (стандартное из D3D Mesh вытащил)

  D3DVERTEXELEMENT9 VERTEX_DECL[] =
  {
    { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
    { 0, 12, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT, 0 },
    { 0, 16, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0 },
    { 0, 20, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },
    { 0, 32, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },

    D3DDECL_END()
  };

Собственно у меня косяк в том, как я интерпретирую в шейдере данные скиннига из VB. Оба вес и индекс имеют размер 4 байта, по 1 байту на элемент (127 значений на индекс кости вроде нормально, а вот нормально ли для веса - не знаю, но посмотрел, вроде бы в D3D10 столько же - DXGI_FORMAT_R8G8B8A8_UNORM). А в шейдере у нас это float4.

D3DCOLORtoUBYTE4 вытаскивает индекс вроде бы нормально, но что-то вот с весами не так. Мне не хватает тут теоретической части. Все ли с размерами данных нормально?


#1
13:10, 10 июня 2016

А в моделе дварфа из Nvidia SDK вес имеет размер 8 байт, FLOAT2. От чего это зависит и как с этим работать?

Правка: а там 6 индексов в вершине, а у меня шейдер только на 4-е.

#2
13:26, 10 июня 2016

чувак, что за хрень у тебя в d3dvertexelement?
сделай 1 в 1 с vertexInput, с какого у тебя float4 в vertexInput, но D3DDECLTYPE_FLOAT1 в декларации?

#3
14:19, 10 июня 2016

Osiris
> 127 значений на индекс кости вроде нормально
255, использовать нужно UBYTE, ну и так-же исправление отMephisto std:

{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
    { 0, 12, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT, 0 },
    { 0, 16, D3DDECLTYPE_UBYTE4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0 },
    { 0, 20, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },
    { 0, 32, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
#4
14:56, 10 июня 2016

Mephisto std
> чувак, что за хрень у тебя в d3dvertexelement?
> сделай 1 в 1 с vertexInput, с какого у тебя float4 в vertexInput, но
> D3DDECLTYPE_FLOAT1 в декларации?
Это не у меня, это в примере, и мало того это в вершине! То есть я выдираю данные из меша и у меня там инфа на 4 и 4 байта, у меня при старом экспорте было float4 и там и там. Но на индексы видимо оверкилл float4.

#5
14:57, 10 июня 2016

Andrey
> 255, использовать нужно UBYTE, ну и так-же исправление отMephisto std
а в шейдере мне как UBYTE4 представление писать?

#6
14:59, 10 июня 2016

Osiris
> а в шейдере мне как UBYTE4 представление писать?
Подойдет struct vertexInput  из 0-поста.

#7
15:47, 10 июня 2016

Andrey
> Подойдет struct vertexInput из 0-поста.
Ок, ща попробую веса во float4 перегнать.

#8
16:54, 10 июня 2016

Osiris
> Ок, ща попробую веса во float4 перегнать.
Зачееем?

#9
10:03, 11 июня 2016

В d3d9 декларация описывает структуру твоей вершины, а не входы шейдера. Связывание происходит по семантикам, при этом данные конвертируются автоматически.

#10
14:52, 11 июня 2016

Andrey
> { 0, 12, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT, 0 },
> { 0, 16, D3DDECLTYPE_UBYTE4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0 },
> 12
> 16
> FLOAT4
Классно подсказал. UBYTE4N тогда уж.

#11
18:38, 11 июня 2016

Delfigamer
> UBYTE4N тогда уж
для индексов используется числа, зачем тут нормализованный тип?

#12
18:48, 11 июня 2016

Andrey
А я индексы и не трогал.

+ Показать

А вообще, правильный вариант - это offsetof.
#13
20:59, 11 июня 2016

Delfigamer
>А я индексы и не трогал.
точно! проглядел, каюсь.
>это offsetof
Да, тем более определен в ANSI C
Osiris
вот правильная декларация:
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
    { 0, 12, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT, 0 },
    { 0, 28, D3DDECLTYPE_UBYTE4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0 },
    { 0, 32, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },
    { 0, 44, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },

#14
12:20, 13 июня 2016

Osiris
> Зачееем?
А они у меня скачут то 1 байт то 2 по размеру, не получается заставить работать пока, я думаю потом оптимизировать буду, сначала надо запустить.

Andrey
Delfigamer
Понял, спасибо, попробую.

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

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