Лучшая интеграция 2D с Direct3D 10?

У меня есть приложение, которое на данный момент в основном представляет собой 3D-графику DirectX 10. Теперь мы хотим создать несколько 2D-изображений в реальном времени для отображения на части экрана. 2D-графика будет генерироваться с использованием необработанных данных, поступающих от внешнего оборудования — каждое значение будет преобразовано в цвет и положение пикселя.

Я просмотрел варианты интеграции с Direct2D, но я не вижу простого способа рисовать на поверхности попиксельно, а просто использую обычные линии и формы.

Я считаю, что это также можно было бы сделать с помощью только Direct3D (без использования Direct2D) и просто иметь простую вершину для каждого пикселя и рисовать ее в ортогональном виде.

Повышает ли вообще использование Direct2D эффективность при создании 2D-графики в реальном времени? Я не хочу использовать инструменты формы, так что это не очень выгодно для меня. Существуют ли какие-либо другие распространенные методы создания 2D-графики в приложении Direct3D, которые будут работать лучше?

Любые указатели будут очень признательны. Спасибо.


person Tim Coolman    schedule 07.09.2011    source источник


Ответы (2)


Обычный подход к рисованию 2D-графики (UI и т. д.) в приложении D3D заключается в том, чтобы хранить любые данные растрового изображения, которые вам нужны, в текстурах и рисовать текстурированные 2D-квадраты для их отображения. Это дает вам бесплатное аппаратное ускорение масштабирования, поворота, фильтрации и т. д.

Если вы хотите воспроизвести ваши исходные изображения с точностью до пикселя, вам нужно убедиться, что вы принимаете во внимание разрешение экрана и рисуете свои четырехугольники с правильным положением вершин. Это проще сделать в Direct3D 10 чем в Direct3D 9 .

person mattnewport    schedule 13.09.2011
comment
Спасибо за ваши комментарии. Я все еще ищу более точное объяснение того, как рисовать 2D-текстуру. Например, поскольку я хочу рисовать, задавая цвета попиксельно, моя первая мысль — создать простую вершину для каждого пикселя, загрузить их в буфер вершин, а затем нарисовать буфер в текстуру как D3D10_PRIMITIVE_TOPOLOGY_POINTLIST. Я бы использовал ортогональную перспективу и рисовал бы текстуру, размер которой соответствует количеству вершин, которые я рисую. Похоже ли это на подходящий подход к рисованию? - person Tim Coolman; 14.09.2011
comment
Если я правильно понимаю ваш вариант использования, лучше всего будет установить значения texel непосредственно в текстуре, а затем отобразить текстурированный четырехугольник. Вам нужно создать свою текстуру с флагом D3D10_USAGE_DYNAMIC, чтобы указать, что вы будете писать в нее с помощью ЦП, а затем, когда вам нужно записать в нее, вы вызываете ID3D10Texture2D::Map() с флагом D3D10_MAP_WRITE. Это дает вам указатель на данные подресурса текстуры, и вы можете установить значения texel непосредственно для значений, которые вам нужно обновить. Затем вы можете вызвать Unmap() и визуализировать свой текстурированный четырехугольник. - person mattnewport; 14.09.2011

Ответ на ваш вопрос: Текстурированные 2D-квадроциклы.

Просто создайте вершинный шейдер со следующими вершинами:

(0.0f, 0.0f, 0.0f, 0.0f, 1.0f),
(0.0f, 1.0f, 0.0f, 0.0f, 0.0f),
(1.0f, 1.0f, 0.0f, 1.0f, 0.0f),
(1.0f, 0.0f, 0.0f, 1.0f, 1.0f)

Компоновка вершин (положение x, положение y, положение z, координата текстуры x, координата текстуры y).

И соответствующий индексный буфер.

Затем просто привяжите соответствующую текстуру в качестве ресурса шейдера и матрицу для перемещения/вращения/масштабирования четырехугольника по своему усмотрению. В вершинном шейдере преобразуйте положение вершин с помощью матрицы, а в пиксельном шейдере выберите ресурс шейдера, объединяющий текстуру.

Если вы хотите обновить текстуру, просто Map() ее, обновите любые пиксели, которые вы хотите, Unmap() и снова привяжите ее к пиксельному шейдеру.

person Tiago Costa    schedule 02.10.2011