El lenguaje ensamblador ARB es un lenguaje de sombreado de bajo nivel , que se puede caracterizar como un lenguaje ensamblador . Fue creado por la OpenGL Architecture Review Board (ARB) para estandarizar las instrucciones de la GPU que controlan el flujo de gráficos del hardware .
Texas Instruments creó el primer procesador gráfico programable en 1985: el TMS34010 , que permitía a los desarrolladores cargar y ejecutar código en el procesador para controlar la salida de píxeles en una pantalla de vídeo. A este le siguieron el TMS34020 y el TMS34082 en 1989, que proporcionaban una salida de gráficos 3D programable.
Nvidia lanzó su primera tarjeta de video NV1 en 1995, que admitía mapeo de textura cuadrático. A esta le siguió la Riva 128 (NV3) en 1997, que proporcionó la primera aceleración de hardware para Direct3D .
Varios proveedores de tarjetas de video lanzaron sus propias placas aceleradas, cada una con su propio conjunto de instrucciones para operaciones de GPU . La OpenGL Architecture Review Board (ARB) se formó en 1992, en parte para establecer estándares para la industria de GPU.
La ARB y Nvidia establecieron una serie de extensiones OpenGL para estandarizar la programación de la GPU: [1]
Esto culminó con el lanzamiento de ARB en 2002
Estas dos extensiones proporcionaron un estándar industrial para un lenguaje ensamblador que controlaba la canalización de la GPU para propiedades de vértices 3D y píxeles interpolados, respectivamente.
Los lenguajes de sombreado de alto nivel posteriores a veces se compilan según este estándar ARB. Si bien ahora es más probable que los desarrolladores 3D utilicen un lenguaje de sombreado de alto nivel similar a C para la programación de GPU , el ensamblaje ARB tiene la ventaja de ser compatible con una amplia gama de hardware.
Sin embargo, tenga en cuenta que algunas características, como bucles y condicionales, no están disponibles en el ensamblaje ARB, y su uso requiere adoptar la extensión NV_gpu_program4 o el lenguaje de sombreado GLSL.
Todos los principales fabricantes de tarjetas gráficas han soportado el lenguaje ensamblador ARB durante años, desde la serie NVIDIA Geforce FX , las tarjetas basadas en AMD R300 (serie Radeon 9500 y superiores) y la Intel GMA 900. [ 4] Sin embargo, el lenguaje ensamblador ARB estándar solo está al nivel de Pixel Shader 2.0 y es anterior a GLSL , por lo que tiene muy pocas características. Si bien nVidia ha realizado extensiones propietarias para los lenguajes ensambladores ARB que combinan la rápida velocidad de compilación del ensamblaje ARB con las características modernas de OpenGL 3.x, introducidas con la serie GeForce 8 , la mayoría de las implementaciones de OpenGL que no son de nVidia no proporcionan las extensiones propietarias de nVidia para el lenguaje ensamblador ARB [5] y no ofrecen ninguna otra forma de acceder a todas las características del sombreador directamente en el ensamblaje, lo que obliga al uso de GLSL incluso para sombreadores generados por máquina donde el ensamblaje sería más apropiado.
La extensión del programa ARB Vertex proporciona API para cargar instrucciones de ensamblaje ARBvp1.0, habilitar programas seleccionados y configurar varios parámetros de GPU.
Los programas de vértices se utilizan para modificar las propiedades de los vértices, como la posición, las normales y las coordenadas de textura, que se pasan al siguiente proceso de canalización: a menudo un sombreador de fragmentos; más recientemente, un sombreador de geometría.
La extensión del programa Fragmento ARB proporciona API para cargar instrucciones de ensamblaje ARBfp1.0, habilitar programas seleccionados y configurar varios parámetros de GPU.
Los fragmentos OpenGL son definiciones de píxeles interpoladas. El procesador de vértices de la GPU calcula todos los píxeles controlados por un conjunto de vértices, interpola su posición y otras propiedades y las pasa a su procesador de fragmentos. Los programas de fragmentos permiten a los desarrolladores modificar estas propiedades de píxeles antes de que se rendericen en un búfer de cuadros para su visualización.
Todas las variables del ensamblaje ARB son vectores float4, a los que se pueden direccionar mediante sufijos xyzw o rgba.
Los registros son variables escalares donde sólo se puede direccionar un elemento.
El ensamblaje ARB admite los siguientes sufijos para atributos de vértice:
El ensamblaje ARB admite las siguientes matrices de estados:
Se pueden utilizar los siguientes modificadores:
El conjunto ARB admite las siguientes instrucciones:
Esta es solo una lista parcial de instrucciones de ensamblaje; puede encontrar una referencia aquí: Guía de referencia rápida del lenguaje ensamblador de sombreadores (ARB/NV) para OpenGL.
El ensamblaje ARB no proporciona instrucciones para el control de flujo o ramificación. SGE y SLT se pueden utilizar para configurar o borrar condicionalmente vectores o registros.
Las interfaces ARB no proporcionan ningún paso de compilación para el lenguaje ensamblador.
GL_NV_fragment_program_option extiende el lenguaje ARB_fragment_program con instrucciones adicionales. GL_NV_fragment_program2, GL_NV_vertex_program2_option y GL_NV_vertex_program3 lo extienden aún más.
!!ARBvp1.0TEMP vérticeClip;DP4 vertexClip.x, estado.matrix.mvp.row[0], vértice.posición;DP4 vertexClip.y, estado.matrix.mvp.row[1], vertex.position;DP4 vertexClip.z, estado.matrix.mvp.row[2], vértice.posición;DP4 vertexClip.w, estado.matrix.mvp.row[3], vértice.posición;Resultado MOV.posición, vertexClip;MOV resultado.color, vértice.color;MOV resultado.texcoord[0], vértice.texcoord;FIN
!!ARBfp1.0Color TEMPORAL;Color MUL, fragmento.texcoord[0].y, 2.0;AGREGAR color, 1.0, -color;Color:ABS;AGREGAR resultado.color, 1.0, -color;Resultado MOV.color.a, 1.0;FIN