У меня есть небольшая загадка, которая просто ставит меня в тупик. Допустим, у меня есть пара шейдеров с разными типами вершин, например:
// light shader
struct vertexInputType
{
float4 position : POSITION;
float2 tex : TEXCOORD0;
float3 normal : NORMAL;
};
// color shader
struct vertexInputType
{
float4 position : POSITION;
float4 color : COLOR;
};
// bump mapping shader
struct vertexInputType
{
float4 position : POSITION;
float2 tex : TEXCOORD0;
float3 normal : NORMAL;
float3 binormal : BINORMAL;
float3 tangent : TANGENT;
};
Теперь предположим, что у меня есть модель со всеми доступными данными. Я не могу точно, чтобы все это было в одном буфере и отображалось со всеми тремя, как я выбираю, потому что данные не размещены правильно для всех из них. Я вижу только два варианта сделать это возможным, оба одинаково болезненные.
1) я мог бы иметь большой буфер в оперативной памяти, в котором хранятся все данные, а затем при каждом вызове отрисовки я беру из объекта шейдера тип вершины и создаю новый буфер вершин с правильной информацией. Это, как вы можете видеть, будет УЖАСНО медленным.
or...
2) я мог бы создать несколько буферов ID3D11Buffers при инициализации модели, где один буфер имеет положение и цвет, другой имеет положение, texcoord и нормаль, один имеет положение, texcoord, нормаль, бинормаль и касательную, а также столько необходимых буферов для любых других типов вершин, для которых модель имеет информацию. Для сравнения, это стирает ваш доступный vram, что также делает это nogo.
Я не вижу другого способа сделать это. Как вы, другие ребята из d3d, делаете это?