Иногда я использую векторную графику, просто потому что в некоторых случаях она выглядит немного лучше, а в других случаях я использую растровую / растровую графику.
Мне было интересно, есть ли существенные различия в производительности между этими двумя вариантами?
texture
bitmap-graphics
vector-graphics
performance
Этан Бирляйн
источник
источник
Ответы:
Как сказал 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, чтобы показать, насколько это просто:
Оба эти метода очень быстрые и немного стирают грань между векторной и растеризованной графикой. Они визуализируются с использованием методов растеризации, но имеют свойства масштабирования / масштабирования, такие как методы векторной графики.
источник
Там может быть.
Менее технический ответ:
Если вы создаете веб-сайт или другое приложение, в котором у вас нет ничего общего с графическим программированием, то ответ, вероятно, да. Базовые API будут пытаться угадать, как их визуализировать и эффективно их кэшировать. Тем не менее, поскольку ваше приложение работает, а API иногда неправильно угадывает, ему, возможно, придется заново визуализировать вещи и повлиять на производительность.
Более технический:
Имейте в виду, что если вы не используете один из новейших графических процессоров и библиотеку для рисования векторных контуров на графическом процессоре, тогда все растровые текстуры визуализируются графическим процессором.
Я рассмотрю типичный случай, когда векторная графика отображается в текстурах. Здесь производительность будет зависеть от вашей цепочки инструментов, от того, будет ли ваше приложение динамически создавать текстуры из векторных ресурсов, и от того, просматривается ли графика с различными уровнями масштабирования. Здесь есть две проблемы: ресурсы и генерация текстур. Если вы отображаете графику только в статическом размере, я бы сказал, что нет никакой разницы, и, возможно, ваш инструментарий может преобразовать ресурсы в растровую графику до выполнения. Однако, если они отображаются в различных размерах или в трехмерном мире, вам понадобятся текстуры с mip-отображением, которые занимают больше памяти. Они заберут много памяти, если вы действительно хотите увидеть их точность «ближе» с увеличенной текстурой.
Надеюсь, это поможет.
источник
Есть несколько способов рендеринга векторной графики. Как упоминает TheBuzzSaw, NVIDIA имеет расширение, которое может довольно быстро отображать общие пути (но, конечно, оно работает только на графических процессорах NVIDIA). А Алан Вулф упоминает неявные методы поверхности (Loop-Blinn / поля расстояния), которые определяют функцию, которая сообщает, находитесь ли вы внутри или вне фигуры, и окрашивает пиксели на основе этой функции. Другим методом является трафарет и покрытие, в котором вы отображаете путь в буфер трафарета и используете четное-нечетное число, чтобы определить, охватывает ли путь пиксель.
В целом, однако, компромисс заключается в том, что растр рендеринга будет быстрее, но более восприимчив к псевдонимам (даже поля расстояний разрушаются на низких и высоких масштабах). Рендеринг путей требует большой настройки, но теоретически может быть масштабирован до любого разрешения.
источник