Shader: Różnice pomiędzy wersjami

Z Wikipedii, wolnej encyklopedii
[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
m drobne merytoryczne, drobne redakcyjne, poprawa linków
m drobne merytoryczne, drobne redakcyjne, poprawa linków
Linia 1: Linia 1:
'''Shader''' – krótki [[Oprogramowanie|program]] komputerowy, często napisany w specjalnym języku programowania (''shader language''), który w [[Grafika 3D|grafice trójwymiarowej]] opisuje właściwości [[piksel]]i oraz [[Wierzchołek (grafika 3D)|wierzchołków]]. Technologia ta zastąpiła stosowaną wcześniej w [[Karta graficzna|kartach graficznych]] jednostkę [[Transform and Lighting|T&L]].
'''Shader''' – krótki [[Oprogramowanie|program]] komputerowy, często napisany w specjalnym języku programowania (''shader language''), który w [[Grafika 3D|grafice trójwymiarowej]] opisuje właściwości [[piksel]]i oraz [[Wierzchołek (grafika 3D)|wierzchołków]]. Technologia ta zastąpiła stosowaną wcześniej w [[Karta graficzna|kartach graficznych]] jednostkę [[Transform and Lighting|T&L]].


'''Cieniowanie''' pozwala na znacznie bardziej skomplikowane modelowanie oświetlenia i [[Materiał (grafika 3D)|materiału]] na obiekcie niż standardowe modele [[Oświetlenie (grafika komputerowa)|oświetlenia]] i [[teksturowanie]]. Jest jednak dużo bardziej [[Moc obliczeniowa|wymagające obliczeniowo]] i dlatego dopiero od wprowadzenia bibliotek [[Interfejs programowania aplikacji|API]] DirectX 8 (rok 2000) sprzętowa obsługa cieniowania pojawiła się wśród możliwości [[karta graficzna|kart graficznych]] [[Komputer osobisty|komputerów osobistych]]. Wcześniej cieniowanie stosowane było tylko w niektórych fotorealistycznych [[Renderowanie|rendererach]] (np. [[Renderman]]), gdzie grafika nie jest jednak generowana w [[Czas rzeczywisty|czasie rzeczywistym]].
'''Cieniowanie''' pozwala na znacznie bardziej skomplikowane modelowanie oświetlenia i [[Materiał (grafika 3D)|materiału]] na obiekcie niż standardowe modele [[Oświetlenie (grafika komputerowa)|oświetlenia]] i [[teksturowanie]]. Jest jednak dużo bardziej [[Moc obliczeniowa|wymagające obliczeniowo]] i dlatego dopiero od wprowadzenia bibliotek [[Interfejs programowania aplikacji|API]] [[DirectX]] 8 (rok 2000) sprzętowa obsługa cieniowania pojawiła się wśród możliwości [[karta graficzna|kart graficznych]] [[Komputer osobisty|komputerów osobistych]]. Wcześniej cieniowanie stosowane było tylko w niektórych fotorealistycznych [[Renderowanie|rendererach]] (np. [[Renderman]]), gdzie grafika nie jest jednak generowana w [[Czas rzeczywisty|czasie rzeczywistym]].


W stosunku do standardowych modeli oświetlenia, stosowanych do generowania grafiki w czasie rzeczywistym, cieniowanie umożliwia uwzględnienie między innymi:
W stosunku do standardowych modeli oświetlenia, stosowanych do generowania grafiki w czasie rzeczywistym, cieniowanie umożliwia uwzględnienie między innymi:
Linia 21: Linia 21:
'''Cieniowanie geometryczne''' – pozwala na dodawanie lub usuwanie wierzchołków z [[Siatka (grafika 3D)|siatki wierzchołków]] (ang. ''mesh''). Może być używane do proceduralnego tworzenia obiektów geometrycznych albo do dodawania objętościowych detali istniejących siatek wierzchołków. Te operacje mogłyby być zbyt kosztowne obliczeniowo dla [[Procesor|CPU]]. Direct3D 10 i OpenGL 3.1 mają już zawarte wsparcie dla tego typu cieniowania. Jeśli cieniowanie geometryczne jest używane, to wtedy jego wyjście jest przekazywane na wejście rasteryzatora.
'''Cieniowanie geometryczne''' – pozwala na dodawanie lub usuwanie wierzchołków z [[Siatka (grafika 3D)|siatki wierzchołków]] (ang. ''mesh''). Może być używane do proceduralnego tworzenia obiektów geometrycznych albo do dodawania objętościowych detali istniejących siatek wierzchołków. Te operacje mogłyby być zbyt kosztowne obliczeniowo dla [[Procesor|CPU]]. Direct3D 10 i OpenGL 3.1 mają już zawarte wsparcie dla tego typu cieniowania. Jeśli cieniowanie geometryczne jest używane, to wtedy jego wyjście jest przekazywane na wejście rasteryzatora.


=== Pixel Shader lub Fragment Shader ===
=== Pixel Shader, Fragment Shader ===
'''Cieniowanie pikseli''' – jest jednostką odpowiadającą za wyliczanie koloru [[piksel]]i. Direct3D używa terminu ''pixel shader'', a OpenGL – ''fragment shader''. Piksele na wejście tego etapu cieniowania są pobierane z rasteryzatora, który wypełnia wielokąty przesyłane z potoku graficznego. Cieniowanie pikseli jest najczęściej używane do oświetlenia sceny i innych powiązanych efektów, np. [[Mapowanie wypukłości|bump-mappingu]] lub kolorowania.
'''Cieniowanie pikseli''' – jest jednostką odpowiadającą za wyliczanie koloru [[piksel]]i. Direct3D używa terminu ''pixel shader'', a OpenGL – ''fragment shader''. Piksele na wejście tego etapu cieniowania są pobierane z rasteryzatora, który wypełnia wielokąty przesyłane z potoku graficznego. Cieniowanie pikseli jest najczęściej używane do oświetlenia sceny i innych powiązanych efektów, np. [[Mapowanie wypukłości|bump-mappingu]] lub kolorowania.


Linia 49: Linia 49:


== Przetwarzanie równoległe ==
== Przetwarzanie równoległe ==
Cieniowanie jest wykorzystywane do zaaplikowania przekształceń na dużym zbiorze elementów jednocześnie, np. na każdym pikselu ekranu albo dla każdego wierzchołka modelu. Oznacza to [[przetwarzanie równoległe]]. Najnowsze GPU mają [[Architektura wielordzeniowa|architekturę wielordzeniową]], specjalnie dostosowaną do tego rodzaju przetwarzania. Jest zatem możliwe używanie GPU nie tylko do obliczeń graficznych, ale także do obliczeń ogólnych (naukowych, inżynierskich, itd.). Przykładowymi środowiskami programistycznymi do takich ogólnych obliczeń są: [[CUDA]], [[BrookGPU]] i [[OpenCL]].
Cieniowanie jest wykorzystywane do zaaplikowania przekształceń na dużym zbiorze elementów jednocześnie, np. na każdym pikselu ekranu albo dla każdego wierzchołka modelu. Wymaga to więc zastosowania [[Obliczenia równoległe|przetwarzania równoległego]]. Najnowsze [[Procesor graficzny|GPU]] mają [[Procesor wielordzeniowy|architekturę wielordzeniową]], specjalnie dostosowaną do tego rodzaju przetwarzania. Jest zatem możliwe używanie GPU nie tylko do obliczeń graficznych, ale także do obliczeń ogólnych (naukowych, inżynierskich, itd.), co nosi nazwę [[GPGPU]]. Przykładowymi środowiskami programistycznymi do takich ogólnych obliczeń są: [[CUDA]], [[BrookGPU]], [[OpenCL]] i [[DirectCompute]].


== Języki cieniowania ==
== Języki cieniowania ==
Współczesne języki cieniowania:
Do współczesnych języków cieniowania należą:
* [[RenderMan Shading Language|RSL]] - RenderMan Shading Language (fragment standardu [[RenderMan Interface Specification|RiSpec]])
* [[RenderMan Shading Language|RSL]] RenderMan Shading Language (fragment standardu [[RenderMan Interface Specification|RiSpec]]),
* [[Vector EXpression|VEX]] - Vector Expression (bliski językowi RSL, język renderera Side Effects Mantra)
* [[Vector EXpression|VEX]] Vector Expression (bliski językowi RSL, język renderera Side Effects Mantra),
* [[OpenGL Shading Language|GLSL]] – OpenGL Shading Language (fragment standardu OpenGL)
* [[OpenGL Shading Language|GLSL]] – OpenGL Shading Language (fragment standardu OpenGL),
* HLSL – High Level Shading Language (język cieniowania biblioteki DirectX)
* HLSL – High Level Shading Language (język cieniowania biblioteki DirectX),
* [[Cg (język programowania)|Cg]] – C for graphics (opracowany przez firmę nVidia)
* [[Cg (język programowania)|Cg]] – C for graphics (opracowany przez firmę nVidia),
* [[Open Shading Language|OSL]] - Open Shading Language (standard opracowany przez firmę [[Sony Pictures Imageworks]] na licencji BSD).
* [[Open Shading Language|OSL]] Open Shading Language (standard opracowany przez firmę [[Sony Pictures Imageworks]] na licencji BSD).

== Zobacz też ==

* [[teselacja]]


== Linki zewnętrzne ==
== Linki zewnętrzne ==

Wersja z 00:46, 3 gru 2018

Shader – krótki program komputerowy, często napisany w specjalnym języku programowania (shader language), który w grafice trójwymiarowej opisuje właściwości pikseli oraz wierzchołków. Technologia ta zastąpiła stosowaną wcześniej w kartach graficznych jednostkę T&L.

Cieniowanie pozwala na znacznie bardziej skomplikowane modelowanie oświetlenia i materiału na obiekcie niż standardowe modele oświetlenia i teksturowanie. Jest jednak dużo bardziej wymagające obliczeniowo i dlatego dopiero od wprowadzenia bibliotek API DirectX 8 (rok 2000) sprzętowa obsługa cieniowania pojawiła się wśród możliwości kart graficznych komputerów osobistych. Wcześniej cieniowanie stosowane było tylko w niektórych fotorealistycznych rendererach (np. Renderman), gdzie grafika nie jest jednak generowana w czasie rzeczywistym.

W stosunku do standardowych modeli oświetlenia, stosowanych do generowania grafiki w czasie rzeczywistym, cieniowanie umożliwia uwzględnienie między innymi:

Rodzaje cieniowania

Obecnie, z uwagi na wymagania bibliotek DirectX w wersji 10, zniknął podział panujący dotychczas na Pixel Shader i Vertex Shader. Obliczenia, jakimi te odrębne jednostki się zajmowały, są teraz wykonywane przez jednolite jednostki obliczeniowe, które są dynamicznie przydzielane do odpowiedniego typu zadań, w zależności od bieżącej potrzebny. Rozwiązanie takie zostało nazwane przez ATI Stream Processors, a przez nVidięUnified Shaders.

Biblioteki graficzne Direct3D i OpenGL używają trzech typów cieniowania:

Vertex Shader

Cieniowanie wierzchołkowe – uruchamiane jest raz dla poszczególnych przetwarzanych wierzchołków. Jego zadaniem jest transformacja położenia wierzchołka w wirtualnej przestrzeni 3D na współrzędne 2D na ekranie. Cieniowanie wierzchołkowe może operować na takich własnościach wierzchołków jak położenie, kolor i współrzędne tekstur, ale nie może tworzyć nowych wierzchołków. Wyjście cieniowania wierzchołkowego jest wejściem dla następnego etapu w potoku, jakim jest albo cieniowanie geometryczne (jeśli jest obecne), albo rasteryzacja.

Geometry Shader

Cieniowanie geometryczne – pozwala na dodawanie lub usuwanie wierzchołków z siatki wierzchołków (ang. mesh). Może być używane do proceduralnego tworzenia obiektów geometrycznych albo do dodawania objętościowych detali istniejących siatek wierzchołków. Te operacje mogłyby być zbyt kosztowne obliczeniowo dla CPU. Direct3D 10 i OpenGL 3.1 mają już zawarte wsparcie dla tego typu cieniowania. Jeśli cieniowanie geometryczne jest używane, to wtedy jego wyjście jest przekazywane na wejście rasteryzatora.

Pixel Shader, Fragment Shader

Cieniowanie pikseli – jest jednostką odpowiadającą za wyliczanie koloru pikseli. Direct3D używa terminu pixel shader, a OpenGL – fragment shader. Piksele na wejście tego etapu cieniowania są pobierane z rasteryzatora, który wypełnia wielokąty przesyłane z potoku graficznego. Cieniowanie pikseli jest najczęściej używane do oświetlenia sceny i innych powiązanych efektów, np. bump-mappingu lub kolorowania.

Poniższa tabela przedstawia, które wersje jednostek cieniowania odpowiadają poszczególnym wersjom bibliotek DirectX.

Wersja DirectX Pixel Shader Vertex Shader
8.0 1.0, 1.1 1.0
8.1 1.2, 1.3, 1.4 1.1
9.0 2.0 2.0
9.0a 2_A, 2_B 2.x
9.0c 3.0 3.0
10.0 4.0 4.0
10.1 4.1 4.1
11 5.0 5.0
12 5.1 5.1

Przetwarzanie równoległe

Cieniowanie jest wykorzystywane do zaaplikowania przekształceń na dużym zbiorze elementów jednocześnie, np. na każdym pikselu ekranu albo dla każdego wierzchołka modelu. Wymaga to więc zastosowania przetwarzania równoległego. Najnowsze GPU mają architekturę wielordzeniową, specjalnie dostosowaną do tego rodzaju przetwarzania. Jest zatem możliwe używanie GPU nie tylko do obliczeń graficznych, ale także do obliczeń ogólnych (naukowych, inżynierskich, itd.), co nosi nazwę GPGPU. Przykładowymi środowiskami programistycznymi do takich ogólnych obliczeń są: CUDA, BrookGPU, OpenCL i DirectCompute.

Języki cieniowania

Do współczesnych języków cieniowania należą:

  • RSL – RenderMan Shading Language (fragment standardu RiSpec),
  • VEX – Vector Expression (bliski językowi RSL, język renderera Side Effects Mantra),
  • GLSL – OpenGL Shading Language (fragment standardu OpenGL),
  • HLSL – High Level Shading Language (język cieniowania biblioteki DirectX),
  • Cg – C for graphics (opracowany przez firmę nVidia),
  • OSL – Open Shading Language (standard opracowany przez firmę Sony Pictures Imageworks na licencji BSD).

Zobacz też

Linki zewnętrzne

  • Publikacja nVidii o CUDA, środowisku programistycznym i kompilatorze języka programowania do pisania aplikacji uruchamianych na jednostkach shaderowych w kartach graficznych (ang.)