Производительность векторной графики по сравнению с растровой или растровой графикой

20

Иногда я использую векторную графику, просто потому что в некоторых случаях она выглядит немного лучше, а в других случаях я использую растровую / растровую графику.

Мне было интересно, есть ли существенные различия в производительности между этими двумя вариантами?

Этан Бирляйн
источник
6
Действительно, это зависит от многих факторов. NVIDIA обеспечивает аппаратное ускорение для векторной графики. Вы видели это? developer.nvidia.com/nv-path-rendering-videos
TheBuzzSaw

Ответы:

15

Как сказал TheBuzzSaw, это зависит от многих вещей, включая реализацию растрированной графики по сравнению с векторной графикой.

Вот некоторые высокопроизводительные методы векторной графики, которые визуализируются с использованием традиционных методов растеризации.

Loop и Blinn показывают, как визуализировать квадратичную кривую Безье векторной графики, отрисовывая один треугольник и используя координаты текстуры в пиксельном шейдере, чтобы указать, находится ли пиксель над или под кривой: http: //www.msr-waypoint. сеть / EN-US / гм / люди / cloop / LoopBlinn05.pdf

Основная идея заключается в том, что вы устанавливаете свои угловые позиции треугольников в 3 позиции контрольной точки, а координаты текстуры в каждом углу задаете равными (0,0), (0,5,0) и (1,1) соответственно. В вашем шейдере, если интерполированная текстурная координата (x * xy) <0, пиксель находится под кривой, иначе он выше кривой.

Вы можете увидеть его ложную реализацию здесь: https://www.shadertoy.com/view/4tj3Dy

Что касается второго метода, вот метод от Valve, где расстояния до фигуры сохраняются в текстуре, а не в пиксельных данных, что позволяет рисовать векторную графику с использованием выборки текстуры. Декодирование настолько простое, что может быть реализовано даже на оборудовании с фиксированной функцией, используя только альфа-тест! http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf

Чтобы дать вам представление о том, насколько хорошо работает вторая техника, это изображение усов размером 1024x768 было сгенерировано из исходного изображения размером 64x32, которое имело один цветной канал! (иначе 2KB без сжатия)

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

Я также написал кое-что об этом в своем блоге: http://blog.demofox.org/2014/06/30/distance-field-textures/

Вот пример кода OpenCL, чтобы показать, насколько это просто:

float alpha = read_imagef(tex3dIn, g_textureSampler, textureCoords).w;
float3 color = (alpha < 0.5f) ? (float3)(1.0f) : (float3)(0.0f);

Оба эти метода очень быстрые и немного стирают грань между векторной и растеризованной графикой. Они визуализируются с использованием методов растеризации, но имеют свойства масштабирования / масштабирования, такие как методы векторной графики.

Алан Вульф
источник
1
См. Также valveoftware.com/publications/2007/…
интернет сделан из catz
да, это очень крутая техника, это вторая техника, которую я упомянул, и я также ссылаюсь на этот же PDF-файл выше.
Алан Вульф
Woops, пропустил это, извините.
интернет сделан из catz
1
Адаптивное решение для сглаживания краев полей расстояний можно найти здесь: essentialmath.com/blog/?p=151 .
Джим Ван Вер
8

Там может быть.

Менее технический ответ:

Если вы создаете веб-сайт или другое приложение, в котором у вас нет ничего общего с графическим программированием, то ответ, вероятно, да. Базовые API будут пытаться угадать, как их визуализировать и эффективно их кэшировать. Тем не менее, поскольку ваше приложение работает, а API иногда неправильно угадывает, ему, возможно, придется заново визуализировать вещи и повлиять на производительность.

Более технический:

Имейте в виду, что если вы не используете один из новейших графических процессоров и библиотеку для рисования векторных контуров на графическом процессоре, тогда все растровые текстуры визуализируются графическим процессором.

Я рассмотрю типичный случай, когда векторная графика отображается в текстурах. Здесь производительность будет зависеть от вашей цепочки инструментов, от того, будет ли ваше приложение динамически создавать текстуры из векторных ресурсов, и от того, просматривается ли графика с различными уровнями масштабирования. Здесь есть две проблемы: ресурсы и генерация текстур. Если вы отображаете графику только в статическом размере, я бы сказал, что нет никакой разницы, и, возможно, ваш инструментарий может преобразовать ресурсы в растровую графику до выполнения. Однако, если они отображаются в различных размерах или в трехмерном мире, вам понадобятся текстуры с mip-отображением, которые занимают больше памяти. Они заберут много памяти, если вы действительно хотите увидеть их точность «ближе» с увеличенной текстурой.

Надеюсь, это поможет.

ShaneC
источник
6

Есть несколько способов рендеринга векторной графики. Как упоминает TheBuzzSaw, NVIDIA имеет расширение, которое может довольно быстро отображать общие пути (но, конечно, оно работает только на графических процессорах NVIDIA). А Алан Вулф упоминает неявные методы поверхности (Loop-Blinn / поля расстояния), которые определяют функцию, которая сообщает, находитесь ли вы внутри или вне фигуры, и окрашивает пиксели на основе этой функции. Другим методом является трафарет и покрытие, в котором вы отображаете путь в буфер трафарета и используете четное-нечетное число, чтобы определить, охватывает ли путь пиксель.

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

Джим ван верт
источник