Shader-ohjelma

From Wikipedia, the free encyclopedia

Remove ads

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]

  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.[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]

Remove ads

Shader-tyypit

Vertex 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]

Remove ads

Kieliä

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

Offline-renderöinti

Reaaliaikainen renderöinti

  • 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]
Remove ads

Lähteet

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads