Положение полей (позиция, нормаль и т. Д.) В вершине D3D9 - PullRequest
5 голосов
/ 04 октября 2009

Я пытаюсь прочитать 3D-модели, созданные для приложений DirectX, которые определены следующим образом:

  • В заголовке файла указан Гибкий вершинный формат (FVF) сетки (на самом деле, у меня есть любые комбинации D3DFVF_ {XYZ, DIFFUSE, NORMAL, TEX1, TEX2} в проверенных мной сетках)
  • Затем n вершины задаются в линейном порядке, а поля представляются в соответствии с FVF.

Однако я не знаю порядок этих полей. Логика заключалась бы в том, что он определен где-то в документации DirectX, но я не смог его найти. Например, какая из этих двух структур верна с FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_NORMAL (синтаксис C, но эта проблема относится к каждому языку)?

// This one ?
struct vertex1
{
    D3DVERTEX pos;
    DWORD color;
    D3DVERTEX normal;
};

// Or this one ?
struct vertex2
{
    D3DVERTEX pos;
    D3DVERTEX normal;
    DWORD color;
};

Я хотел бы получить общий ответ на этот вопрос со всеми возможными полями (например, XYZ before DIFFUSE before NORMAL before TEX1 before TEX2). Указатель на правую страницу документации тоже подойдет, так как я не смог его найти :).

Ответы [ 3 ]

1 голос
/ 04 октября 2009

вот вы

FVF (OP говорит, что информация на этой странице неверна. Я не знаю, не проверял, правильное ли расположение FVF)

Генератор

1 голос
/ 02 мая 2012

Я столкнулся с тем же самым сам.

Я думаю, что порядок битов - требуемый порядок. Из d3d9types.h:

#define D3DFVF_RESERVED0        0x001
#define D3DFVF_POSITION_MASK    0x400E
#define D3DFVF_XYZ              0x002
#define D3DFVF_XYZRHW           0x004
#define D3DFVF_XYZB1            0x006
#define D3DFVF_XYZB2            0x008
#define D3DFVF_XYZB3            0x00a
#define D3DFVF_XYZB4            0x00c
#define D3DFVF_XYZB5            0x00e
#define D3DFVF_XYZW             0x4002

#define D3DFVF_NORMAL           0x010
#define D3DFVF_PSIZE            0x020
#define D3DFVF_DIFFUSE          0x040
#define D3DFVF_SPECULAR         0x080

#define D3DFVF_TEXCOUNT_MASK    0xf00
#define D3DFVF_TEXCOUNT_SHIFT   8
#define D3DFVF_TEX0             0x000
#define D3DFVF_TEX1             0x100
#define D3DFVF_TEX2             0x200
#define D3DFVF_TEX3             0x300
#define D3DFVF_TEX4             0x400
#define D3DFVF_TEX5             0x500
#define D3DFVF_TEX6             0x600
#define D3DFVF_TEX7             0x700
#define D3DFVF_TEX8             0x800

Я почти уверен, что заказ, который вы ищете:

ПОЛОЖЕНИЕ, NORMAL, PSIZE, DIFFUSE, Зеркальный, TEX0 [, TEXn ...]

Я не смог найти точного ответа и в документации.

1 голос
/ 04 октября 2009

Ну, вы должны определить это следующим образом.

struct EitherVertex
{
    float x, y, z;
    DWORD col;
    float nx, ny, nz
};

или

struct EitherVertex
{
    D3DXVECTOR3 pos;
    DWORD col;
    D3DXVECTOR3 nrm;
};

(D3DVERTEX относится ко всей структуре вершин, а не только к 3 элементам вектора)

Из ваших двух вариантов многое зависит от того, как вы получаете доступ к этим элементам vert. Если вы используете устаревший FVF, то второй из двух вариантов является более правильным.

Если, однако, вы используете декларации вершин, ВЫ определяете, где в структуре находятся соответствующие данные, а порядок не имеет значения.

...