Shader-ohjelma
Shader-ohjelma (toisinaan vain shader tai ohjelma, kirjaimellisesti käännettynä varjostin tai sävytin) on ohjelma, joka mahdollistaa grafiikkaliukuhihnan muokkaamisen ja on kirjoitettu tarkoitukseen suunnatulla kielellä.[1] Nimitys johtuu historiallisista syistä.[1][2] Robert L. Cookin artikkeli Shade Trees julkaistiin vuonna 1984 ja RenderManin RenderMan Shading Language -kieli kehittyi tästä ideasta.[2][3]
RenderManin kieltä on yritetty soveltaa myös grafiikkasuorittimille (GPU), jolloin havaittiin tärkeiden toimintojen puuttuminen täyteen ohjelmoitavuuteen.[2]
Grafiikkasuorittimien ominaisuudet ovat kehittyneet kiinteätoimisista (konfiguroitavista) suuremmalle ohjelmoitavuudelle.[2] Tyypillisessä grafiikkaliukuhihnassa on vaiheet:[1]
- (verteksit) verteksikohtainen muunnos näyttöavaruuteen
- (rasterointi) kolmiokohtainen iteraatio, perspektiivikorjaus
- (pikseli) pikselikohtainen varjostus
- (lopputuloksen yhdistäminen) varjostuksen yhdistäminen väri- ja syvyyspuskurien kanssa
Ohjelmoitavassa liukuhihnassa vaiheiden järjestys on kiinteä, mutta niiden toteutus on ohjelmoitavissa.[1] 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.[2] 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.[2]
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.[2] Unified Shader -mallissa grafiikkaliukuhihnan eri vaiheilla on samat ominaisuudet.[4]
Shader-tyypit
muokkaaVertex shader (verteksivarjostin) suoritetaan mallin ja näkymän muunnoksien (engl. transformation) sekä projektion vaiheessa.[2] Vertex shaderin käyttökohteita ovat muun muassa hahmon liikkeiden animointi ja veden pinnan muodonmuutokset.[5] Pixel shader viittaa ohjelmaan, joka suoritetaan pikselikohtaisessa vaiheessa ja laskee efektin pikselikohtaisesti.[1][6]
Fragment shader (fragmenttivarjostin) on suoritusvaihe, joka käsittelee rasteroinnin tuottaman fragmentin.[7] Fragment viittaa kolmion osaan, joka on päällekkäinen pikselin kanssa.[1]
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).[2][8] Geometry shader on valinnainen ja voidaan käyttää tesselaatioon ennen verteksien jälkikäsittelyä.[9] Tesselaatioon on myös Tessellation Control Shader sekä Tessellation Evaluation Shader.[10] Sonylla ja Microsoftilla on tesselaation käsittelyvaiheet (hull- ja domain-vaiheet).[11][12]
AMD on esitellyt vuonna 2017 Vega-arkkitehtuurin myötä primitive shader -tyyppisen geometriavaiheen, joka on computer shaderin kaltainen tiedon käsittelyssä.[13] Tämän tavoitteena on tehokkaampi primitiivien poisto ja siten tehokkaampi renderöinti.[13] Nvidia on esitellyt Turing-arkkitehtuurin myötä vastaavan mesh shader -vaiheen.[14] 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.[15] Mesh-shaderin kanssa voi käyttää valinnaista task-shader vaihetta (amplification shader DirectX:ssä), joiden tuloksen voi syöttää suoraan rasterointiin.[15] Geometrian käsittelyn lisäksi mesh-shader voi tehdä yksinkertaisia laskentaoperaatioita.[15]
Compute shader (laskentavarjostin) on laskennalliseen GPGPU-käyttöön suunnattu ohjelma, joka ei ole osa normaalia renderöintiliukuhihnaa.[16][17][18] 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).[19] SPMD-mallit käyttävät SIMD-ytimiä ja ohittavat grafiikkaliukuhihnan käyttäen vain yhtä laskentavaihetta.[19]
Kieliä
muokkaaKieliä on kehitetty lukuisia sekä offline-renderöintiin (elokuvateollisuus) että reaaliaikaiseen käyttöön.
Offline-renderöinti
muokkaa- RenderMan Shading Language
- Houdini-ohjelmiston VEX
- Gelato-ohjelmiston kieli
- Open Shading Language
Reaaliaikainen renderöinti
muokkaa- ARB assembly language, Khronos Group
- OpenGL shading language (GLSL, GLSLang), standardoitu
- Cg, Nvidia[20]
- HLSL, (High-Level Shading Language), Microsoft
- PlayStation Shader Language, Sony[12]
- Metal Shading Language, Apple[21]
Lähteet
muokkaa- ↑ 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)
- ↑ 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)
- ↑ Robert L. Cook: Shade Trees (PDF) citeseerx.ist.psu.edu. Viitattu 12.1.2021. (englanniksi)
- ↑ Common-Shader Core Microsoft. Viitattu 26.1.2017.
- ↑ Vertex Shaders nvidia.com. Viitattu 7.10.2022. (englanniksi)
- ↑ Pixel Shaders nvidia.com. Viitattu 12.1.2021. (englanniksi)
- ↑ Fragment Shader Khronos Group. Viitattu 12.1.2021. (englanniksi)
- ↑ Geometry Shader Stage learn.microsoft.com. 24.5.2021. Viitattu 7.10.2022. (englanniksi)
- ↑ Geometry Shader Khronos Group. Viitattu 12.1.2021. (englanniksi)
- ↑ Tessellation Khronos Group. Viitattu 12.1.2021. (englanniksi)
- ↑ Tessellation Stages docs.microsoft.com. 31.5.2018. Viitattu 12.1.2021. (englanniksi)
- ↑ a b PlayStation Shading Language for PS4 gdcvault.com. Viitattu 12.1.2021. (englanniksi)
- ↑ a b The curtain comes up on AMD’s Vega architecture techreport.com. 5.1.2017. Viitattu 12.1.2021. (englanniksi)
- ↑ Introduction to Turing Mesh Shaders developer.nvidia.com. 17.9.2018. Viitattu 12.1.2021. (englanniksi)
- ↑ a b c Christoph Kubisch: Mesh Shading for Vulkan khronos.org. 1.9.2022. Viitattu 7.10.2022. (englanniksi)
- ↑ Compute Shader Khronos Group. Viitattu 12.1.2021. (englanniksi)
- ↑ Compute shaders docs.unity3d.com. Viitattu 12.1.2021. (englanniksi)
- ↑ https://arm-software.github.io/vulkan-sdk/basic_compute.html
- ↑ 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)
- ↑ Cg Toolkit developer.nvidia.com. Viitattu 12.1.2021. (englanniksi)
- ↑ Metal Shading Language Specification (PDF) developer.apple.com. Viitattu 12.1.2021. (englanniksi)