язык ассемблера АРБ
Язык ассемблера ARB — это низкоуровневый язык шейдеров , который можно охарактеризовать как язык ассемблера . Он был создан Советом по обзору архитектуры OpenGL (ARB) для стандартизации инструкций графического процессора, управляющих аппаратным графическим конвейером .
История
[ редактировать ]В 1985 году компания Texas Instruments создала первый программируемый графический процессор : TMS34010 , который позволял разработчикам загружать и выполнять на процессоре код для управления выводом пикселей на видеодисплей. За этим последовали TMS34020 и TMS34082 в 1989 году, обеспечивающие программируемый вывод 3D-графики.
В 1995 году Nvidia выпустила свою первую видеокарту NV1 , которая поддерживала квадратичное наложение текстур. За этим последовала Riva 128 (NV3) в 1997 году, обеспечившая первое аппаратное ускорение Direct3D .
Различные производители видеокарт выпустили свои собственные ускоренные платы, каждая со своим набором инструкций для операций графического процессора . Совет по обзору архитектуры OpenGL (ARB) был создан в 1992 году, отчасти для установления стандартов для индустрии графических процессоров.
ARB и Nvidia разработали ряд расширений OpenGL для стандартизации программирования графических процессоров: [1]
- EXT_texture_env_combine — предоставил программируемый метод объединения текстур.
- NV_register_combiners - GeForce 256
- NV_vertex_program - GeForce 3
- NV_texture_shader — GeForce 3
- NV_texture_shader3 — GeForce 4
- NV_vertex_program2 — GeForce FX
- NV_фрагмент_программа - GeForce FX
Кульминацией этого ARB стал выпуск в 2002 году
Эти два расширения предоставили отраслевой стандарт для языка ассемблера, который управлял конвейером графического процессора для определения свойств трехмерных вершин и интерполированных пикселей соответственно.
высокого уровня Последующие языки шейдеров иногда компилируются в соответствии с этим стандартом ARB. В то время как 3D-разработчики теперь чаще используют C-подобный язык шейдеров высокого уровня для программирования графических процессоров , сборка ARB имеет то преимущество, что поддерживается на широком спектре оборудования.
Однако обратите внимание, что некоторые функции, такие как циклы и условные выражения, недоступны в сборке ARB, и для их использования требуется принять либо расширение NV_gpu_program4, либо язык шейдеров GLSL.
Все основные производители видеокарт поддерживают язык ассемблера ARB в течение многих лет, начиная с серии NVIDIA Geforce FX , карт на базе AMD R300 (серия Radeon 9500 и выше) и Intel GMA 900 . [4] Однако стандартный язык ассемблера ARB находится только на уровне Pixel Shader 2.0 и предшествует GLSL , поэтому у него очень мало функций. Хотя nVidia создала собственные расширения для языков ассемблера ARB, которые сочетают в себе высокую скорость компиляции ассемблера ARB с современными функциями OpenGL 3.x, представленными в серии GeForce 8 , большинство реализаций OpenGL, отличных от nVidia, не предоставляют собственные расширения nVidia для ассемблера ARB. язык [5] и не предлагать никакого другого способа доступа ко всем функциям шейдера непосредственно в сборке, вынуждая использовать GLSL даже для шейдеров, сгенерированных машиной, где сборка была бы более подходящей.
Подробности
[ редактировать ]ARB_vertex_program
[ редактировать ]Расширение программы ARB Vertex предоставляет API для загрузки инструкций по сборке ARBvp1.0, включения выбранных программ и установки различных параметров графического процессора.
Программы вершин используются для изменения свойств вершин, таких как положение, нормали и координаты текстуры, которые передаются следующему конвейерному процессу: часто фрагментному шейдеру; совсем недавно появился геометрический шейдер.
ARB_фрагмент_программа
[ редактировать ]Расширение программы ARB Fragment предоставляет API-интерфейсы для загрузки инструкций сборки ARBfp1.0, включения выбранных программ и установки различных параметров графического процессора.
Фрагменты OpenGL представляют собой интерполированные определения пикселей. Вершинный процессор графического процессора вычисляет все пиксели, управляемые набором вершин, интерполирует их положение и другие свойства и передает их в процесс фрагментирования. Программы-фрагменты позволяют разработчикам изменять свойства пикселей до их рендеринга в буфер кадра для отображения.
Параметры OpenGL
[ редактировать ]- Параметры атрибутов — это атрибуты каждой вершины, такие как нормали вершин.
- Локальные параметры применяются ко всему набору данных программы для данного прохода шейдера.
- Параметры Env применяются во всех программах.
Переменные ARB
[ редактировать ]Все переменные сборки ARB представляют собой векторы float4, к которым можно обращаться суффиксами xyzw или rgba.
Регистры — это скалярные переменные, к которым можно обращаться только к одному элементу.
- Переменные ADDRESS являются регистрами.
- ATTRIB — это атрибуты вершин.
- PARAM — это единые свойства — константы, Env или Local.
- Временные переменные TEMP .
- ALIAS предоставляет альтернативные имена для переменных.
- OUTPUT обозначает переменные, которые передаются обратно в конвейер.
Атрибуты вершин
[ редактировать ]Сборка ARB поддерживает следующие суффиксы для атрибутов вершин:
- позиция
- масса
- нормальный
- цвет
- туманкоорд
- Текскорд
- матричный индекс
- атрибут
Матрицы состояний
[ редактировать ]Сборка ARB поддерживает следующие матрицы состояний:
- просмотр модели
- проекция
- текстура
- палитра
- программа
Могут быть использованы следующие модификаторы:
- обратный
- транспонировать
- инвтранс
Инструкция по сборке АРБ
[ редактировать ]Сборка ARB поддерживает следующие инструкции:
- АБС – абсолютное значение
- ДОБАВИТЬ - добавить
- ARL — загрузка адресного регистра
- DP3 — 3-компонентное скалярное произведение
- DP4 — 4-компонентное скалярное произведение
- DPH — однородное скалярное произведение
- DST - вектор расстояния
- EX2 - экспоненциальная система с основанием 2
- EXP - экспоненциальная система по основанию 2 (приблизительная)
- ФЛР - этаж
- FRC - дробь
- LG2 - логарифм по основанию 2
- LIT — вычисление коэффициентов освещенности
- LOG - логарифм по основанию 2 (приблизительный)
- MAD – умножить и сложить
- МАКС - максимум
- МИН - минимум
- МОВ – двигаться
- МУЛ – умножить
- POW - возводить в степень
- РКП - взаимный
- RSQ – обратный квадратный корень
- SGE – установлено больше или равно
- SLT – установлен менее чем на
- СУБ – вычесть
- SWZ – расширенный поворот
- TEX — Поиск текстуры
- XPD – перекрестное произведение
Это лишь неполный список инструкций по сборке; ссылку можно найти здесь: Краткое справочное руководство по языку ассемблера шейдеров (ARB/NV) для OpenGL .
Сборка ARB не содержит инструкций для управления потоком или ветвления. SGE и SLT могут использоваться для условной установки или очистки векторов или регистров.
Интерфейсы ARB не предусматривают этапа компиляции для языка ассемблера.
GL_NV_fragment_program_option расширяет язык ARB_fragment_program дополнительными инструкциями. GL_NV_fragment_program2, GL_NV_vertex_program2_option и GL_NV_vertex_program3 расширяют его.
Пример кода
[ редактировать ]Пример тривиального вершинного шейдера ARB
[ редактировать ]!!ARBvp1.0 TEMP vertexClip; DP4 vertexClip.x, state.matrix.mvp.row[0], vertex.position; DP4 vertexClip.y, state.matrix.mvp.row[1], vertex.position; DP4 vertexClip.z, state.matrix.mvp.row[2], vertex.position; DP4 vertexClip.w, state.matrix.mvp.row[3], vertex.position; MOV result.position, vertexClip; MOV result.color, vertex.color; MOV result.texcoord[0], vertex.texcoord; END
Пример тривиального фрагментного шейдера ARB
[ редактировать ]!!ARBfp1.0 TEMP color; MUL color, fragment.texcoord[0].y, 2.0; ADD color, 1.0, -color; ABS color, color; ADD result.color, 1.0, -color; MOV result.color.a, 1.0; END
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Саймон Грин. «История программирования в OpenGL» (PDF) .
- ^ АРБ. "ARB_vertex_program" .
- ^ АРБ. "ARB_фрагмент_программа" .
- ^ Лесные пожарные игры. «Список видеокарт и средств визуализации OpenGL, поддерживающих язык ассемблера ARB» .
- ^ Лесные пожарные игры. «Список видеокарт и средств визуализации OpenGL, поддерживающих расширения nVidia для языка ассемблера ARB» .