Как рендерятся такие программы, как Photoshop?

Просто небольшой вопрос о структуре обычного коммерческого программного обеспечения для редактирования, такого как Photoshop или Sony Vegas:

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

Я хорошо знаком с такими библиотеками, как OpenGL и DirectX для 2D- и 3D-рендеринга. Я также знаю, что многое можно сделать с помощью программного рендеринга (встроенная графика). Но какой вариант используют эти программы?

Я знаю, что в Photoshop есть возможность рендеринга с ускорением на графическом процессоре. Это означает, что они должны были написать код рендеринга два раза, один раз для программного рендеринга, а другой для рендеринга с помощью графического процессора. Это даже не принимая во внимание тот факт, что DirectX лучше использовать на Windows-машинах, а OpenGL совместим с другими операционными системами.

Действительно ли разработчики этих приложений тратят время на переписывание графического кода для всех этих возможностей, или используется какая-то библиотека/более простое преобразование?

Спасибо!


person user1483552    schedule 14.06.2016    source источник
comment
Photoshop использует встроенный в ОС пользовательский интерфейс, обычно оптимизированный в зависимости от доступности оборудования. Опция ускорения графического процессора предназначена для обработки изображений, которая сильно ускоряется за счет параллельных вычислений графического процессора.   -  person j-p    schedule 14.06.2016
comment
Программный рендеринг и встроенные графические чипы — это не одно и то же. Даже не близко.   -  person Nicol Bolas    schedule 14.06.2016


Ответы (1)


Я не знаю, как это делают Photoshop и Vegas; Но там, где я работаю, мы разработали несколько независимых от ОС приложений для работы с изображениями. Существуют фреймворки, которые утверждают, что они независимы от системы для помощи в рисовании графики, Qt, Firemonkey — два, которые я использовал. Но это большая проблема, так как вам все еще нужно везде включать код или директивы компилятора, чтобы различать, на какой ОС вы работаете. Существует всего несколько примитивов рисования, общих для всех графических приложений.

Для 2D-приложений, если вы можете рисовать линии, вы также можете рисовать кривые с помощью собственной библиотеки. Если вы можете заполнять многоугольники, то вы также можете заполнять кривые. Кроме того, если вы можете рисовать линии и заполнять многоугольники, то вы также можете рисовать в 3D. Поскольку существует такой небольшой набор этих примитивов, вы можете создать свой собственный объект графического контекста (ООП), который может выполнять все эти функции. Этот графический контекст может (как вы сказали) переключаться между использованием DirectX, GDI, OpenGL, Metal, Vulkan или вашего собственного программного рендерера.

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

Единственное место, где этот метод создания собственного графического контекста не работает так хорошо, — это когда речь идет об определенных функциях видеокарты, таких как сглаживание или программирование шейдеров. Из-за дополнительной работы я никогда не пытался программировать эти функции самостоятельно. Вот почему в 3D-программах, таких как Maya, 3d Studio Max, Blender и т. д., окно просмотра всегда выглядит лучше, если оно не настроено на программный рендеринг. Большинство графических программистов любят полагаться на свои графические API.

Подводя итог:

Если вы можете рисовать линии, заполнять полигоны и иметь доступ к пиксельным данным независимо от ОС, то вы можете самостоятельно программировать 80% графики. Эти функции могут быть инкапсулированы в вашу собственную библиотеку, которая может отображать эти примитивы по-разному в разных системах.

person Community    schedule 21.06.2016