Сопоставление углов с произвольными позициями с помощью Direct2D

Я использую WIC и Direct2D (через SharpDX) для объединения фотографий в видеокадры. Для каждого кадра у меня есть точные координаты, где будет находиться каждый угол. В то время как сами фотографии имеют стандартное соотношение сторон (например, 4:3 или 16:9), точки вставки не являются такими — они могут быть повернуты, масштабированы и перекошены.

введите здесь описание изображения

Теперь я знаю, что в Direct2D я могу применять матричные преобразования для достижения этой цели... но я не совсем уверен, как это сделать. Примеры, которые я видел, больше касаются применения определенных преобразований (например, поворота на 30 градусов), чем попытки сопоставить точное место назначения.

Учитывая, что я знаю точные координаты (A, B, C, D) выше, есть ли простой способ сопоставить исходное изображение с целью? В качестве альтернативы, как бы я сгенерировал матрицу с учетом координат источника и пункта назначения?


person roufamatic    schedule 05.07.2012    source источник
comment
Мой первый порыв — спросить — почему Direct2D, а не Direct3D? Решение было бы столь же тривиальным, как рендеринг двух треугольников с вершинами (A, B, D) и (A, D, C). Кажется, Direct2D не может отображать примитивы таким образом.   -  person Ani    schedule 05.07.2012
comment
Я новичок во всем этом; поскольку я работаю только в двух измерениях, я наивно предположил, что это 2D. Если у вас есть ответ с Direct3D, я был бы очень рад. Хотя есть вероятность появления артефактов рендеринга по общей линии AD?   -  person roufamatic    schedule 05.07.2012
comment
Не должно быть никаких артефактов, если вы разделяете вершины и визуализируете их как индексированную сетку. Смотрите мой ответ ниже.   -  person Ani    schedule 05.07.2012


Ответы (2)


Если Direct3D является опцией, все, что вам нужно сделать, это визуализировать четырехугольник как два треугольника (с нанесенной на него текстурой лягушки).

Чтобы убедиться в отсутствии артефактов, визуализируйте четырехугольник как индексированный меш, как в примере здесь (обратите внимание, что у него общие вершины 0 и 2 в обоих треугольниках). Конечно, вы можете заменить фактические координаты вершин на A, B, C и D.

Для начала вы можете ознакомиться с этими учебными пособиями по SlimDX, превосходному набору привязок .NET к DirectX.

person Ani    schedule 05.07.2012

На самом деле этого невозможно добиться с помощью Direct2D. Это было бы возможно с Direct2D1.1 (из Win8 Metro) с пользовательским вершинным шейдером, но, в конце концов, как предполагает ananthonline, это будет намного проще сделать с Direct3D11.

Также вы можете использовать примитивы треугольной полосы, которые проще настроить (вам не нужно создавать индексный буфер). Для координат вы можете напрямую отправлять координаты в вершинный шейдер без каких-либо преобразований (вершинные шейдеры будут копировать ввод SV_POSITION непосредственно в пиксельный шейдер). Вам просто нужно сопоставить свои координаты с x [-1,1] и y [-1,1]. Я предлагаю вам начать с образца SharpDX MiniCubeTexture, изменить матрицу для выполнения ортонормированной проекции (вместо образца перспективы).

person xoofx    schedule 06.07.2012
comment
Спасибо за помощь. Я использовал Direct2D против WICRenderTarget для компоновки фотографий на фоновое изображение и сохранения в формате PNG. Как с помощью этой техники все скомпоновать и сохранить? Есть ли способ преобразовать преобразованную фотографию в растровое изображение Direct2D? - person roufamatic; 06.07.2012
comment
Вам нужно будет создать Direct2D.Bitmap с использованием DXGI.Surface (поверхность может быть запрошена из текстуры Direct3D с помощью texture.QueryInterface‹DXGI.Surface›();. Вам просто нужно один раз вызвать этот метод при создании текстуры Direct3D). ) и нарисуйте это растровое изображение Direct2D на WICRenderTarget. Но вы также можете считывать текстуру с графического процессора напрямую с помощью Direct3D и сохранять ее с помощью WIC без использования Direct2D. - person xoofx; 07.07.2012