При помощи технологии OpenGL и библиотеки GLUT вы можете ускорить процесс обработки изображений, используя всю мощь видеоадаптера вашей системы.
Видеоигры в течение многих лет используют все возможности видеоадаптеров. Сегодня даже программные продукты, не работающие напрямую с графикой (такие, как Mathlab) начинают использовать возможность выполнения сложных математических расчетов при помощи видеоадаптера. Вы также можете использовать эту возможность.
В этой статье приводятся примеры использования шейдеров OpenGL для обработки изображений. Изображения выдаются устройством, использующим интерфейс Video4Linux (V4L2). Использование мощностей графического адаптера для проведения некоторых преобразований изображений позволяет снизить нагрузку на центральный процессор и должно в итоге привести к повышению производительности системы. В этой статье описывается программа Glutcam, разработанная автором статьи и технологии, использованные при разработке.
Программа Glutcam получает данные от устройства V4L2 и отправляет устройству с поддержкой технологии OpenGL для их обработки и вывода. Для ее использования вам будут необходимы следующие компоненты:
Устройство, совместимое с Video4Linux2 (V4L2)
Устройство, совместимое с OpenGL 2.0 (или более поздней версией)
Библиотека GLUT или библиотека FreeGLUT
Библиотека GLEW
Для начала давайте кратко рассмотрим отдельные технологии, а затем перейдем к рассмотрению программы Glutcam.
Устройства Video4Linux2
Video4Linux2 является интерфейсом, связывающим ядро Linux со многими видеоустройствами, включающими в себя тюнеры и некоторые вебкамеры. (Некоторые устройства все еще используют старую версию драйверов V4L1). Bill Dirks начал разработку API Video4Linux в 1998 году. Код был добавлен в ядро версии 2.5.46 в 2002 году. API V4L2 предоставляет функции для работы с устройствами, формирующими изображения. При помощи V4L2 приложение может открыть устройство, запросить информацию о его возможностях, установить параметры захвата изображения и выбрать выходной формат и метод обработки. Два аспекта очень важны для нас: метод обработки в выходной формат.
Под методом обработки понимается процесс доставки видеопотока от устройства захвата к пользовательскому приложению. Этот процесс менее банален, чем кажется на первый взгляд, потому что драйвер хранит данные в пространстве ядра, а пользовательское приложение - в пользовательском пространстве. Существуют два метода для осуществления доставки данных. Это интерфейс "чтения", при использовании которого для получения данных, производится чтение из файла устройства при помощи функции read() и интерфейс "поточной передачи".
Поскольку скорость является важным параметром, интерфейс поточной передачи предпочтителен, так как он значительно быстрее интерфейса чтения. Интерфейс чтения медленнее, так как при его использовании необходимо копировать все данные из пространства ядра в пространство пользователя. Интерфейс поточной передачи, с другой стороны, может исключить это копирование двумя способами: интерфейс может предоставить приложению из пространства пользователя доступ к буферам драйвера (процесс называется отображением в память) или приложение может предоставить драйверу доступ к буферам в пространстве пользователя (процесс называется вводом/выводом с использованием указателя пользователя). Это освобождает от дополнительной работы по копированию данных изображения каждый раз, когда они доступны. Недостатком интерфейса поточной передачи является сложность: каждый раз вам придется управлять множеством буферов вместо простого чтения из одного буфера при помощи функции read().
Как бы то ни было, использование сложного метода чтения данных стоит затраченного на его реализацию времени. Единственное значительное повышение производительности программы Glutcam было получено после перехода с интерфейса чтения на интерфейс поточной передачи.
Вторым важным моментом является выходной формат. Не все устройства могут предоставлять данные во всем диапазоне форматов. Некоторые из них используют внутренние алгоритмы ядра для преобразования данных из формата, предоставляемого устройством, в формат, запрошенный пользовательским приложением. Преобразование производится тогда, когда формат, запрошенный пользовательским приложением, не входит в список форматов, предоставляемых устройством. Драйвер ядра выполняет преобразование форматов, занимая при этом часть ресурсов центрального процессора. В качестве стратегии выбран перенос как можно большего количества этих операций на графический адаптер. Поэтому следует выбирать формат, при котором осуществляется минимальное количество операций в пространстве ядра.
Основными форматами являются оттенки серого, RGB и YUV. Оттенки серого и формат RGB знакомы всем. Формат YUV (иногда обозначается как YcbCr) отделяет информацию о яркости каждого пикселя (также называемую светимостью (luminance) и обозначаемую как Y) от информации о цвете (называемой хроматическими данными (chrominance) и обозначаемой как U и V). Формат YUV развивался во время усовершенствования черно-белого телевидения с целью передачи информации о цвете, при этом оставалась необходимость поддержания совместимости с приемниками черно-белого изображения. Существует семейство форматов YUV, главным отличием в котором является метод хранения информации о цвете. Стоит отметить, что человеческий глаз более восприимчив к информации о яркости пикселя, чем к информации о его цвете. Это означает, что яркость может задаваться для каждого пикселя в то время, как цвет может задаваться сразу для нескольких смежных пикселей - это является естественным методом компрессии. Наиболее используемые варианты формата включают в себя:
YUV444 (значения Y, U и V заданы для каждого пикселя)
YUV422 (значение Y задано для каждого пикселя, значения U и V заданы для смежных горизонтальных пикселей)
YUV420 (значение Y задано для каждого пикселя, значения U и V заданы для смежных горизонтальных и вертикальных пикселей)
Существует множество форматов, отличающихся способом хранения данных изображения в памяти. Одним из различий является метод хранения компонентов в "плоскостном" ("planar") или "упакованном' ("packed") виде. В форматах с компонентами, хранящимися в "плоскостном" виде, значения Y хранятся вместе, а после них следуют блоки значений U и V. В форматах с компонентами, хранящимися в "упакованном" виде, все значения хранятся вместе.
Программа Glutcam принимает формат RGB, оттенки серого, YUV420 с компонентами в "плоскостном" виде и YUV422 с компонентами в "упакованном" виде. Некоторые устройства поддерживают только формат JPEG; Glutcam не работает с JPEG.
OpenGL
Технология V4L2 позволяет получить данные; для вывода изображения мы будем использовать технологию OpenGL. Библиотека OpenGL для обработки графики в реальном времени была выпущена компанией SGI в 1992 году. Brian Paul выпустил библиотеку Mesa, предоставляющую API OpenGL в 1995 году. Mesa позволяла работать с функциями OpenGL в программном режиме. В 2000 году компания SGI выпустила прототип реализации OpenGL под свободной лицензией. В вашей системе должны быть программные компоненты для поддержки OpenGL или от проекта Mesa или вы можете получить их у производителя вашего видеоадаптера. Производители часто выпускают библиотеки для поддержки OpenGL, использующие их аппаратное обеспечение и позволяющие выполнять операции быстрее полностью программных решений. В 2006 году контроль над развитием API перешел к некоммерческому технологическому консорциуму Khronos Group. Сегодня вы можете встретить реализацию OpenGL во всех устройствах, начиная с суперкомпьютеров и заканчивая мобильными телефонами.
OpenGL предоставляет два метода обработки данных: метод обработки фрагментов и метод обработки пикселей. Метод обработки фрагментов является наиболее известным. Вы предоставляете информацию о освещении, цветах, геометрии и текстурах, после чего OpenGL генерирует изображение. Вторым является метод обработки пикселей. Метод начинает работу с получения пикселей и текстур и позволяет вам оперировать ими для генерации изображения. Необязательной частью OpenGL является расширение ARB Imaging Subset, добавляющее некоторые часто используемые операции по обработке изображений. Даже без этого расширения OpenGL содержит множество встроенных функций для изменения размеров, деформирования, вращения, совмещения изображений и оверлеев. OpenGL также содержит компилятор и окружение времени выполнения для шейдеров, разработанных с применением языка GLSL. Это обстоятельство заставляет нас рассмотреть следующий компонент: шейдеры.
Шейдер представляет собой небольшую программу, которая выполняется (в идеальном случае полностью) компонентами видеоадаптера. Компания Microsoft разработала для шейдеров язык High Level Shader Language (HLSL). Компания Nvidia выпустила язык Cg (C for Graphics) в 2002 году. OpenGL использует для шейдеров язык GLSL (OpenGL Shading Language). С помощью шейдеров могут решаться два вопроса:
Где рисовать (вершинный шейдер)
Какого цвета должна быть эта часть изображения (фрагментный шейдер)
Эта статья описывает фрагментные шейдеры GLSL.
Программы шейдеров позволяют внести изменения в "конвейер фиксированной функциональности" ("fixed functionality pipeline") OpenGL. Фрагментные шейдеры получают исходные данные в виде текстур OpenGL и переменных шейдера (Рисунок 1). Язык шейдеров имеет синтаксис, похожий на синтаксис языка C с аналогичными базовыми типами и структурами, задаваемыми пользователем.
Рисунок 1. Программы фрагментных шейдеров
Фрагментный шейдер на языке GLSL выглядит примерно следующим образом:
void main(void)
{
// Присваивание значения переменной gl_FragColor устанавливает
// цвет текущей части изображения. Эта функция устанавливает
// красный цвет без прозрачности. Аргументы функции vec4 являются
// компонентами цвета (красный, зеленый, синий, альфа-канал).
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
GLSL является языком C с добавленной поддержкой векторов и типом для доступа к текстурам. Текстуры читаются при помощи типов с названиями, содержащими "Sampler". Так как Glutcam использует двумерные массивы, мы будем использовать тип Sampler2D.
Перенос функций программы на OpenGL и шейдеры имеет ряд преимуществ, таких, как:
Видеоадаптеры (обычно) более дешевы, чем центральные процессоры и их производительность возрастает быстрее, чем производительность процессоров.
Шейдеры могут повысить производительность системы путем сохранения мощностей центрального процессора для других задач.
Вам не нужно разрабатывать код для интерполяции значений между пикселями. Механизм текстур OpenGL сделает это для вас. Это особенно важно в том случае, когда размер вашего изображения на выходе должен отличаться от оригинального размера.
Многие алгоритмы обработки изображений соответствуют этой модели:
for y in height
for x in width
pixel(x, y) = something(input_image, x, y, ...);
end
end
Эта модель также отлично совмещается с OpenGL и механизмом шейдеров (об этом читайте ниже).
При реализации этой модели в рамках механизма работы с шейдерами, параметр input_image является текстурой. OpenGL и механизм шейдеров самостоятельно реализуют циклы. Ваш фрагментный шейдер должен просто выполнять функцию "something(input_image, x, y, ...)". Однако, стоит помнить о том, что в ходе итераций циклы не могут взаимодействовать друг с другом. С учетом этого ограничения итерации циклов могут исполняться параллельно: концептуально будет существовать несколько экземпляров вашей программы для формирования каждого пикселя на выходе (Рисунок 2).
Рисунок 2. Множество параллельно работающих фрагментных шейдеров
Наряду с преимуществами, данный процесс имеет ограничения. Ресурсы вашего видеоадаптера не безграничны, язык GLSL также имеет ограничения. Эти ограничения включают в себя следующие:
Массивы могут быть только одномерными: массивы из двух и более измерений должны быть развернуты.
Битовые поля и битовые операции не должны использоваться. (OpenGL 3 облегчает это ограничение.)
Указатели не должны использоваться.
Значения повышенной точности недоступны (ваш видеоадаптер может использовать 64- или 128-битные пиксели, но следует уточнить эту информацию перед использованием).
Операторы печати не должны использоваться. Вывод вашей программы должен представлять собой только цвет текущего пикселя.
Объем данных должен соответствовать возможностям карты. Если ваши текстуры имеют очень большой размер, вам необходимо разделить их и обработать по очереди или распределить их по нескольким видеоадаптерам.
Ваша программа должна исполняться в течение отведенного промежутка времени. Если ваша программа работает слишком медленно, частота кадров на выходе упадет.
Не все комбинации входных параметров позволяют использовать аппаратное ускорение. Старайтесь идти по пути использования аппаратного ускорения.
Если ваша программа не удовлетворяет этим условиям, она либо не скмпилируется, либо скомпилируется и будет частично использовать ресурсы центрального процессора вместо исключительного задействования ресурсов видеоадаптера.
Если ваша проблема выходит за рамки перечисленных параметров, попробуйте применить похожие методы, такие, как технология CUDA от Nvidia или новая технология Open Computing Language (OpenCL). Страница "The General Purpose Graphics Processor Unit (GPGPU)" также описывает некоторые доступные инструменты и техники.
Библиотеки OpenGL Utility Toolkit Library (GLUT) или FreeGLUT
По сути OpenGL является технологией, предназначенной исключительно для обработки и вывода изображения. Она не предоставляет средств для создания и размещения окон или для обработки событий от клавиатуры и мыши. Подсистема GLX вашего X-сервера предназначена для выполнения этих действий (обратитесь к руководству glXIntro для получения более подробной информации).
Библиотека GLUT предоставляет возможность использовать все эти функции и вы можете разрабатывать код с применением функций обратного вызова для таких задач, как отрисовка окна или обработка событий клавиатуры и мыши. Библиотека GLUT реализует все низкоуровневые функции. Она также позволяет без лишних сложностей реализовать меню. В дополнение к библиотеке GLUT существует библиотека FreeGLUT c более либеральной лицензией (термином GLUT в данной статье обозначаются обе библиотеки). Программа Glutcam использует библиотеку FreeGLUT для выполнения вышеназванных функций.
GLUT является одним из самых простых инструментов для создания графических интерфейсов с использованием OpenGL, но, конечно же, не единственным. Обратитесь к разделу для разработчиков на веб-сайте OpenGL для получения информации об аналогичных инструментах.
Поскольку в развитии технологии OpenGL принимает участие множество групп специалистов, новые возможности не появляются одновременно в разных реализациях. Большинство новых возможностей появляются в виде расширений, предложенных членами рецензионной коллегии в области архитектуры OpenGL (OpenGL Architecture Review Board). Все эти расширения исследуются и проверяются в работе, после чего некоторые из них принимаются большим количеством производителей. Некоторые расширения попадают в основную спецификацию OpenGL. Механизм расширений OpenGL позволяет вашей программе во время выполнения узнать о том, какие возможности поддерживаются вашей библиотекой OpenGL и где расположены эти функции. Библиотека GLEW выполняет эту работу. GLEW также лежит в основе программы glewinfo, которая выводит информацию об используемой реализации OpenGL и поддерживаемых ею возможностях.
Glutcam
Наконец мы добрались до программы Glutcam. Glutcam соединяет вывод устройства V4L2 с окном OpenGL и использует фрагментные шейдеры для обработки изображения (Рисунок 3). В идеальном случае нам должно удастся сохранить ресурсы центрального процессора, использовав видеоадаптер для выполнения всех операций уровня пикселей. Как минимум, видеоадаптер должен производить преобразование выходного формата камеры в формат RGB для вывода. Поскольку я хотел реализовать дополнительные возможности помимо преобразования цветового пространства, Glutcam также поддерживает операцию распознавания контуров объектов. Распознавание контуров является классической операцией обработки изображений. Вы можете использовать меню для указания того, с помощью какого устройства будет выполняться алгоритм распознавания контуров: центрального процессора или видеоадаптера. Вы можете сравнить результаты, сравнив частоту кадров, выводимую Glutcam, или загрузку центрального процессора, которую можно узнать при помощи команды top.
Рисунок 3. Путь данных от камеры до экрана
В благоприятном случае вы зададите такой выходной формат для устройства захвата изображения, с которым могут работать ваши шейдеры, после чего поместите данные изображения в одну или несколько текстур OpenGL. В процессе вывода изображения данные обрабатываются вашим фрагментным шейдером. Если вы не используете алгоритм распознавания контуров или выполняете его при помощи центрального процессора, шейдер производит преобразование изображения в формат RGB для вывода. Если вы выбрали распознавание контуров при помощи видеоадаптера, шейдер выполняет алгоритм и выводит результат.
Glutcam использует алгоритм распознавания контуров на основе преобразований Лапласа. При обработке с помощью центрального процессора данный алгоритм реализуется в виде свертывания с ядром:
-1 -1 -1
-1 8 -1
-1 -1 -1
То есть, вы вычисляете результирующее значение цвета для каждого пикселя, используя исходное значение цвета пикселя, умножая его на 8, затем вычитая значения цветов соседних пикселей. В тех местах, где пиксель имеет такой же цвет, как и у соседних пикселей, значение его цвета становится равным нулю (черный цвет). Таким образом, контуры (где цвета резко меняются) становятся выделенными. Места, где цвета изменяются медленно, затемняются. Ядра и свертывания являются рабочими лошадками в области обработки изображений. Вы можете использовать идентичный алгоритм и просто поменять значения ядра для получения множества эффектов, таких, как увеличение резкости, размытие границ и сглаживание.
В рамках шейдера этот процесс представляется в форме извлечения значения цвета пикселя из исходной текстуры, умножения его, затем вычитания из него значений цветов соседних элементов текстуры и вывода результата. Он больше похож на простое алгебраическое действие, но в итоге получается аналогичный результат.
Перед тем, как приступить к компиляции Glutcam, стоит удостовериться в том, что программные компоненты FreeGLUT/GLUT, GLEW, OpenGL 2.0, V4L2 (не V4L1) и соответствующие пакеты для разработки установлены в вашей системе. Распакуйте исходный код и рассмотрите директивы сборки в файле Makefile. Исходные коды программы прикреплены к данной статье. Ссылку на архив с ними вы можете найти в конце статьи.
После сборки вы можете использовать программу, соблюдая следующий синтаксис командной строки:
В том случае, если программа вызвана без параметров, она будет выводить тестовые таблицы из оттенков серого разрешением 320x320.
Для соединения с устройством V4L2, представленным файлом /dev/video1 и использования разрешения изображения 640x480 с выходным форматом YUV420, следует использовать следующие параметры командной строки:
glutcam -d /dev/video1 -w 640 -h 480 -e YUV420
При запуске программа выводит информацию об окружении - эта информация включает в себя сведения об используемом устройстве V4L2 и сведения о реализации OpenGL, используемой для вывода изображения. Вы должны увидеть похожий вывод при запуске программы:
$ glutcam -d /dev/video0 -w 640 -h 480 -e YUV422
Info: '/dev/video0' connects to UVC Camera (046d:08c5)
using the uvcvideo driver
Device has the following capabilities
Device: 'UVC Camera (046d:08c5)' Driver: 'uvcvideo'
Device supports video capture.
Device can NOT supply data by read
Device supports streaming I/O
Device does NOT support asynchronous I/O
Device has the following controls available using device file /dev/video0
Control Brightness:integer 0 to 255 in increments of 1
...
Source supplies the following formats:
[0] MJPEG
[1] YUV 4:2:2 (YUYV)
device supports -e YUV422
Warning: VIDIOC_S_CROP cropping not supported: Invalid argument
Opengl information
Opengl vendor 'NVIDIA Corporation'
renderer 'Quadro FX 1500/PCI/SSE2'
version '2.1.2 NVIDIA 169.09'
Supported texture units: 4
...
Shader information:
8 active vars
0 'chroma_texcoord_offsets'
...
Press a key in the display window
Вам необходимо выяснить, какое устройство является источником изображения (например, -d /dev/videoN), изображения какого размера оно генерирует (-w,-h) и в каком формате они генерируются (-e) в вашей системе.
Нажмите кнопку в окне Glutcam для начала показа изображения с вашей вебкамеры. Пример показан на Рисунке 4.
Рисунок 4. Вид окна
Если у вас получилось вывести изображение, вы можете включить или выключить гистограмму с помощью соответствующего пункта меню (Рисунок 5). Гистограмма показывает количество пикселей для каждого значения яркости на входе в процесс обработки с помощью OpenGL. Функция распознавания контуров объектов с использованием центрального процессора влияет на гистограмму (так как изображение изменяется до начала обработки с помощью шейдера), но эта же функция с использованием шейдера на гистограмму никак не влияет.
Рисунок 5. Вид окна с гистограммой
Используйте правую кнопку мыши по отношению к окну для вызова меню (Рисунок 6). Вы можете выбрать один из алгоритмов обработки изображения для того, чтобы увидеть функцию распознавания контуров объектов в работе (Рисунок 7). Попробуйте оба варианта алгоритма (с использованием центрального процессора и шейдера) и сравните результаты, основываясь на частоте кадров и загрузке центрального процессора, полученной при помощи команды top.
Когда центральный процессор обрабатывает каждый пиксель (при отображении гистограммы или распознавании контуров объектов), частота кадров значительно падает (на 50-70%) и загрузка центрального процессора значительно возрастает (на 100-200%). Но из этих результатов не стоит делать выводов. И аппаратные реализации и реализации OpenGL значительно различаются. Напомню, что исключительно программные реализации OpenGL работают медленнее. Glutcam работает начиная с Mesa 7.6-01; с этой версией вы увидите вывод, но скорее всего не увидите частоту кадров.
Рисунок 6. Параметры распознавания контуров объектов в программе Glutcam
Рисунок 7. Режим распознавания контуров объектов программы Glutcam
Наконец, приведем список некоторых советов по разработке шейдеров (и предостережений):
Используйте команду top для слежения за использованием центрального процессора.
Начните разработку с простого шейдера и постепенно усложняйте его. Переосмысливайте свой подход к разработке в случаях, когда частота кадров падает, а загрузка центрального процессора повышается. Это говорит о том, что вместо видеоадаптера используется центральный процессор.
Следите за выводимыми OpenGL сообщениями во время компиляции шейдера. Количество предостережений и качество сообщений об ошибках может значительно варьироваться. Следите за предостережениями, указывающими на то, что ваш шейдер будет частично выполняться с помощью центрального процессора.
Следите за количеством операций доступа к текстуре из вашего кода. На самой старой машине, используемой мною для тестов, матрица размерности 3x3 для режима распознавания контуров была самой большой из тех, которые можно использовать без падения частоты кадров. На более новых машинах отлично выполнялись операции с матрицей размерности 5x5.
Профилируйте часть вашего приложения, работающую с центральным процессором, перед тем, как начать более детальную проработку кода программы. Вам следует разгрузить центральный процессор и загрузить работой видеоадаптер, при этом видеоадаптер должен располагать достаточным промежутком времени для выполнения работы. Таким образом, если вам удастся ускорить участок, обрабатываемый центральным процессором, велика вероятность того, что увеличится промежуток времени, в течение которого видеоадаптер сможет выполнять работу. Если вы рассчитываете получить на выходе частоту кадров 60 Гц, вам требуется 16 миллисекунд для работы видеоадаптера и 16 миллисекунд для подготовки.
Используйте шаблон, хранимый в памяти для установления того, замедляется ли выполнение программы при получении изображения или при его обработке после получения.
Если вы синхронизировали частоту обновления изображения монитора с частотой обновления буферов OpenGL, установите, приводит ли снижение частоты обновления изображения монитора к повышению частоты кадров приложения. Используйте команду xrandr для получения списка доступных разрешений и частот обновления изображения монитора.
Минимизируйте число изменений состояния переменных OpenGL, передаваемых шейдеру. Они передаются видеоадаптеру аналогично данным изображения.
Используйте команду xmag для получения числового значения цвета пикселя на экране.
Пробуйте использовать различные разрешения экрана и различные размеры окон OpenGL. Некоторые комбинации этих параметров позволяют использовать ускорение, а некоторые - нет.
При использовании гистограммы следует помнить о том, что гистограмма с множеством значений будет замедлять процесс больше, чем гистограмма с меньшим количеством значений.
Помните, что ваш источник изображений может иметь жестко заданную частоту кадров. Например, модуль pwc имеет параметр "fps".
Компилятор GLSL использует агрессивные методы оптимизации. Это процесс включает в себя исключение частей шейдера, классифицированных компилятором как лишних. Следите за предостережениями, выводящимися в те моменты, когда вы пытаетесь установить значение переменной шейдера. Если вы получаете ошибку, переменная была исключена в ходе оптимизации. Если при установке значений всех переменных возвращаются ошибки, скорее всего шейдер не скомпилировался вообще.
Разрабатывайте ваш шейдер, стараясь облегчить процесс оптимизации компилятором GLSL. Например, жесткое задание пределов исполнения цикла вместо их передачи через OpenGL позволяет ускорить исполнение ваших шейдеров.
Следите за процессом интерполяции текстуры в случае использования формата, хранящего компоненты в упакованном виде. Если вы используете формат, хранящий компоненты в плоскостном виде, интерполяция между двумя смежными значениями (например, значениями яркости) позволяет получить корректный результат. Интерполяция же между значением яркости и смежным значением цвета не позволяет получить тот результат, которого вы ожидаете.
Следите за инструментами для разработки и анализа производительности шейдеров. Во время исполнения шейдеров творится много интересных вещей.
Заключение
Давно, в 1990-х годах (когда были распространены системы на базе процессоров семейства 486) мое внимание привлек вопрос в новостных группах Usenet. Автор вопроса интересовался тем, как использовать сопроцессор для ускорения алгоритма трассировки лучей. Лучшим советом было перепрограммирование процессоров цифровой обработки сигналов на звуковой карте. Мысль об использовании звуковой карты для улучшения работы с графикой смутила меня. С программируемыми видеоадаптерами и сопутствующими технологиями, такими, как CUDA и OpenCL вы можете использовать аппаратное обеспечение для работы с графикой с целью ускорения других вычислений.