Siirry sisältöön

Shader-ohjelma

Wikipediasta

Shader-ohjelma (toisinaan vain shader tai ohjelma) eli varjostin[1][2][3] tai sävytin[4][2][5] on ohjelma, joka mahdollistaa grafiikkaliukuhihnan muokkaamisen ja on kirjoitettu tarkoitukseen suunnatulla kielellä.[6] Robert L. Cookin artikkeli Shade Trees julkaistiin vuonna 1984 ja RenderManin RenderMan Shading Language -kieli kehittyi tästä ideasta.[7][8] Nimitys, joka johtuu historiallisista syistä,[6][7] on peräisin alkuperäisestä käytöstä valaistuksen (eli varjostuksen) ja värien laskemiseen[9], mutta nykyisin niitä voidaan käyttää myös liikkeeseen, animointiin sekä kohteiden taivuttamiseen.[10][11]

RenderManin kieltä on yritetty soveltaa myös grafiikkasuorittimille (GPU), jolloin havaittiin tärkeiden toimintojen puuttuminen täyteen ohjelmoitavuuteen.[7]

Grafiikkasuorittimien ominaisuudet ovat kehittyneet kiinteätoimisista (konfiguroitavista) suuremmalle ohjelmoitavuudelle.[7] Tyypillisessä grafiikkaliukuhihnassa on vaiheet:[6]

  1. (verteksit) verteksikohtainen muunnos näyttöavaruuteen
  2. (rasterointi) kolmiokohtainen iteraatio, perspektiivikorjaus
  3. (pikseli) pikselikohtainen varjostus
  4. (lopputuloksen yhdistäminen) varjostuksen yhdistäminen väri- ja syvyyspuskurien kanssa

Ohjelmoitavassa liukuhihnassa vaiheiden järjestys on kiinteä, mutta niiden toteutus on ohjelmoitavissa.[6] Aluksi ohjelmoitavuus keskittyi pikselien varjostukseen, mutta shader-mallien kehityksen myötä myös muut vaiheet tulivat ohjelmoitaviksi sekä merkittäviä uusia vaiheita kuten geometrian käsittely.[7] Sonyn PlayStation 3:ssa ja Microsoftin Xbox 360:ssa oli mukana edistyneet ominaisuudet (Shader Model 3.0) ja kiinteätoiminen liukuhihna oli vähentynyt: Nintendon Wii oli mahdollisesti viimeinen kiinteätoimista liukuhihnaa käyttävä pelikonsoli.[7]

Grafiikkasuorittimien varhainen ohjelmointi suoritettiin assemblyn kaltaisella kielellä, mutta myöhemmin on rajattu mahdollisuudet käyttämään vain korkean tason ohjelmointikieliä kuten HLSL ja GLSL (OpenGL Shading Language): assembly on näkyvillä vain debuggausta varten.[7] Unified Shader -mallissa grafiikkaliukuhihnan eri vaiheilla on samat ominaisuudet.[12]

Shader-tyypit

[muokkaa | muokkaa wikitekstiä]

Vertex shader (verteksivarjostin) suoritetaan mallin ja näkymän muunnoksien (engl. transformation) sekä projektion vaiheessa.[7] Vertex shaderin käyttökohteita ovat muun muassa hahmon liikkeiden animointi ja veden pinnan muodonmuutokset.[13] Pixel shader viittaa ohjelmaan, joka suoritetaan pikselikohtaisessa vaiheessa ja laskee efektin pikselikohtaisesti.[6][14]

Fragment shader (fragmenttivarjostin) on suoritusvaihe, joka käsittelee rasteroinnin tuottaman fragmentin.[15] Fragment viittaa kolmion osaan, joka on päällekkäinen pikselin kanssa.[6]

Geometry shader (geometriavarjostin) on heti verteksivaiheen jälkeen suoritettava, jolle annetaan primitiivi sekä mahdollisesti siihen liittyvät ja se voi tuottaa useampia primitiivejä (lisäys) tai ei yhtään (poistaminen).[7][16] Geometry shader on valinnainen ja voidaan käyttää tesselaatioon ennen verteksien jälkikäsittelyä.[17] Tesselaatioon on myös Tessellation Control Shader sekä Tessellation Evaluation Shader.[18] Sonylla ja Microsoftilla on tesselaation käsittelyvaiheet (hull- ja domain-vaiheet).[19][20]

AMD on esitellyt vuonna 2017 Vega-arkkitehtuurin myötä primitive shader -tyyppisen geometriavaiheen, joka on computer shaderin kaltainen tiedon käsittelyssä.[21] Tämän tavoitteena on tehokkaampi primitiivien poisto ja siten tehokkaampi renderöinti.[21] Nvidia on esitellyt Turing-arkkitehtuurin myötä vastaavan mesh shader -vaiheen.[22] Vulkan-rajapinnassa mesh-shader toimii vaihtoehtoisena geometrian käsittelynä ja yksinkertaistaa geometrian käsittelyn pienempään määrään vaiheita tarjoamalla vaihtoehdon perinteisille verteksi-, tesselaatio- ja geometria-vaiheille.[23] Mesh-shaderin kanssa voi käyttää valinnaista task-shader vaihetta (amplification shader DirectX:ssä), joiden tuloksen voi syöttää suoraan rasterointiin.[23] Geometrian käsittelyn lisäksi mesh-shader voi tehdä yksinkertaisia laskentaoperaatioita.[23]

Compute shader (laskentavarjostin) on laskennalliseen GPGPU-käyttöön suunnattu ohjelma, joka ei ole osa normaalia renderöintiliukuhihnaa.[24][25][26] Laskennalliseen käyttöön on kehitetty arkkitehtuurit kuten Nvidian CUDA, Microsoftin DirectCompute sekä OpenCL, jotka käyttävät SPMD-ohjelmointimallia (Single Program Multiple Data).[27] SPMD-mallit käyttävät SIMD-ytimiä ja ohittavat grafiikkaliukuhihnan käyttäen vain yhtä laskentavaihetta.[27]

Kieliä on kehitetty lukuisia sekä offline-renderöintiin (elokuvateollisuus) että reaaliaikaiseen käyttöön.

Offline-renderöinti

[muokkaa | muokkaa wikitekstiä]

Reaaliaikainen renderöinti

[muokkaa | muokkaa wikitekstiä]
  1. Ranki, Ville: QML – deklaratiivisen käyttöliittymän alkeet. Skrolli, 2013, nro 1. Artikkelin verkkoversio. Viitattu 6.11.2025.
  2. a b Joensuu, Janne: 3D-alan sanasto – 3D-grafiikan termit suomeksi, s. 6. Kajaanin ammattikorkeakoulu, 54. Teoksen verkkoversio (PDF) Viitattu 6.11.2025.
  3. Hevosmaa, Tuukka: 3D-näkymän ohjelmointi OpenGL 4.5 -ohjelmointirajapinnalla, s. 2–3. Centria-ammattikorkeakoulu, 54. Teoksen verkkoversio (PDF) Viitattu 6.11.2025.
  4. Mattila, Anna-Liisa: 3D-käyttöliittymäkomponenttikirjaston toteuttaminen web-tekniikoilla, s. IX. Tampereen teknillinen yliopisto, 54. Teoksen verkkoversio (PDF) Viitattu 6.11.2025.: "Sävytin ... Engl. Shader."
  5. Kotajärvi, Noora: Kolmiulotteinen tuotekuva: 3D-mallintaminen mainontaan ja mainokseen suunnatun tuotekuvan toteutustekniikkana, s. 16. Lapin yliopisto, 54. Teoksen verkkoversio (PDF) Viitattu 6.11.2025.: "Materiaalit ovat yleensä yhdistelmä sävytintä (shader) ja tekstuuria [...]"
  6. a b c d e f Akeley, Feiner, Foley, Hughes, Van Dam, McGuire, Sklar: Computer Graphics Principles and Practice, s. 8, 432–433, 930. (Third Edition) Addison-Wesley, 2014. ISBN 978-0-321-39952-6 (englanniksi)
  7. a b c d e f g h i Akenine-Möller, Tomas & Haines, Eric & Hoffman, Naty: Real-Time Rendering, s. 29–35, 41. (Third Edition) CRC Press, 2008. ISBN 978-1-56881-424-7 (englanniksi)
  8. Robert L. Cook: Shade Trees (PDF) citeseerx.ist.psu.edu. Viitattu 12.1.2021. (englanniksi)
  9. Driemeyer, Thomas; Herken, Rolf. Programming mental ray (2003, 2. painos). Springer-Verlag Wien New York. ISBN 3-211-83851-1
  10. Kavalans, Andrejs: Exploring Modern Shader Technologies and Their Capabilities with WebGPU theseus.fi. 2025. Viitattu 6.11.2025. (englanniksi)
  11. Peyman Torabi: Skeletal Animation Optimization Using Mesh Shaders (PDF) diva-portal.org. kesäkuu 2019. Viitattu 6.11.2025. (englanniksi)
  12. Common-Shader Core msdn.microsoft.com. Microsoft. Viitattu 26.1.2017.
  13. Vertex Shaders nvidia.com. Viitattu 7.10.2022. (englanniksi)
  14. Pixel Shaders nvidia.com. Viitattu 12.1.2021. (englanniksi)
  15. Fragment Shader khronos.org. Khronos Group. Viitattu 12.1.2021. (englanniksi)
  16. Geometry Shader Stage learn.microsoft.com. 24.5.2021. Viitattu 7.10.2022. (englanniksi)
  17. Geometry Shader khronos.org. Khronos Group. Viitattu 12.1.2021. (englanniksi)
  18. Tessellation khronos.org. Khronos Group. Viitattu 12.1.2021. (englanniksi)
  19. Tessellation Stages docs.microsoft.com. 31.5.2018. Viitattu 12.1.2021. (englanniksi)
  20. a b PlayStation Shading Language for PS4 gdcvault.com. Viitattu 12.1.2021. (englanniksi)
  21. a b The curtain comes up on AMD’s Vega architecture techreport.com. 5.1.2017. Viitattu 12.1.2021. (englanniksi)
  22. Introduction to Turing Mesh Shaders developer.nvidia.com. 17.9.2018. Viitattu 12.1.2021. (englanniksi)
  23. a b c Christoph Kubisch: Mesh Shading for Vulkan khronos.org. 1.9.2022. Viitattu 7.10.2022. (englanniksi)
  24. Compute Shader khronos.org. Khronos Group. Viitattu 12.1.2021. (englanniksi)
  25. Compute shaders docs.unity3d.com. Viitattu 12.1.2021. (englanniksi)
  26. https://arm-software.github.io/vulkan-sdk/basic_compute.html
  27. a b Akeley, Feiner, Foley, Hughes, Van Dam, McGuire, Sklar: Computer Graphics Principles and Practice, s. 1142. (Third Edition) Addison-Wesley, 2014. ISBN 978-0-321-39952-6 (englanniksi)
  28. Cg Toolkit developer.nvidia.com. Viitattu 12.1.2021. (englanniksi)
  29. Metal Shading Language Specification (PDF) developer.apple.com. Viitattu 12.1.2021. (englanniksi)