Я не знаю, как это делают 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