Ассемблер ARB - это язык затенения низкого уровня , который можно охарактеризовать как язык ассемблера . Он был создан Советом по обзору архитектуры OpenGL (ARB) для стандартизации инструкций графического процессора, управляющих аппаратным графическим конвейером .
История
В 1985 году компания Texas Instruments создала первый программируемый графический процессор : TMS34010 , который позволил разработчикам загружать и выполнять код процессора для управления выводом пикселей на видеодисплей. За этим последовали TMS34020 и TMS34082 в 1989 году, обеспечивающие программируемый вывод трехмерной графики.
NVIDIA выпустила свою первую видеокарту NV1 в 1995 году, которая поддерживала квадратичное наложение текстур. За ним последовала Riva 128 (NV3) в 1997 году, обеспечившая первое аппаратное ускорение для Direct3D .
Различные производители видеокарт выпускали свои собственные ускоренные платы, каждая со своим собственным набором инструкций для операций с графическим процессором . Совет по обзору архитектуры OpenGL (ARB) был сформирован в 1992 году, отчасти для того, чтобы установить стандарты для индустрии графических процессоров .
ARB и NVIDIA создали ряд расширений OpenGL для стандартизации программирования на GPU: [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_fragment_program - GeForce FX
Это привело к выпуску ARB в 2002 году
Эти два расширения представляют собой отраслевой стандарт для языка ассемблера, который управляет конвейером графического процессора для свойств трехмерных вершин и интерполированных пикселей, соответственно.
Последующие языки затенения высокого уровня иногда компилируются с этим стандартом ARB. В то время как 3D-разработчики теперь с большей вероятностью будут использовать C-подобный высокоуровневый язык затенения для программирования на GPU , сборка 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. language [5] и не предлагают никаких других способов доступа ко всем функциям шейдеров непосредственно в сборке, что вынуждает использовать GLSL даже для машинно сгенерированных шейдеров, где сборка была бы более подходящей.
Подробности
ARB_vertex_program
Расширение ARB Vertex Program предоставляет API для загрузки инструкций сборки ARBvp1.0, включения выбранных программ и установки различных параметров графического процессора.
Вершинные программы используются для изменения свойств вершин, таких как положение, нормали и координаты текстуры, которые передаются следующему конвейерному процессу: часто фрагментному шейдеру; совсем недавно геометрический шейдер.
ARB_fragment_program
Расширение ARB Fragment Program предоставляет API для загрузки инструкций сборки ARBfp1.0, включения выбранных программ и установки различных параметров графического процессора.
Фрагменты OpenGL - это интерполированные определения пикселей. В GPU вершинный процессор вычисляет «сек все пиксели , управляемые множеством вершин, интерполирует их положение и другие свойства и передает их на свой процесс фрагмента. Программы-фрагменты позволяют разработчикам изменять эти свойства пикселей до их рендеринга в буфер кадра для отображения.
Параметры OpenGL
- Параметры Attrib - это атрибуты вершин, такие как нормали вершин.
- Локальные параметры применяются ко всему набору данных программы для данного прохода шейдера.
- Параметры Env применяются во всех программах.
Переменные ARB
Все переменные сборки ARB являются векторами с плавающей запятой, к которым можно обращаться с помощью суффиксов xyzw или rgba.
Регистры - это скалярные переменные, в которых может быть адресован только один элемент.
- Переменные ADDRESS - это регистры.
- ATTRIB - это атрибуты вершин.
- PARAM - это единые свойства - константы, Env или Local.
- Временные переменные TEMP .
- ALIAS предоставляет альтернативные имена для переменных.
- OUTPUT обозначает переменные, которые передаются обратно в конвейер.
Атрибуты вершины
Сборка ARB поддерживает следующие суффиксы для атрибутов вершин:
- должность
- масса
- обычный
- цвет
- туманкоорд
- Texcoord
- matrixindex
- аттриб
Матрицы состояний
Сборка ARB поддерживает следующие матрицы состояний:
- просмотр модели
- проекция
- текстура
- палитра
- программа
Могут использоваться следующие модификаторы:
- обратный
- транспонировать
- invtrans
Инструкция по сборке ARB
Сборка ARB поддерживает следующие инструкции:
- ABS - абсолютное значение
- ДОБАВИТЬ - добавить
- ARL - загрузка адресного регистра
- DP3 - 3-компонентный скалярный продукт
- DP4 - 4-компонентный скалярный продукт
- DPH - однородный точечный продукт
- DST - вектор расстояния
- EX2 - экспоненциальная основа 2
- EXP - экспоненциальная основа 2 (приблизительно)
- FLR - этаж
- FRC - дробь
- LG2 - логарифм по основанию 2
- LIT - вычислить световые коэффициенты
- LOG - логарифм по основанию 2 (приблизительно)
- MAD - умножить и сложить
- MAX - максимум
- MIN - минимум
- MOV - двигаться
- MUL - умножить
- POW - возвести в степень
- RCP - взаимный
- RSQ - обратный квадратный корень
- SGE - установлено больше или равно
- SLT - установлено менее
- SUB - вычесть
- SWZ - расширенный swizzle
- 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.0TEMP 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;КОНЕЦ
Пример тривиального фрагментного шейдера ARB
!! ARBfp1.0Цвет ТЕМП;Цвет MUL, fragment.texcoord [0] .y, 2.0;ADD color, 1.0, -цвет;Цвет АБС, цвет;ДОБАВИТЬ result.color, 1.0, -color;MOV result.color.a, 1.0;КОНЕЦ
Смотрите также
Рекомендации
- ^ Саймон Грин. «История программирования в OpenGL» (PDF) .
- ^ ARB. "ARB_vertex_program" .
- ^ ARB. "ARB_fragment_program" .
- ^ Wildfire Games. «Список видеокарт и средств визуализации OpenGL, поддерживающих язык ассемблера ARB» .
- ^ Wildfire Games. «Список видеокарт и средств визуализации OpenGL, поддерживающих расширения nVidia для языка ассемблера ARB» .