Как DirectX читает в вершинах? - PullRequest
1 голос
/ 29 декабря 2011

Итак, я просмотрел некоторые учебные пособия и ресурсы, такие как Документация / Справочник DirectX, и либо что-то пропустил, либо я действительно не могу найти ответ на свой вопрос.

Вопрос, как указано в заголовке: Как DirectX читает в вершинах в буфере вершин?

Я понял, конечно, что вы должны предоставить один или несколько кодов FVF. Но нигде не сказано, как правильно настроить структуру Vertex. Единственное, что я могу себе представить, это то, что DirectX проверяет флаги на линейной «временной шкале», поэтому один флаг, который может требовать одинаковых типов данных и порядков, должен стоять на первом месте в структуре.

В качестве небольшого примера того, что я имею в виду:

struct MyVertex {
    float x, y, z;
    float nx, ny, ny;
};

! =

struct MyVertex {
    float nx, ny, nz;
    float x, y, z;
};

с кодами FVF:

D3DFVF_XYZ | D3DFVF_NORMAL

и nx, ny, nz, представляющие трехмерные координаты нормальной вершины.

Любая помощь по правильной настройке структуры вершин приветствуется ...

С уважением,

Derija

1 Ответ

1 голос
/ 03 января 2012

Необходимо убедиться, что структура C ++ и HLSL соответствует порядку, в котором она была указана в формате вершины (если вы указали XYZ, а затем Normal, ваша структура должна соответствовать этому), тогда вам нужно использовать device-> CreateBufferчтобы создать буфер вершин из массива структур вершин, после чего массивы структур вершин могут быть освобождены и освобождены, так как DirectX оттуда будет управлять данными буфера независимо, чтобы изменить данные в цикле рендеринга, буфер должен быть доступен для записии может быть обновлено после создания с использованием ID3D10Buffer Map и Unmap.

MSDN:
Создать Vertexbufferm http://msdn.microsoft.com/en-us/library/windows/desktop/bb173544(v=vs.85).aspx Буфер: http://msdn.microsoft.com/en-us/library/windows/desktop/bb173510(v=vs.85).aspx

Например: C ++

D3D10_INPUT_ELEMENT_DESC layoutPosTexNormCInstanced[] = 
{
{"POSITION",     0, DXGI_FORMAT_R32G32B32_FLOAT,    0,  0, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD",     0, DXGI_FORMAT_R32G32_FLOAT,       0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"NORMAL",       0, DXGI_FORMAT_R32G32B32_FLOAT,    0, 20, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"TANGENT",      0, DXGI_FORMAT_R32G32B32_FLOAT,    0, 32, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"BINORMAL",     0, DXGI_FORMAT_R32G32B32_FLOAT,    0, 44, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"BLENDINDICES", 0, DXGI_FORMAT_R8G8B8A8_SINT,      0, 56, D3D10_INPUT_PER_VERTEX_DATA, 0 }, //4
{"mTransform",   0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1,  0, D3D10_INPUT_PER_INSTANCE_DATA, 1 },
    {"mTransform",   1, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 16, D3D10_INPUT_PER_INSTANCE_DATA, 1 },
    {"mTransform",   2, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 32, D3D10_INPUT_PER_INSTANCE_DATA, 1 },
    {"mTransform",   3, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 48, D3D10_INPUT_PER_INSTANCE_DATA, 1 },
};


//Contains the position, texture coordinate and normal for lighting calculations.
struct DX10VertexNormal
{
//Constructor.
DX10VertexNormal()
{
    ZeroMemory(this, sizeof(DX10VertexNormal));
    boneIndex[0] = -1;
    boneIndex[1] = -1;
    boneIndex[2] = -1;
    boneIndex[3] = -1;
};

//PAD to 4.
D3DXVECTOR3 pos;
D3DXVECTOR2 tcoord;
D3DXVECTOR3 normal;
D3DXVECTOR3 tangent;
D3DXVECTOR3 binormal;
int boneIndex[4];

};

HLSL:

///Holds the vertex shader data for rendering 
///instanced mesh data, with position, texture coord, 
///and surface normal for lighting calculations.
struct VS_Instanced_PosTexNorm_INPUT
{
  float4 Pos: POSITION;
  float2 Tex: TEXCOORD;
  float3 Norm: NORMAL;
  float3 Tangent: TANGENT;
  float3 Binormal: BINORMAL;
  int4 boneIndex: BLENDINDICES;
  row_major float4x4 mTransform : mTransform;
  uint InstanceId : SV_InstanceID;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...