Diferencia entre revisiones de «Shaders»

(Página creada con '{{Definición |nombre=Shaders |imagen=Ejemplo_de_shaders.jpg |concepto= Los shaders son programas, que se escriben en un lenguaje estándar, para procesar tanto píxeles (Píxe...')
 
m (Texto reemplazado: «<div align="justify">» por «»)
 
(No se muestran 6 ediciones intermedias de 4 usuarios)
Línea 1: Línea 1:
 
{{Definición
 
{{Definición
 
|nombre=Shaders
 
|nombre=Shaders
|imagen=Ejemplo_de_shaders.jpg
+
|imagen=
|concepto= Los shaders son programas, que se escriben en un lenguaje estándar, para procesar tanto píxeles (Píxel Shader) como vértices (Vertex Shader).
+
|tamaño=
 +
|concepto=Los shaders son programas, que se escriben en un lenguaje estándar, para   procesar tanto píxeles (Píxel Shader) como vértices (Vertex Shader).
 
}}
 
}}
 
 
'''Shaders.''' Sin entrar en terrenos de difícil comprensión, los shaders son  pequeños programas que se encargan del procesamiento de vértices (Vertex shaders) y de pixeles (Píxel shaders).  La principal ventaja es que, como su naturaleza lo indica, pueden ser  programados por el desarrollador, otorgando una flexibilidad que hasta  antes de la aparición de los shaders era poco más que impensada. Son utilizados para realizar transformaciones y crear  efectos especiales, como por ejemplo iluminación, fuego o niebla. Los shaders pueden programarse tanto en el lenguaje ensamblador nativo  de la tarjeta gráfica (opción obsoleta) o en un lenguaje de alto nivel,  como son el HLSL, GLSL o el Cg.
 
'''Shaders.''' Sin entrar en terrenos de difícil comprensión, los shaders son  pequeños programas que se encargan del procesamiento de vértices (Vertex shaders) y de pixeles (Píxel shaders).  La principal ventaja es que, como su naturaleza lo indica, pueden ser  programados por el desarrollador, otorgando una flexibilidad que hasta  antes de la aparición de los shaders era poco más que impensada. Son utilizados para realizar transformaciones y crear  efectos especiales, como por ejemplo iluminación, fuego o niebla. Los shaders pueden programarse tanto en el lenguaje ensamblador nativo  de la tarjeta gráfica (opción obsoleta) o en un lenguaje de alto nivel,  como son el HLSL, GLSL o el Cg.
  
Línea 11: Línea 11:
 
Desde que comenzó la “revolución 3D” en el ámbito de los juegos de  computadora, allá por mediados de la década de los 90’, la tendencia de  la tecnología aplicada a este rubro ha sido trasladar el trabajo de  procesamiento de gráficos tridimensionales, desde la [[CPU]] hacia la  [[tarjeta de video]].  
 
Desde que comenzó la “revolución 3D” en el ámbito de los juegos de  computadora, allá por mediados de la década de los 90’, la tendencia de  la tecnología aplicada a este rubro ha sido trasladar el trabajo de  procesamiento de gráficos tridimensionales, desde la [[CPU]] hacia la  [[tarjeta de video]].  
  
En primer lugar fue el filtro de las texturas, para lo cual se crearon  chips especialmente dedicados para realizar esta tarea. Así nacieron las  famosas placas aceleradoras 3D, que incorporaban dichos chips y un cantidad de memoria propia en la misma tarjeta. Luego, con la salida del GeForce 256  de [[NVIDIA]], el procesador gráfico pasó a encargarse de lo que, hasta ese  momento, realizaba la [[CPU]]. Estamos hablando de la función de [[Transformación e Iluminación]] (Transform & Lighting),  utilizada para llevar a cabo los cálculos de geometría y de iluminación  general de una escena en 3D. Hubo una versión mejorada de este motor, a  la que se llamó de Segunda Generación. Ésta vino incluida a partir de  la [[GeForce]] 2 y la gama Radeon de [[ATI]], avanzando un poco más en cuanto a materia gráfica.  
+
En primer lugar fue el filtro de las texturas, para lo cual se crearon  chips especialmente dedicados para realizar esta tarea. Así nacieron las  famosas placas aceleradoras 3D, que incorporaban dichos chips y un cantidad de memoria propia en la misma tarjeta. Luego, con la salida del [[GeForce]] 256  de [[NVIDIA]], el procesador gráfico pasó a encargarse de lo que, hasta ese  momento, realizaba la [[CPU]]. Estamos hablando de la función de [[Transformación e Iluminación]] (Transform & Lighting),  utilizada para llevar a cabo los cálculos de geometría y de iluminación  general de una escena en 3D. Hubo una versión mejorada de este motor, a  la que se llamó de Segunda Generación. Ésta vino incluida a partir de  la [[GeForce]] 2 y la gama Radeon de [[ATI]], avanzando un poco más en cuanto a materia gráfica.  
  
 
El gran cambio se dio a partir de la incorporación de los Píxel shaders y Vertex shaders.  Esto permitió a los programadores una mayor libertad a la hora de  diseñar gráficos en tres dimensiones, ya que puede tratarse a cada píxel  y cada vértice por separado. De esta manera, los efectos especiales y  de iluminación puede crearse mucho más detalladamente, sucediendo lo  mismo con la geometría de los objetos.
 
El gran cambio se dio a partir de la incorporación de los Píxel shaders y Vertex shaders.  Esto permitió a los programadores una mayor libertad a la hora de  diseñar gráficos en tres dimensiones, ya que puede tratarse a cada píxel  y cada vértice por separado. De esta manera, los efectos especiales y  de iluminación puede crearse mucho más detalladamente, sucediendo lo  mismo con la geometría de los objetos.
Línea 20: Línea 20:
  
 
== Píxel shader ==  
 
== Píxel shader ==  
[[Archivo:Ejemplo_de_shaders_en_farcry.jpg|200px|thumb|right|FarCry, una pequeña muestra de lo que pueden hacer los shaders.]]
+
[[Archivo:Ejemplo_de_shaders_en_farcry.jpg|200px|thumb|right|FarCry, una pequeña muestra de lo que pueden hacer los shaders en los videojuegos.]]
 
Por otro lado, un Pixel Shader no interviene en el proceso de la  definición del "esqueleto" de la escena (conjunto de vértice,  wireframe), sino que forma parte de la segunda etapa: la rasterización o  render (paso a 2D del universo 3D). Allí es donde se aplican las  texturas y se tratan los píxeles que forman parte de ellas. Básicamente,  un Pixel Shader especifica el color de un píxel. Este tratamiento  individual de los píxeles permite que se realicen cálculos  principalmente relacionados con la iluminación en tiempo real, con la  posibilidad de iluminar cada pixel por separado. Así es como se lograron  crear los fabulosos efectos de este estilo que se pueden apreciar en videojuegos como [[Doom 3]], [[Far Cry]] y [[Half Life 2]],  por mencionar sólo los más conocidos. La particularidad de los píxel  shaders es que, a diferencia de los vertex shaders, requieren de un  soporte de hardware compatible. En otras palabras, un juego programado  para hacer uso de píxel shaders requiere si o si de una tarjeta de video  con capacidad para manipularlos.
 
Por otro lado, un Pixel Shader no interviene en el proceso de la  definición del "esqueleto" de la escena (conjunto de vértice,  wireframe), sino que forma parte de la segunda etapa: la rasterización o  render (paso a 2D del universo 3D). Allí es donde se aplican las  texturas y se tratan los píxeles que forman parte de ellas. Básicamente,  un Pixel Shader especifica el color de un píxel. Este tratamiento  individual de los píxeles permite que se realicen cálculos  principalmente relacionados con la iluminación en tiempo real, con la  posibilidad de iluminar cada pixel por separado. Así es como se lograron  crear los fabulosos efectos de este estilo que se pueden apreciar en videojuegos como [[Doom 3]], [[Far Cry]] y [[Half Life 2]],  por mencionar sólo los más conocidos. La particularidad de los píxel  shaders es que, a diferencia de los vertex shaders, requieren de un  soporte de hardware compatible. En otras palabras, un juego programado  para hacer uso de píxel shaders requiere si o si de una tarjeta de video  con capacidad para manipularlos.
  
== Lenguajes==
+
== Lenguajes ==
  
 
Existen basicamente tres lenguajes de alto nivel para programar Shaders,  todos ellos utilizan un lenguaje tipo C y, en general, sus diferencias  son mínimas.  
 
Existen basicamente tres lenguajes de alto nivel para programar Shaders,  todos ellos utilizan un lenguaje tipo C y, en general, sus diferencias  son mínimas.  
  
=== HLSL - DirectX High-Level Shader Language ===
+
=== HLSL-DirectX High-Level Shader Language ===
  
 
Posiblemente este sea uno de los lenguajes de shading más utilizados en  la industria debido a la gran presión ejercida por [[Microsoft]], combinado  con el hecho que este fue el primero con estilo C utilizado para render  en tiempo real. El HLSL se introdujo con [[DirectX]] 9.0, apareciendo antes  que su competidor, el GLSL, además sus características han sido  extendidas a lo largo de varias revisiones para poder competir con el GLSL.
 
Posiblemente este sea uno de los lenguajes de shading más utilizados en  la industria debido a la gran presión ejercida por [[Microsoft]], combinado  con el hecho que este fue el primero con estilo C utilizado para render  en tiempo real. El HLSL se introdujo con [[DirectX]] 9.0, apareciendo antes  que su competidor, el GLSL, además sus características han sido  extendidas a lo largo de varias revisiones para poder competir con el GLSL.
Línea 33: Línea 33:
 
=== GLSL - OpenGL Shading Language ===
 
=== GLSL - OpenGL Shading Language ===
  
También conocido como glslang, este lenguaje de alto nivel apareció  con la llegada de [[OpenGL]] 2.0. El lenguaje ofrece un rico set de  instrucciones desde sus inicios, unificando el procesado de vértices y  fragmentos (pixels), y permitiendo 'loops' condicionales con estructuras  en árbol. Históricamente, GLSL ha venido precedido por varias extensiones  OpenGL como son ARB_vertex_program y ARB_fragment_program entre otras.  Estas operaban con programas de bajo nivel escritos en ensamblador y con  varias limitaciones. Estos lenguajes ensamblador ya han dejado de  utilizarse para dar paso al GLSL. A partir de la especificación OpenGL 2.0, OGLSL pasa a formar parte del estándar. Esto implica que si una tarjeta es compatible con ésta versión, no hará falta el uso de extensiones, y garantizará su correcto funcionamiento.
+
También conocido como glslang, este lenguaje de alto nivel apareció  con la llegada de [[OpenGL]] 2.0. El lenguaje ofrece un rico set de  instrucciones desde sus inicios, unificando el procesado de vértices y  fragmentos (pixels), y permitiendo 'loops' condicionales con estructuras  en árbol. Históricamente, GLSL ha venido precedido por varias extensiones  OpenGL como son ARB_vertex_program y ARB_fragment_program entre otras.  Estas operaban con programas de bajo nivel escritos en ensamblador y con  varias limitaciones. Estos lenguajes ensamblador ya han dejado de  utilizarse para dar paso al GLSL. A partir de la especificación [[OpenGL]] 2.0, OGLSL pasa a formar parte del estándar. Esto implica que si una tarjeta es compatible con ésta versión, no hará falta el uso de extensiones, y garantizará su correcto funcionamiento.
  
 
=== Cg - 'C for graphics' programming language ===
 
=== Cg - 'C for graphics' programming language ===
  
Este lenguaje fue desarrollado por [[NVIDIA]] y ha sido desarrollado con  el propósito de una fácil y eficiente integración en el proceso de  producción. El lenguaje es independiente de la [[API]] e incluye una gran  variedad de herramientas de soporte. Las primeras implementaciones de Cg eran bastante restrictivas  debido a la abstracción de hardware pero a lo largo de varias versiones,  se ha consolidado como un potente lenguaje de shading de alto nivel  capaz de competir con el HLSL y el GLSL. Por otro lado, la sintaxis es prácticamente idéntica al HLSL y  gracias a sus perfiles de compilación, puede generar código tanto para  los diferentes Shader Models de DirectX como también para las diferentes  extensiones OpenGL. En su última versión, la 1.5, incluso puede generar  código GLSL.
+
Este lenguaje fue desarrollado por [[NVIDIA]] y ha sido desarrollado con  el propósito de una fácil y eficiente integración en el proceso de  producción. El lenguaje es independiente de la [[API]] e incluye una gran  variedad de herramientas de soporte. Las primeras implementaciones de Cg eran bastante restrictivas  debido a la abstracción de hardware pero a lo largo de varias versiones,  se ha consolidado como un potente lenguaje de shading de alto nivel  capaz de competir con el HLSL y el GLSL. Por otro lado, la sintaxis es prácticamente idéntica al HLSL y  gracias a sus perfiles de compilación, puede generar código tanto para  los diferentes Shader Models de [[DirectX]] como también para las diferentes  extensiones [[OpenGL]]. En su última versión, la 1.5, incluso puede generar  código GLSL.
  
 
== Versiones de los Shaders ==
 
== Versiones de los Shaders ==
  
Ha habido una evolución lógica de los Shaders en estos últimos años.  Este progreso tiene que ver, principalmente, con cuestiones internas de  programación. Parámetros como la cantidad de registros disponibles, el  número de instrucciones permitidas por programa y la incorporación de  instrucciones aritméticas más complejas, entre otros, aumentando la  flexibilidad a la hora de programarlos. Tanto [[OpenGL]] como [[DirectX]] han  utilizado sus propios mecanismos de revisión y puesta al día de sus  sistemas de shading. Mientras OpenGL se ha basando en el uso de  extensiones que se han ido ampliando, [[DirectX]] ha definido diferentes  modelos de shading (Shader Models), cada uno de estos modelos permite la  realización de nuevos efectos y un mayor aprovechamiento del hardware.
+
Ha habido una evolución lógica de los Shaders en estos últimos años.  Este progreso tiene que ver, principalmente, con cuestiones internas de  programación. Parámetros como la cantidad de registros disponibles, el  número de instrucciones permitidas por programa y la incorporación de  instrucciones aritméticas más complejas, entre otros, aumentando la  flexibilidad a la hora de programarlos. Tanto [[OpenGL]] como [[DirectX]] han  utilizado sus propios mecanismos de revisión y puesta al día de sus  sistemas de shading. Mientras [[OpenGL]] se ha basando en el uso de  extensiones que se han ido ampliando, [[DirectX]] ha definido diferentes  modelos de shading (Shader Models), cada uno de estos modelos permite la  realización de nuevos efectos y un mayor aprovechamiento del hardware.
  
 
{| align=center cellpadding="2" cellspacing="0" style="background: #white; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;" width=75%
 
{| align=center cellpadding="2" cellspacing="0" style="background: #white; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;" width=75%
Línea 71: Línea 71:
 
|-
 
|-
 
|}
 
|}
 
== Véase también ==
 
 
*[http://www.ecured.cu/index.php/Antialiasing Antialiasing]
 
*[http://www.ecured.cu/index.php/DirectX DirectX]
 
*[http://www.ecured.cu/index.php/OpenGL OpenGL]
 
  
 
== Fuente ==
 
== Fuente ==
Línea 84: Línea 78:
 
*[http://www.neoteo.com/pixel-shaders-y-vertex-shaders neoteo.com]
 
*[http://www.neoteo.com/pixel-shaders-y-vertex-shaders neoteo.com]
  
[[Category:Solicitada]]
+
[[Category:Ciencias_informáticas]]

última versión al 06:54 13 jul 2019

Shaders
Información sobre la plantilla
Concepto:Los shaders son programas, que se escriben en un lenguaje estándar, para procesar tanto píxeles (Píxel Shader) como vértices (Vertex Shader).

Shaders. Sin entrar en terrenos de difícil comprensión, los shaders son pequeños programas que se encargan del procesamiento de vértices (Vertex shaders) y de pixeles (Píxel shaders). La principal ventaja es que, como su naturaleza lo indica, pueden ser programados por el desarrollador, otorgando una flexibilidad que hasta antes de la aparición de los shaders era poco más que impensada. Son utilizados para realizar transformaciones y crear efectos especiales, como por ejemplo iluminación, fuego o niebla. Los shaders pueden programarse tanto en el lenguaje ensamblador nativo de la tarjeta gráfica (opción obsoleta) o en un lenguaje de alto nivel, como son el HLSL, GLSL o el Cg.

Historia

Desde que comenzó la “revolución 3D” en el ámbito de los juegos de computadora, allá por mediados de la década de los 90’, la tendencia de la tecnología aplicada a este rubro ha sido trasladar el trabajo de procesamiento de gráficos tridimensionales, desde la CPU hacia la tarjeta de video.

En primer lugar fue el filtro de las texturas, para lo cual se crearon chips especialmente dedicados para realizar esta tarea. Así nacieron las famosas placas aceleradoras 3D, que incorporaban dichos chips y un cantidad de memoria propia en la misma tarjeta. Luego, con la salida del GeForce 256 de NVIDIA, el procesador gráfico pasó a encargarse de lo que, hasta ese momento, realizaba la CPU. Estamos hablando de la función de Transformación e Iluminación (Transform & Lighting), utilizada para llevar a cabo los cálculos de geometría y de iluminación general de una escena en 3D. Hubo una versión mejorada de este motor, a la que se llamó de Segunda Generación. Ésta vino incluida a partir de la GeForce 2 y la gama Radeon de ATI, avanzando un poco más en cuanto a materia gráfica.

El gran cambio se dio a partir de la incorporación de los Píxel shaders y Vertex shaders. Esto permitió a los programadores una mayor libertad a la hora de diseñar gráficos en tres dimensiones, ya que puede tratarse a cada píxel y cada vértice por separado. De esta manera, los efectos especiales y de iluminación puede crearse mucho más detalladamente, sucediendo lo mismo con la geometría de los objetos.

Vertex shader

Un vertex shader es una función que recibe como parámetro un vértice. Sólo trabaja con un vértice a la vez, y no puede eliminarlo, sólo transformarlo. Para ello, modifica propiedades del mismo para que repercutan en la geometría del objeto al que pertenece. Con ésto se puede lograr ciertos efectos específicos, como los que tienen que ver con la deformación en tiempo real de un elemento; por ejemplo, el movimiento de una ola. Donde toma una gran importancia es en el tratamiento de las superficies curvas, y su avance se vio reflejado en los videojuegos más avanzados de la actualidad. Particularmente, en el diseño de los personajes y sus expresiones corporales.

Píxel shader

FarCry, una pequeña muestra de lo que pueden hacer los shaders en los videojuegos.

Por otro lado, un Pixel Shader no interviene en el proceso de la definición del "esqueleto" de la escena (conjunto de vértice, wireframe), sino que forma parte de la segunda etapa: la rasterización o render (paso a 2D del universo 3D). Allí es donde se aplican las texturas y se tratan los píxeles que forman parte de ellas. Básicamente, un Pixel Shader especifica el color de un píxel. Este tratamiento individual de los píxeles permite que se realicen cálculos principalmente relacionados con la iluminación en tiempo real, con la posibilidad de iluminar cada pixel por separado. Así es como se lograron crear los fabulosos efectos de este estilo que se pueden apreciar en videojuegos como Doom 3, Far Cry y Half Life 2, por mencionar sólo los más conocidos. La particularidad de los píxel shaders es que, a diferencia de los vertex shaders, requieren de un soporte de hardware compatible. En otras palabras, un juego programado para hacer uso de píxel shaders requiere si o si de una tarjeta de video con capacidad para manipularlos.

Lenguajes

Existen basicamente tres lenguajes de alto nivel para programar Shaders, todos ellos utilizan un lenguaje tipo C y, en general, sus diferencias son mínimas.

HLSL-DirectX High-Level Shader Language

Posiblemente este sea uno de los lenguajes de shading más utilizados en la industria debido a la gran presión ejercida por Microsoft, combinado con el hecho que este fue el primero con estilo C utilizado para render en tiempo real. El HLSL se introdujo con DirectX 9.0, apareciendo antes que su competidor, el GLSL, además sus características han sido extendidas a lo largo de varias revisiones para poder competir con el GLSL.

GLSL - OpenGL Shading Language

También conocido como glslang, este lenguaje de alto nivel apareció con la llegada de OpenGL 2.0. El lenguaje ofrece un rico set de instrucciones desde sus inicios, unificando el procesado de vértices y fragmentos (pixels), y permitiendo 'loops' condicionales con estructuras en árbol. Históricamente, GLSL ha venido precedido por varias extensiones OpenGL como son ARB_vertex_program y ARB_fragment_program entre otras. Estas operaban con programas de bajo nivel escritos en ensamblador y con varias limitaciones. Estos lenguajes ensamblador ya han dejado de utilizarse para dar paso al GLSL. A partir de la especificación OpenGL 2.0, OGLSL pasa a formar parte del estándar. Esto implica que si una tarjeta es compatible con ésta versión, no hará falta el uso de extensiones, y garantizará su correcto funcionamiento.

Cg - 'C for graphics' programming language

Este lenguaje fue desarrollado por NVIDIA y ha sido desarrollado con el propósito de una fácil y eficiente integración en el proceso de producción. El lenguaje es independiente de la API e incluye una gran variedad de herramientas de soporte. Las primeras implementaciones de Cg eran bastante restrictivas debido a la abstracción de hardware pero a lo largo de varias versiones, se ha consolidado como un potente lenguaje de shading de alto nivel capaz de competir con el HLSL y el GLSL. Por otro lado, la sintaxis es prácticamente idéntica al HLSL y gracias a sus perfiles de compilación, puede generar código tanto para los diferentes Shader Models de DirectX como también para las diferentes extensiones OpenGL. En su última versión, la 1.5, incluso puede generar código GLSL.

Versiones de los Shaders

Ha habido una evolución lógica de los Shaders en estos últimos años. Este progreso tiene que ver, principalmente, con cuestiones internas de programación. Parámetros como la cantidad de registros disponibles, el número de instrucciones permitidas por programa y la incorporación de instrucciones aritméticas más complejas, entre otros, aumentando la flexibilidad a la hora de programarlos. Tanto OpenGL como DirectX han utilizado sus propios mecanismos de revisión y puesta al día de sus sistemas de shading. Mientras OpenGL se ha basando en el uso de extensiones que se han ido ampliando, DirectX ha definido diferentes modelos de shading (Shader Models), cada uno de estos modelos permite la realización de nuevos efectos y un mayor aprovechamiento del hardware.

Versión de DirectX Shader Models soportados Características Shader Models
DirectX 8.0 Vertex Shader 1.0, Pixel Shader 1.1 Primera generación de shaders, punto fijo, rango limitado, pequeños programas asm (fp:8 - vp:128), sin control de flujo.
DirectX 8.1 Vertex Shader 1.1, Pixel Shader 1.3 y 1.4 Primera generación de shaders, punto fijo, rango limitado, pequeños programas asm (fp:8 - vp:128), sin control de flujo.
DirectX 9.0 Vertex Shader 2.0, Pixel Shader 2.0 Segunda generación de shaders, operaciones en coma flotante, cierto control de flujo, programas mas largos HLSL (fp:96 - vp:256)
DirectX 9.0c Vertex Shader 3.0, Pixel Shader 3.0 Tercera generación de shaders, control dinámico de flujo, programas largos HLSL (fp:65k - vp:65k)
DirectX 10 Vertex Shader 4.0, Pixel Shader 4.0 Cuarta generación de shaders, control dinámico de flujo, programas largos HLSL (fp:99k - vp:65k), mayor número de registros y texturas.

Fuente