Как DirectX читает в вершинах?
Поэтому я просмотрел некоторые учебные пособия и ресурсы, такие как сама документация / справочник по 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 ответ
Вы должны убедиться, что структура 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;
};