Gráficos por ordenador: tubería programable 2018-01-31T12:05:16+00:00

Project Description

Gráficos por ordenador: tubería programable

Funcionamiento de la tubería programable

Escrito por Reisor | 29/01/2018

En el artículo anterior hemos visto la implementación de las etapas de geometría y rasterización por la GPU en el caso de la tubería fija. Estas se dividían en varias con diferentes grados de configuración. Por el contrario, en la tubería programable, varias de las etapas son codificables por el usuario. En la figura mas abajo se muestran los estados de esta nueva tubería. Si se compara con las figuras de la tubería fija se puede observar que esta contiene todas  las etapas necesarias para la generación de gráficos en tiempo real. Además, en la figura se muestra con colores según su nivel de programabilidad y configurabilidad. Las etapas verdes son totalmente programables. Las azules son estáticas y  no pueden ser alteradas, la GPU se encarga de ejecutarlas de la forma en como el fabricante de la misma las haya implementado. Por último, las amarillas también son estáticas, pero su función es de unir las etapas previas.

Vemos cómo se ha evolucionado de un modelo cuasi estático a uno programable y flexible. La introducción de los shaders programables supuso un paso muy importante en la evolución de los gráficos por ordenador. Se llama shader a programas que se ejecutan en la GPU y que pueden usar todas las funcionalidades que esta subetapa ofrece. Además de ser ejecutados en la GPU, los shaders son también accedidos por la CPU para cambiar sus variables. Esto permite una ejecución asíncrona y con mayor rendimiento, al quitarle peso computacional a la CPU y hacer uso de la aceleración que aportan las GPUs.

Todos los shaders programables usan el mismo núcleo. Esto quiere decir que los shaders de vértice, píxel y geometría comparten el mismo modelo de programación. Se han ido añadiendo nuevas subetapas de tipo shader a la tubería programable, siendo los shader de vértice y píxel las primeras en aparecer. Como hemos comentado anteriormente, por ejemplo, los shaders de píxel pueden programar diferentes comportamientos para añadir, modificar o eliminar colores en cada píxel. En el caso de los shaders de vértice, estos son capaces de alterar los triángulos que forman un objeto, pudiendo, por ejemplo, convertir hexágonos en heptágonos añadiendo triángulos al mismo. Hoy en día existen más shaders programables como el computacional, dominio y teslación, entre otros.

La forma en que funciona el modelo de programación de los shaders no es baladí. Básicamente se trata de un lenguaje similar a C, los más usados son HLSL (DirectX), Cg (DirectX y OpenGL) y GLSL (OpenGL), que se compila a lenguaje ensamblador para después convertido a código máquina. Este es interpretado por la GPU haciendo uso del driver y permite interactuar con él mediante un lenguaje intermedio (conocido como IL).

A continuación podemos un shader de píxel sencillo que se encargar de cambia que el color al objeto que se le asigna.


struct VS_INPUT // Estructura de los datos de entrada.
{
float4 color : COLOR; // Variable que contiene el color.
};


struct VS_OUTPUT // Estructura de los datos de salida.
{
float4 color : COLOR; // Variable que contiene el color.
};


VS_OUTPUT VSMAIN( in VS_INPUT v ) // Shader de vertice.
{
VS_OUTPUT o = (VS_OUTPUT)0; // Asignamos a una variable la estructura de salida.
o.color = v.color; // Asignamos el color de entrada a la salida.
return o; // Devolvemos la salida.
}


float4 PSMAIN( in VS_OUTPUT input ) : SV_Target // Shader de pixel.
{
float4 color = input.color; // Obtenemos el color de entrada.
return( color ); // Devolvemos el color.
}

Y con este artículo terminamos de dar un repaso por la superficie de los gráficos por ordenador en tiempo real.