Articulo de referencia

Lenguaje de sombreado de alto nivel

El lenguaje de sombreado de alto nivel [ 1 ] o lenguaje de sombreado de alto nivel [ 2 ] ( HLSL ) es un lenguaje de sombreado propietario desarrollado por Microsoft para la API ...

El lenguaje de sombreado de alto nivel [ 1 ] o lenguaje de sombreado de alto nivel [ 2 ] ( HLSL ) es un lenguaje de sombreado propietario desarrollado por Microsoft para la API Direct3D 9 con el fin de ampliar el lenguaje ensamblador de sombreado , y se convirtió en el lenguaje de sombreado requerido para el modelo de sombreado unificado de Direct3D 10 y versiones posteriores. Se desarrolló junto con el lenguaje de sombreado Cg (abreviatura de C para gráficos ) de Nvidia. Las primeras versiones de ambos lenguajes se consideraban idénticas, solo que se comercializaban de forma diferente. [ 3 ]

Aunque Cg y HLSL comparten la misma sintaxis básica, se modificaron algunas características de C y se añadieron nuevos tipos de datos para que Cg/HLSL fueran más adecuados para la programación de unidades de procesamiento gráfico . [ 4 ] [ 5 ]

Existen dos ramas principales del lenguaje Cg/HLSL: el compilador Cg de Nvidia (cgc), que genera DirectX u OpenGL , y el HLSL de Microsoft, que genera sombreadores DirectX en formato de bytecode. [ 6 ] [ 7 ] El cgc de Nvidia quedó obsoleto en 2012, sin que se ofreciera desarrollo ni soporte adicionales. [ 8 ]

Los sombreadores HLSL pueden habilitar muchos efectos especiales tanto en gráficos por computadora 2D como 3D .

  • El lenguaje Cg/HLSL originalmente solo incluía soporte para sombreadores de vértices y sombreadores de píxeles ("fragmento" en GLSL). Un sombreador de vértices se ejecuta para cada vértice que envía la aplicación y es responsable principalmente de transformar el vértice del espacio de objeto al espacio de vista, generar coordenadas de textura y calcular coeficientes de iluminación como los vectores normal, tangente y bitangente del vértice. Cuando un grupo de vértices (normalmente 3, para formar un triángulo) pasa por el sombreador de vértices, su posición de salida se interpola para formar píxeles dentro de su área; este proceso se conoce como rasterización .
  • DirectX 10 (Shader Model 4) y Cg 2.0 introdujeron los sombreadores de geometría . [ 9 ] Este sombreador toma como entrada algunos vértices de una primitiva (triángulo/línea/punto) y utiliza estos datos para generar/degenerar (o teselar ) primitivas adicionales o para cambiar el tipo de primitivas, que luego se envían al rasterizador.
  • DirectX 11 (Shader Model 5) introdujo los sombreadores de cómputo ( GPGPU ) y los sombreadores de teselación (de envolvente y de dominio). Estos últimos están presentes en Cg 3.1.
  • DirectX 12 (Shader Model 6.3) introdujo los sombreadores de trazado de rayos (generación de rayos, intersección, cualquier impacto / impacto más cercano / fallo).

D3D11.3 y D3D12 introdujeron Shader Model 5.1 [ 10 ] y posteriormente 6.0. [ 11 ]

Fondo

Gracias a los avances técnicos en el hardware gráfico, algunas áreas de la programación de gráficos 3D se han vuelto bastante complejas. Para simplificar el proceso, se añadieron nuevas funciones a las tarjetas gráficas, incluida la capacidad de modificar sus procesos de renderizado mediante sombreadores de vértices y píxeles.

Inicialmente, los sombreadores de vértices y píxeles se programaban a un nivel muy bajo, utilizando únicamente el lenguaje ensamblador de la unidad de procesamiento gráfico. Si bien el lenguaje ensamblador brindaba al programador un control total sobre el código y flexibilidad, su uso resultaba bastante complejo. Se necesitaba un lenguaje portátil de alto nivel para programar la GPU, por lo que se creó Cg para superar estos problemas y facilitar el desarrollo de sombreadores.

Algunas de las ventajas de usar Cg/HLSL en lugar de lenguaje ensamblador son:

  • El código de alto nivel es más fácil de aprender, programar, leer y mantener que el código ensamblador.
  • El código Cg/HLSL es portable a una amplia gama de hardware y plataformas, a diferencia del código ensamblador, que generalmente depende del hardware y de las plataformas para las que está escrito.
  • El compilador Cg/HLSL puede optimizar el código y realizar automáticamente tareas de bajo nivel, que son difíciles de hacer y propensas a errores en lenguaje ensamblador.

Idioma

Tipos de datos

Cg/HLSL tiene seis tipos de datos básicos. Algunos son los mismos que en C, mientras que otros se han añadido específicamente para la programación de GPU. Estos tipos son:

  • float : un número de punto flotante de 32 bits
  • mitad - un número de punto flotante de 16 bits
  • int - un entero de 32 bits
  • fijo : un número de punto fijo de 12 bits
  • bool - una variable booleana
  • muestreador* - representa un objeto de textura

Cg también incluye tipos de datos vectoriales y matriciales basados ​​en tipos de datos básicos como float3 y float4x4. Estos tipos de datos son bastante comunes en la programación de gráficos 3D. Cg también cuenta con tipos de datos struct y array , que funcionan de forma similar a sus equivalentes en C.

Operadores

Cg admite una amplia gama de operadores, incluidos los operadores aritméticos comunes de C, los operadores aritméticos equivalentes para tipos de datos vectoriales y matriciales, y los operadores lógicos comunes .

Funciones y estructuras de control

Cg comparte con C las estructuras de control básicas, como if/else, while y for. También tiene una forma similar de definir funciones.

Semántica

Preprocesador

Cg implementa muchas directivas del preprocesador C y su sistema de expansión de macros. Implementa #include. [ 12 ]

Características de HLSL

  • Espacio de nombres
  • Anotación

Ambiente

Los programas Cg se crean para diferentes perfiles de sombreado que representan GPU con distintas capacidades. [ 13 ] Estos perfiles determinan, entre otras cosas, cuántas instrucciones puede contener cada sombreador, cuántos registros están disponibles y qué tipo de recursos puede utilizar un sombreador. Incluso si un programa es correcto, podría ser demasiado complejo para funcionar con un perfil. [ 12 ]

A medida que surgieron más perfiles y tipos de sombreadores, Microsoft cambió al término "Modelo de sombreado" para agrupar un conjunto de perfiles que se encuentran en una generación de GPU. [ 14 ] Cg admite algunos de los perfiles más recientes hasta Shader Model 5.0, así como la traducción a glsl o hlsl. [ 13 ]

Las GPU que se muestran son las que inicialmente admitieron las especificaciones indicadas. Por lo general, los fabricantes admiten todos los modelos de sombreado inferiores mediante controladores. Cabe destacar que los juegos pueden indicar que requieren una versión específica de DirectX, pero no necesariamente una GPU que cumpla con todas las especificaciones de esa versión, ya que los desarrolladores pueden usar una versión superior de la API de DirectX para hardware con especificaciones inferiores a Direct3D; por ejemplo, DirectX 9 expone características del hardware de nivel DirectX 7 que DirectX 7 no ofrecía, aprovechando su canalización T&L de función fija.

Comparación de sombreadores de píxeles

  • PS 1.03dfx Rampage no publicado, DirectX 8
  • PS 1.1GeForce 3 , DirectX 8
  • PS 1.23Dlabs Wildcat VP, DirectX 8.1
  • PS 1.3 : GeForce 4 Ti , DirectX 8.1
  • PS 1.4Radeon 8500–9250 , Matrox Parhelia , DirectX 8.1
  • Shader Model 2.0Radeon 9500–9800/X300–X600 , DirectX 9
  • Shader Model 2.0a : modelo optimizado para GeForce FX/PCX , DirectX 9.0a
  • Shader Model 2.0b — Modelo de sombreado Radeon X700–X850 , DirectX 9.0b
  • Shader Model 3.0Radeon X1000 y GeForce 6 , DirectX 9.0c
  • Shader Model 4.0Radeon HD 2000 y GeForce 8 , DirectX 10
  • Shader Model 4.1Radeon HD 3000 y GeForce 200 , DirectX 10.1
  • Shader Model 5.0Radeon HD 5000 y GeForce 400 , DirectX 11
  • Shader Model 5.1GCN 1+ , Fermi+, DirectX 12 (11_0+) con WDDM 2.0
  • Shader Model 6.0 — GCN 1+, Kepler+, DirectX 12 (11_0+) con WDDM 2.1
  • Shader Model 6.1 — GCN 1+, Kepler+, DirectX 12 (11_0+) con WDDM 2.3
  • Shader Model 6.2 — GCN 1+, Kepler+, DirectX 12 (11_0+) con WDDM 2.4
  • Shader Model 6.3 — GCN 1+, Kepler+, DirectX 12 (11_0+) con WDDM 2.5
  • Shader Model 6.4 — GCN 1+, Kepler+, Skylake+, DirectX 12 (11_0+) con WDDM 2.6
  • Shader Model 6.5 — GCN 1+, Kepler+, Skylake+, DirectX 12 (11_0+) con WDDM 2.7
  • Shader Model 6.6 — GCN 4+, Maxwell+, DirectX 12 (11_0+) con WDDM 3.0
  • Shader Model 6.7 — GCN 4+, Maxwell+, DirectX 12 (12_0+) con WDDM 3.1
  • Shader Model 6.8 — RDNA 1+, Maxwell 2+, DirectX 12 (12_0+) con WDDM 3.1 / 3.2 con Agility SDK

"32 + 64" para Instrucciones Ejecutadas significa "32 instrucciones de textura y 64 instrucciones aritméticas".

Comparación de sombreadores de vértices

La biblioteca estándar

Al igual que en C, Cg/HLSL incluye un conjunto de funciones para tareas comunes en la programación de GPU. Algunas de estas funciones tienen equivalentes en C, como las funciones matemáticas abs y sin, mientras que otras están especializadas en tareas de programación de GPU, como las funciones de mapeo de texturas tex1D y tex2D.

La biblioteca de tiempo de ejecución Cg/HLSL

Los programas Cg/HLSL son simplemente sombreadores de vértices y píxeles, y requieren programas auxiliares que gestionen el resto del proceso de renderizado. Cg se puede usar con dos API gráficas : OpenGL o DirectX . Cada una tiene su propio conjunto de funciones Cg para comunicarse con el programa, como configurar el sombreador Cg actual, pasar parámetros, etc. (HLSL solo funciona con DirectX).

Además de poder compilar el código fuente de Cg a código ensamblador, el entorno de ejecución de Cg también puede compilar sombreadores durante la ejecución del programa. Esto permite que el entorno de ejecución compile el sombreador utilizando las últimas optimizaciones disponibles para el hardware en el que se está ejecutando el programa. Sin embargo, esta técnica requiere que el código fuente del sombreador esté disponible en texto plano para el compilador, lo que permite al usuario del programa acceder a dicho código. Algunos desarrolladores consideran esto una desventaja importante de esta técnica.

Para evitar exponer el código fuente del sombreador y, al mismo tiempo, mantener algunas de las optimizaciones específicas del hardware, se desarrolló el concepto de perfiles. Los sombreadores se pueden compilar para adaptarse a diferentes plataformas de hardware gráfico (según los perfiles). Al ejecutar el programa auxiliar, se carga el sombreador más optimizado según su perfil. Por ejemplo, podría haber un perfil para una tarjeta gráfica que admita sombreadores de píxeles complejos y otro para una que solo admita sombreadores de píxeles mínimos. Al crear un sombreador de píxeles para cada uno de estos perfiles, el programa auxiliar amplía el número de plataformas de hardware compatibles sin sacrificar la calidad de imagen en sistemas potentes.

Compiladores y dialectos

El dialecto Cg solo ha tenido un compilador, en forma del kit de herramientas Cg de Nvidia.

Microsoft ha lanzado dos compiladores para HLSL. El compilador original era el FXC (Effect Compiler) de código cerrado, con soporte hasta 2015. Fue descontinuado en favor del DXC (DirectXShaderCompiler) de código abierto basado en LLVM , con soporte para las nuevas características de HLSL. [ 24 ] Ambos compiladores generan bytecode: mientras que el antiguo FXC usaba DXBC, DXC ahora usa DXIL. DXC también puede generar bytecode SPIR-V . [ 25 ]

El Grupo Khronos también ha escrito un compilador HLSL basado en LLVM, en forma de interfaz para glslang , su compilador GLSL-to-SPIR_V. La compatibilidad con SPIR-V significa que los sombreadores pueden ser multiplataforma, sin limitarlos ya a una pila DirectX. [ 26 ] Esta tarea la realizaban anteriormente convertidores a nivel de código fuente como HLSL2GLSL , pero el código resultante suele ser excesivo. [ 27 ]

Lenguas derivadas

El lenguaje de sombreado de PlayStation (PSSL) se basa en Cg/HLSL. [ 28 ]

El lenguaje de sombreado ReshadeFX también se basa en Cg/HLSL. Los sombreadores escritos en ReshadeFX se compilan a OpenGL, DX o Vulkan y se inyectan en los juegos para actuar como filtros de posprocesamiento. [ 29 ]

Khronos ha evolucionado desde entonces glslang a slang , un lenguaje de sombreado y compilador que es mayormente compatible a nivel de código fuente con HLSL. Slang puede compilar a lenguajes de sombreado textuales (GLSL, MSL , CUDA, WGSL ), códigos de bytes (D3D11, D3D12, Vulkan SPIR-V ) y también a la CPU. También tiene un modo de compatibilidad con GLSL. [ 30 ]

Aplicaciones y juegos que utilizan Cg o HLSL

Véase también

Referencias

  1. "Cómo escribir sombreadores HLSL en Direct3D 9" . Microsoft Docs . Consultado el 22 de febrero de 2021 .
  2. "Lenguaje de sombreado de alto nivel (HLSL)" . Microsoft Docs . Consultado el 22 de febrero de 2021 .
  3. "Fusion Industries :: Preguntas frecuentes sobre Cg y HLSL ::" . 24 de agosto de 2012. Archivado del original el 24 de agosto de 2012.  
  4. "Fusion Industries :: Preguntas frecuentes sobre Cg y HLSL ::" . 24 de agosto de 2012. Archivado del original el 24 de agosto de 2012.  
  5. "El tutorial de Cg - Capítulo 1. Introducción" . developer.download.nvidia.cn .
  6. "Cómo escribir sombreadores HLSL en Direct3D 9 (Windows)" . msdn.microsoft.com . 24 de mayo de 2021.
  7. "Preguntas frecuentes sobre Cg" . NVIDIA DesignWorks . 8 de marzo de 2011. Consultado el 25 de mayo de 2017 .
  8. "Cg Toolkit | NVIDIA Developer" . 8 de marzo de 2011.
  9. "Notas de la versión Cg 2.0" (PDF) . nvidia.com . Enero de 2008.
  10. "Objetos del modelo de sombreado 5.1" . Microsoft Docs . Consultado el 22 de febrero de 2021 .
  11. "HLSL Shader Model 6.0" . Microsoft Docs . Consultado el 22 de febrero de 2021 .
  12. 1 2 Mark J. Kilgard , Cg en dos páginas , 2003.
  13. 1 2 "Documentación del perfil Cg" . Desarrollador de Nvidia .
  14. "Modelos de sombreado frente a perfiles de sombreado: aplicaciones Win32" . docs.microsoft.com . 30 de junio de 2021.
  15. 1 2 3 4 5 6 "Diferencias de sombreado de píxeles" . Microsoft Docs . 19 de agosto de 2020. Consultado el 22 de febrero de 2021 .
  16. 1 2 3 4 5 Peeper, Craig; Mitchell, Jason L. (julio de 2003). "Introducción al lenguaje de sombreado de alto nivel de DirectX 9" . Microsoft Docs . Recuperado el 22 de febrero de 2021 .
  17. 1 2 3 Shimpi, Anand Lal . "NVIDIA presenta GeForce FX (NV30)" . AnandTech . Archivado del original el 10 de junio de 2013. Recuperado el 22 de febrero de 2021 .
  18. Wilson, Derek. "ATI Radeon X800 Pro y XT Platinum Edition: Llega la R420" . AnandTech . Archivado del original el 28 de septiembre de 2012. Consultado el 22 de febrero de 2021 .
  19. 1 2 Shader Model 3.0, Ashu Rege, NVIDIA Developer Technology Group, 2004.
  20. 1 2 El sistema Direct3D 10, David Blythe, Microsoft Corporation, 2006.
  21. 1 2 "Registros - ps_4_1" . Microsoft Docs . 23 de agosto de 2019. Consultado el 22 de febrero de 2021 .
  22. 1 2 "Registros - ps_5_0" . Microsoft Docs . 23 de agosto de 2019. Consultado el 22 de febrero de 2021 .
  23. 1 2 3 4 "Diferencias del sombreador de vértices" . Microsoft Docs . 19 de agosto de 2020. Consultado el 22 de febrero de 2021 .
  24. "Portando de FXC a DXC" . GitHub .
  25. "microsoft/DirectXShaderCompiler: Este repositorio aloja el código fuente del compilador de sombreadores de DirectX, que se basa en LLVM/Clang" . Microsoft. 21 de octubre de 2020.
  26. "glslang: Interfaz de referencia de Khronos para GLSL/ESSL, interfaz parcial para HLSL y generador SPIR-V" . The Khronos Group. 21 de octubre de 2020.
  27. Matt Turner. Vídeo en YouTube .
  28. Stenson, Richard; Ho, Chris. "PlayStation Shading Language para PS4" . GDC Europe 2013 .
  29. "Lenguaje de sombreado ReShade FX" . GitHub . 15 de febrero de 2022.
  30. "shader-slang/slang" . El lenguaje del sombreado. 8 de diciembre de 2025.
  31. "Complemento CG para Maya | NVIDIA" .
  32. "LightWave - Descripción general de las características de la versión 11.6" .
  33. "Unity - Manual: Escritura de sombreadores" .

Lecturas adicionales

  • Randima Fernando, Mark J. Kilgard (2003), The Cg Tutorial : The Definitive Guide to Programmable Real-Time Graphics , Addison-Wesley Professional, ISBN 0-321-19496-9
  • Randima Fernando (2004), GPU Gems: Técnicas, consejos y trucos de programación para gráficos en tiempo real , Addison-Wesley Professional, ISBN 0-321-22832-4
  • William R. Mark, R. Steven Glanville, Kurt Akeley , Mark J. Kilgard , Cg: Un sistema para programar hardware gráfico en un lenguaje similar a C , Actas de SIGGRAPH 2003, doi : 10.1145/1201775.882362
  • cgc-opensrc - Espejo del compilador de código abierto de Nvidia, 2002
  • Algunos materiales esenciales (por ejemplo, el documento de diseño) se recopilan en estas notas del curso de Siggraph 2005.
  • Materiales alojados por Nvidia:
    • Preguntas frecuentes de Cg
    • Kit de herramientas CG
    • Referencia y documentación del lenguaje Cg
  • Tutorial de sombreado de vértices NeHe Cg
  • Documentación del estándar Cg Shader utilizado por los emuladores.
  • Aras Pranckevičius, Shaders multiplataforma en 2014 .
  • Guía de programación para HLSL en Microsoft Docs
  • Introducción al lenguaje de sombreado de alto nivel DirectX 9 , (ATI) AMD Developer Central
  • Introducción y tutorial de HLSL de Riemer (incluye código de ejemplo). Archivado el 19 de noviembre de 2008 en Wayback Machine .
  • Introducción a HLSL
  • Especificación del lenguaje intermedio de DirectX (DXIL)