Най-добра 2D интеграция с Direct3D 10?

Имам приложение, което до този момент е предимно DirectX 10 3D графика. Сега искаме да генерираме няколко 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
Ако разбирам правилно вашия случай на използване, най-добрият ви залог би бил да зададете стойности на тексел директно в текстурата и след това да изобразите текстуриран квадрат. Трябва да създадете своята текстура с флага D3D10_USAGE_DYNAMIC, за да посочите, че ще пишете в нея с процесора и след това, когато трябва да пишете в нея, извиквате ID3D10Texture2D::Map() с флага D3D10_MAP_WRITE. Това ви дава указател към данните за субресурса на текстурата и можете да зададете стойности на тексел директно за стойностите, които трябва да актуализирате. След това можете да извикате Unmap() и да изобразите вашия текстуриран квадрат. - person mattnewport; 14.09.2011

Отговорът на вашия въпрос е Textured 2D quads

Просто създайте вертекс шейдър със следните върхове:

(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