Как рисовать большое количество объектов одинаковой геометрии?
Если делать все операции над матрицами объектов используя ЦП, вершинный шейдер может возвращать просто позицию вершины, верно?
Теперь я хочу производить все трансформации( в том числе просто умножения матрицы объекта на матрицу камеры и проекции), используя видеокарту, то есть шейдер.
Это значит что в Update() я должен для каждого объекта вызывать memcpy() передавая пустой constant buffer? Или вообще не вызывать memcpy?
Обновление
Тут мне уже уже немного объяснили
Как я сейчас понимаю:
Создаю constant buffer, в который помещаю данные каждой вершины. В вершинном шейдере я могу обратиться к constant buffer вот так:
cbuffer ConstantBuffer : register(b0)
{
//Элементы
}
Я хочу просто отображать много кубов с возможностью перемещения. Сейчас я делаю все трансформации с матрицами с помощью ЦП и при 10к кубов лагает(пару фпс). Я думал передать в constant buffer ViewMatrix и ProjectionMatrix, а в качестве аргумента в функцию шейдера передавать координату вершины, и там всё перемножать.
Я не понимаю как передавать координату вершины в качестве аргумента функции шейдера. Насколько я понимаю, по умолчанию туда всегда передаётся то ли 0 то ли все 1(координаты вершины). Как раз для этого(если я понял правильно), нужен InstanceBuffer, в придачу к ConstantBuffer(но в это я пока не въехал).
Текущая проблема:
Сейчас мой ConstantBuffer это
cbuffer ConstantBuffer : register(b0)
{
float4x4 viewMat;
float4x4 projMat;
float4x4 posMat;
}
А функция шейдера
VS_OUTPUT main(VS_INPUT input)
{
VS_OUTPUT output;
output.pos=mul(input.pos,mul(posMat,mul(viewMat,projMat)));
output.color=input.color;
return output;
}
Где VS_INPUT И VS_OUTPUT содержат два float4 позиции и цвета.
И проблема в том что ничего не рисуется. Сейчас пытаюсь решить это.
Вопрос: как эффективно рисовать большое количество объектов одинаковой геометрии используя шейдеры?