Język cieniowania

Język cieniowania to graficzny język programowania przystosowany do programowania efektów cieniowania (charakteryzujących powierzchnie, objętości i obiekty). Takie formy językowe zwykle składają się ze specjalnych typów danych , takich jak „wektor”, „ macierz ”, „kolor” i „ normalny ”. Ze względu na różnorodność rynków docelowych grafiki komputerowej 3D opracowano różne języki cieniowania.

Renderowanie offline

Języki cieniowania używane w renderowaniu offline zapewniają najwyższą jakość obrazu. Właściwości materiałów są całkowicie abstrakcyjne, niewielkie umiejętności programowania i nie jest wymagana żadna znajomość sprzętu. Tego rodzaju shadery są często opracowywane przez artystów, aby uzyskać odpowiedni „wygląd”, podobnie jak mapowanie tekstur, oświetlenie i inne aspekty ich pracy.

Przetwarzanie takich shaderów jest czasochłonne. Wymagana moc obliczeniowa może być kosztowna ze względu na ich zdolność do uzyskiwania fotorealistycznych wyników. W większości przypadków renderowanie produkcyjne odbywa się w dużych klastrach komputerowych .

Język cieniowania RenderMan

Język cieniowania RenderMan (często określany w skrócie jako RSL lub SL), który jest zdefiniowany w specyfikacji interfejsu RenderMan, jest najczęściej używanym językiem cieniowania do renderowania o jakości produkcyjnej. [ potrzebne źródło ] Jest to również jeden z pierwszych języków cieniowania, jakie kiedykolwiek zaimplementowano.

Język definiuje sześć głównych typów shaderów:

  • Moduły cieniujące źródła światła obliczają kolor światła emitowanego od punktu na źródle światła w kierunku punktu na powierzchni docelowej.
  • Shadery powierzchniowe modelują właściwości optyczne oświetlanego obiektu. Wyprowadzają ostateczny kolor i położenie punktu, biorąc pod uwagę wpadające światło i właściwości fizyczne obiektu.
  • Shadery przemieszczeń manipulują geometrią powierzchni niezależnie od koloru.
  • Shadery deformacji przekształcają całą przestrzeń geometrii. Tylko jedna implementacja RenderMana, renderer AIR firmy SiTex Graphics, zaimplementowała ten typ modułu cieniującego, obsługując tylko pojedynczą transformację liniową zastosowaną do przestrzeni (bardziej przypominał moduł cieniujący Transformation, jeśli taki typ istniał).
  • Moduły cieniujące wolumenu manipulują kolorem światła przechodzącego przez objętość. Tworzą efekty takie jak mgła .
  • Moduły cieniujące Imager opisują transformację kolorów do końcowych wartości pikseli. Jest to bardzo podobne do filtra obrazu , jednak shader imagera działa na danych przed kwantyzacją . Takie dane mają większy zakres dynamiczny i rozdzielczość kolorów niż mogą być wyświetlane na typowym urządzeniu wyjściowym.

Język cieniowania Houdini VEX

Język cieniowania Houdini VEX (Vector Expressions) (często w skrócie „VEX”) jest ściśle wzorowany na RenderManie. Jednak jego integracja z kompletnym pakietem 3D oznacza, że ​​twórca modułu cieniującego może uzyskać dostęp do informacji wewnątrz modułu cieniującego, co zwykle nie jest dostępne w kontekście renderowania. Różnice językowe między RSL i VEX są głównie składniowe, oprócz różnic dotyczących nazw kilku shadeopów .

Język cieniowania Gelato

Język cieniowania Gelato , podobnie jak VEX Houdiniego , jest ściśle wzorowany na RenderManie. Różnice między Gelato Shading Language a RSL są głównie składniowe — Gelato używa średników zamiast przecinków do oddzielania argumentów w definicjach funkcji, a kilka shadeopów ma różne nazwy i parametry.

Otwórz język cieniowania

Język Open Shading Language (OSL) został opracowany przez firmę Sony Pictures Imageworks do użytku w programie Arnold Renderer. Jest również używany przez silnik renderujący Cycles Blendera . Shadery powierzchni i objętości OSL określają, w jaki sposób powierzchnie lub objętości rozpraszają światło w sposób, który pozwala na próbkowanie ważności; w związku z tym dobrze nadaje się do rendererów opartych na fizyce , które obsługują ray tracing i globalne oświetlenie.

Renderowanie w czasie rzeczywistym

Języki cieniowania do renderowania w czasie rzeczywistym są obecnie szeroko rozpowszechnione. Zapewniają zarówno wyższą abstrakcję sprzętową, jak i bardziej elastyczny model programowania niż poprzednie paradygmaty, które zakodowały na stałe równania transformacji i cieniowania. Daje to programiście większą kontrolę nad procesem renderowania i zapewnia bogatszą zawartość przy niższych nakładach.

Moduły cieniujące zaprojektowane do wykonywania bezpośrednio na GPU stały się przydatne do ogólnego przetwarzania o dużej przepustowości ze względu na ich model programowania strumieniowego ; doprowadziło to do rozwoju shaderów obliczeniowych działających na podobnym sprzęcie (patrz też: GPGPU ).

Historycznie tylko kilka takich języków odniosło sukces zarówno w ugruntowaniu swojej pozycji, jak i utrzymaniu silnej pozycji rynkowej; krótki opis tych języków znajduje się poniżej.

Język asemblera ARB

Rada przeglądowa architektury OpenGL ustanowiła język asemblera ARB w 2002 roku jako standardowy zestaw instrukcji niskiego poziomu dla programowalnych procesorów graficznych.

Wysokopoziomowe języki cieniowania OpenGL często kompilują się do asemblera ARB w celu załadowania i wykonania. W przeciwieństwie do języków cieniowania wysokiego poziomu, asembler ARB nie obsługuje przepływu sterowania ani rozgałęzień. Jednak nadal jest używany, gdy wymagana jest przenośność między GPU.

Język cieniowania OpenGL

znany również jako GLSL lub glslang , jest przeznaczony do użytku z OpenGL .

Język ujednolica przetwarzanie wierzchołków i fragmentów w jednym zestawie instrukcji, umożliwiając pętle warunkowe i (bardziej ogólnie) rozgałęzienia . Historycznie GLSL był poprzedzony asemblerem ARB .

Język programowania CG

Język programowania Cg , opracowany przez firmę NVIDIA , został zaprojektowany z myślą o łatwej i wydajnej integracji potoków produkcyjnych. Język zapewnia niezależność od API i jest wyposażony w wiele bezpłatnych narzędzi usprawniających zarządzanie zasobami. Rozwój Cg został zatrzymany w 2012 roku, a język jest obecnie przestarzały.

Język asemblera modułu cieniującego DirectX

Język asemblera shaderów w Direct3D 8 i 9 jest głównym językiem programowania dla shaderów wierzchołków i pikseli w Shader Model 1.0/1.1, 2.0 i 3.0. Język asemblera modułu cieniującego jest bezpośrednią reprezentacją pośredniego kodu bajtowego modułu cieniującego, który jest przekazywany do sterownika graficznego w celu wykonania.

Język asemblera modułu cieniującego nie może być bezpośrednio używany do programowania zunifikowanego modelu modułu cieniującego 4.0, 4.1, 5.0 i 5.1, chociaż zachowuje swoją funkcję jako reprezentacja pośredniego kodu bajtowego do celów debugowania.

Język shaderów wysokiego poziomu DirectX

Język cieniowania wysokiego poziomu (w skrócie HLSL) to język cieniowania w stylu C dla DirectX 9 i nowszych oraz konsol do gier Xbox. Jest powiązany z Cg Nvidii, ale jest obsługiwany tylko przez DirectX i Xbox. Programy HLSL są kompilowane w odpowiednik kodu bajtowego języka asemblera modułu cieniującego DirectX.

HLSL został wprowadzony jako opcjonalna alternatywa dla języka asemblera modułu cieniującego w Direct3D 9, ale stał się wymaganiem w Direct3d 10 i nowszych, gdzie język asemblera modułu cieniującego jest przestarzały.

Adobe Pixel Bender i Adobe Graphics Assembly Language

Firma Adobe Systems dodała Pixel Bender jako część interfejsu API Adobe Flash 10. Pixel Bender mógł przetwarzać tylko dane pikseli, ale nie dane wierzchołków 3D. Flash 11 wprowadził całkowicie nowy interfejs API 3D o nazwie Stage3D , który wykorzystuje własny język cieniowania o nazwie Adobe Graphics Assembly Language (AGAL), który oferuje pełną obsługę akceleracji 3D. Akceleracja GPU dla Pixel Bender została usunięta we Flashu 11.8.

AGAL to niskopoziomowy, ale niezależny od platformy język cieniowania, który można skompilować na przykład do asemblera ARB [ potrzebne źródło ] lub GLSL .

Język cieniowania PlayStation

Sony ogłosiło PSSL ( PlayStation Shader Language ) jako specyficzny dla platformy język cieniowania podobny do Cg/HLSL dla PlayStation 4 . Mówi się, że jest w dużej mierze kompatybilny z shaderami HLSL na PC, ale z dodatkowymi funkcjami na platformę PS4.

Język cieniowania metalu

Apple stworzył graficzny interfejs API niskiego poziomu o nazwie Metal , który działa na większości komputerów Mac wyprodukowanych od 2012 roku, iPhone'ów od 5S i iPadów od iPada Air. Metal wprowadza własny język cieniowania o nazwie Metal Shading Language (MSL), który jest oparty na C++ 14 i zaimplementowany przy użyciu clang i LLVM . MSL ujednolica przetwarzanie wierzchołków, fragmentów i obliczeń.

Język cieniowania WebGPU

WebGPU Shading Language (WGSL) to język shaderów dla WebGPU . Oznacza to, że aplikacja korzystająca z interfejsu API WebGPU używa WGSL do wyrażania programów, znanych jako moduły cieniujące, które działają na GPU.

Tłumaczenie

Ponieważ dostępnych jest coraz więcej graficznych interfejsów API, programiści stają przed problemem przenoszenia shaderów z jednego języka cieniowania na inny. Stosuje się kilka podejść:

  • Ręczne przełączanie przy użyciu instrukcji preprocesora C (CPP). Cg/HLSL, GLSL i MSL implementują makra CPP, więc możliwe jest umieszczenie wszystkich różnych operacji we wspólnym interfejsie. Robią to Source 2 firmy Valve i FXAA 3.11 firmy NVIDIA.
  • Przetłumacz jeden język na drugi. Kod bajtowy DirectX można częściowo przekonwertować na GLSL przez HLSLcc, a istnieje kilka narzędzi do konwersji GLSL na HLSL, takich jak ANGLE i HLSL2GLSL .
  • Zdefiniuj inny język pośredni. SPIR-V jest częściowo zaprojektowany do tego celu. Można go wygenerować z HLSL lub GLSL i zdekompilować do HLSL, GLSL lub MSL.

Notatki

  1. ^ Poprzednie języki cieniowania wierzchołków (w przypadkowej kolejności) dla OpenGL obejmują EXT_vertex_shader , NV_vertex_program , wspomniany wyżej ARB_vertex_program , NV_vertex_program2 i NV_vertex_program3 .
  2. ^ W przypadku cieniowania fragmentów nvparse jest prawdopodobnie pierwszym językiem cieniowania obsługującym abstrakcję wysokiego poziomu opartą na NV_register_combiners , NV_register_combiners2 dla matematyki pikseli i NV_texture_shader , NV_texture_shader2 i NV_texture_shader3 do wyszukiwania tekstur. ATI_fragment_shader nie zapewnia nawet funkcji analizowania „zorientowanej na łańcuch” (chociaż została później dodana przez ATI_text_fragment_shader ). ARB_fragment_program , był bardzo udany. NV_fragment_program i NV_fragment_program2 są w rzeczywistości podobne, chociaż ten drugi zapewnia znacznie bardziej zaawansowaną funkcjonalność w stosunku do innych.
  3. ^ Kompozytor Fx ze strony głównej NVIDIA, http://developer.nvidia.com/object/fx_composer_home.html
  4.   Rudy Cortes i Saty Raghavachary: The RenderMan Shading Language Guide , Course Technology PTR, wydanie 1 (27 grudnia 2007), ISBN 1-59863-286-8