Хорошо, так что после некоторого эксперимента с подсказкой Spektre, я думаю, у меня есть решение.
Я решил представить форму в виде:
struct Shape {
enum Kind : byte {
LineRect,
FillRect,
...
}
float2 position, extent;
uint color;
Kind kind;
}
Вершина шейдер получает эту структуру и передает всю вещь вместе с проекционной матрицей геометрическому шейдеру для генерации вершин. Геометрический шейдер включает kind
и выдает вершины для формы, умножая каждую вершину на матрицу проекции.
Этот формат требует 21 байт (float
+ float
+ float
+ float
+ uint
+ byte
) для представления прямых, окружностей, равнобедренных треугольников и, возможно, эллипсов. У меня есть основания полагать, что текстурированные канавы также возможны, когда color
делится на ushort[2]
для УФ-координат.