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

[D3D9] Skinning (2 стр)

Страницы: 1 2
#15
16:54, 13 июня 2016

Теперь я точно уверен, что у меня проблемы с весами. Значит я отловил в дебаге один полигон, у которого:

Indeces:  v2  (34.000, 0.000, 0.000, 0.000)  float4
Wiegts:  v1  (0.000, 0.000, 0.502, 0.247)  float4

Я в коде вот так вытаскиваю их из 4-х байт:

// copy vertex blend weights info
void CXMeshManager::CopyVertexBlendWeight(byte *pStream, UINT uStreamSize, byte *pSource, UINT uVertexSize, LPD3DVERTEXELEMENT9 pDecElement)
{
  assert(uStreamSize == sizeof(AF_VECTOR4));
  AF_VECTOR4* pWeights = (AF_VECTOR4*)pStream;

  switch (pDecElement->Type)
  {
  // 4 bytes
  case D3DDECLTYPE_FLOAT1:
  {
    short buffer[4];

    buffer[0] = pSource[0];
    buffer[1] = pSource[1];
    buffer[2] = pSource[2];
    buffer[3] = pSource[3];

    // 4 weights
    pWeights->x = pSource[0] / 255.0f;
    pWeights->y = pSource[1] / 255.0f;
    pWeights->z = pSource[2] / 255.0f;
    pWeights->w = pSource[3] / 255.0f;

  }
  break;

  }
}

Но тут явно как-то не так порядок байт идет, так как в начале идут нули, а потом данные, если не делить для float то что-то вроде такого:

-    buffer  0x000000bed2e9cde8 {0, 0, 128, 63}  short[4]
    [0]  0  short
    [1]  0  short
    [2]  128  short
    [3]  63  short

Я пробовал менять местами от 3 до 0, вычитать из 1, не то все.


#16
17:17, 13 июня 2016

Блин, FLOAT1 это просто float? остальное все в нем, как я понял 0, 0, 1.

Сделал, да, экпорт из Х очень оптимизирован, он хранит веса до 4-х костей, если их только 2-а, то он хранит 1 float, а вес следующей 1 - вес предыдущей, как всегда.

Страницы: 1 2
ПрограммированиеФорумГрафика

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