Sanalla "shader" on useita merkityksiä . Tässä artikkelissa kuvataan vain yksi niistä.
Shader ( englanniksi shader "shading") - tietokoneohjelma, joka on suunniteltu suoritettavaksi näytönohjainprosessoreilla (GPU) . Shaderit on kirjoitettu jollakin erikoistuneista ohjelmointikielistä (katso alla ) ja ne on koottu GPU:n ohjeiksi .
Kolmiulotteisen grafiikan ja videon kanssa toimivat ohjelmat ( pelit , GIS , CAD , CAM jne.) käyttävät varjostimia geometristen objektien tai kuvien parametrien määrittämiseen, kuvan muuttamiseen (leikkaus-, heijastus-, taittumis- , tummumistehosteiden luomiseen). , ottaen huomioon määritetyt absorptioparametrit ja valonsironta , pintakuvioiden asettamiseen geometrisille objekteille jne.).
Aikaisemmin pelinkehittäjät ottivat käyttöön algoritmin kuvien luomiseksi geometrisista kohteista ( renderöinnistä ) manuaalisesti: he laativat algoritmin kohtauksen näkyvien osien määrittämiseksi, laativat algoritmin tekstuurikartoitukselle ja laativat algoritmeja, jotka luovat epätyypillisiä videotehosteita . Piirtämisen nopeuttamiseksi joitakin renderöintialgoritmeja toteutettiin laitteistotasolla - käyttämällä näytönohjainta . Pelien kehittäjät saattoivat käyttää näytönohjaimen toteuttamia algoritmeja, mutta eivät voineet pakottaa näytönohjainta suorittamaan omia algoritmejaan, esimerkiksi luomaan mukautettuja tehosteita. Keskusprosessorilla suoritettiin epätyypillisiä algoritmeja , hitaammin (grafiikkakäsittelytehtäviin) verrattuna näytönohjaimen prosessoreihin . Tarkastellaan kahta esimerkkiä.
Ongelman ratkaisemiseksi näytönohjaimet alkoivat lisätä kehittäjien vaatimia (laitteisto)algoritmeja. Pian kävi selväksi, että oli mahdotonta ja epäkäytännöllistä toteuttaa kaikkia algoritmeja; päätti antaa kehittäjille pääsyn näytönohjaimeen - jotta GPU -lohkot voidaan koota mielivaltaisiksi putkiksi, jotka toteuttavat erilaisia algoritmeja. Ohjelmia, jotka on suunniteltu toimimaan näytönohjaimen prosessoreilla, kutsutaan "shaderiksi". Varjostimien laatimiseen on kehitetty erityisiä kieliä. Nyt näytönkortteihin ei ladattu vain tietoja geometrisista objekteista ("geometria"), tekstuureista ja muista piirtämiseen (kuvaukseen) tarvittavista tiedoista, vaan myös ohjeet GPU:lle.
Ennen varjostimien käyttöä käytettiin proseduurien tekstuurien luomista (esimerkiksi Unreal - pelissä animoitujen vesi- ja tulitekstuurien luomiseen) ja multitekstuuria ( Quake 3 -pelissä käytetty shader-kieli perustui siihen ). Nämä mekanismit eivät tarjonneet samaa joustavuutta kuin varjostimet.
Uudelleenkonfiguroitavien grafiikkaputkien myötä tuli mahdolliseksi suorittaa matemaattisia laskelmia GPU:lla ( GPPU ). Tunnetuimmat GPGPU-mekanismit ovat nVidia CUDA , Microsoft DirectCompute ja avoimen lähdekoodin OpenCL , Vulkan Khronos Group -konsortiosta .
Aluksi näytönohjaimet varustettiin useilla erikoisprosessoreilla , jotka tukivat erilaisia käskysarjoja . Varjostimet jaettiin kolmeen tyyppiin riippuen siitä, mikä prosessori ne suorittaa (riippuen siitä, mitkä käskyjoukot ovat käytettävissä):
Sitten näytönohjaimet alkoivat varustaa yleisprosessoreilla (GPU), jotka tukevat kaikkien kolmen varjostimen tyyppisiä käskysarjoja ( ne yhdistivät Shader-arkkitehtuurin ). Varjostinten jako tyyppeihin on säilytetty kuvaamaan varjostimen tarkoitusta. Tuli mahdolliseksi suorittaa yleiskäyttöisiä laskelmia GPU:lla (ei liity pelkästään tietokonegrafiikkaan), kuten kaivostoimintaa , hermoverkkoja .
Vertex-varjostimetVertex-varjostin toimii monitahoisiin kärkipisteisiin liittyvillä tiedoilla , kuten pisteen (pisteen) koordinaatit avaruudessa, pintakuviokoordinaatit, kärjen värit, tangenttivektori, binormaalivektori, normaalivektori. Vertex-varjostajaa voidaan käyttää huippupisteiden katselu- ja perspektiivimuunnoksiin, tekstuurin koordinaattien generointiin, valaistuksen laskemiseen jne.
Esimerkkikoodi vertex-varjostimelle DirectX ASM :ssä:
vs. 2.0 dcl_position v0 dcl_texcoord v3 m4x4 oPos, v0, c0 mov oT0,v3 Geometriset varjostimetGeometriavarjostin, toisin kuin vertex-varjostin, pystyy käsittelemään ei vain yhtä huippua, vaan koko primitiivistä. Primitiivi voi olla segmentti (kaksi kärkeä) ja kolmio (kolme kärkeä), ja jos vierekkäisistä pisteistä on tietoa ( englanniksi vierekkäisyys ), kolmiomaiselle primitiiville voidaan käsitellä jopa kuusi pistettä. Geometriavarjostin pystyy luomaan primitiivisiä lennossa (ilman CPU:ta).
Geometriavarjostimia käytettiin ensimmäisen kerran Nvidian 8-sarjan näytönohjaimissa.
Pikseli (fragmentti) varjostimetPikselivarjostin toimii bittikarttafragmenttien ja pintakuvioiden kanssa - se käsittelee pikseleihin liittyviä tietoja (esimerkiksi värit, syvyys, pintakoordinaatit). Pikselivarjosinta käytetään grafiikan liukuhihnan viimeisessä vaiheessa muodostamaan fragmentti kuvasta.
Mallikoodi pikselivarjostimelle DirectX ASM :ssä:
ps.1.4 texldr0, t0 mul r0, r0, v0Edut:
Virheet:
Markkinoiden erilaisiin tarpeisiin (tietokonegrafiikassa on monia sovelluksia) on luotu suuri määrä Shader-ohjelmointikieliä.
Yleensä varjostimien kirjoittamiseen tarkoitetut kielet tarjoavat ohjelmoijalle erityisiä tietotyyppejä (matriisit, näytteenottimet, vektorit jne.), joukon sisäänrakennettuja muuttujia ja vakioita (vuorovaikutukseen 3D-sovellusliittymän standarditoiminnon kanssa).
Ammattimainen renderöintiSeuraavat ovat Shader-ohjelmointikieliä, jotka keskittyvät maksimaalisen renderöintilaadun saavuttamiseen. Tällaisissa kielissä materiaalien ominaisuuksia kuvataan käyttämällä abstraktioita. Tämä antaa ihmisille, joilla ei ole erityisiä ohjelmointitaitoja ja jotka eivät tunne laitteistototeutusten ominaisuuksia, kirjoittaa koodia. Taiteilijat voivat esimerkiksi kirjoittaa tällaisia varjostimia tarjotakseen "oikean ulkoasun" (tekstuurikartoitus, valon sijoittelu jne.).
Yleensä tällaisten varjostimien käsittely on melko resurssiintensiivistä: fotorealististen kuvien luominen vaatii paljon laskentatehoa. Tyypillisesti suurin osa tietojenkäsittelystä tehdään suurilla tietokoneklustereilla tai korttijärjestelmillä .
RenderMan Pixarin RenderMan - ohjelmistoon toteutettu Shader- ohjelmointikieli oli ensimmäinen Shader-ohjelmointikieli. Rob Cookin kehittämä RenderMan-liittymän määrittelyssä kuvattu RenderMan API on ammattimaisen renderöinnin de facto standardi, jota käytetään koko Pixarin työssä . OSL OSL - englanti. Open Shading Language [1] on Sony Pictures Imageworksin [2] kehittämä shader-ohjelmointikieli , joka muistuttaa C -kieltä . Sitä käytetään Sony Pictures Imageworksin kehittämässä Arnold-ohjelmassa, joka on tarkoitettu renderöimiseen , sekä ilmaisessa Blender - ohjelmassa [3] , joka on tarkoitettu kolmiulotteisen tietokonegrafiikan luomiseen. Reaaliaikainen renderöinti GLSL GLSL ( The Open GL Shading Language ) [ 4] on OpenGL -standardissa kuvattu Shader -ohjelmointikieli, joka perustuu ANSI C -standardissa kuvattuun C -kielen versioon . Kieli tukee useimpia ANSI C:n ominaisuuksia, tukee tietotyyppejä , joita käytetään usein työskennellessään kolmiulotteisen grafiikan (vektorit, matriisit) kanssa. Sana "shader" GLSL:ssä viittaa itsenäisesti koottuun yksikköön, joka on kirjoitettu tällä kielellä. Sana "ohjelma" viittaa joukkoon koottuja varjostimia, jotka on linkitetty toisiinsa. cg Cg ( C for g raphics ) on Shader-ohjelmointikieli, jonka nVidia on kehittänyt yhdessä Microsoftin kanssa . Kieli on samanlainen kuin C ja HLSL , jotka Microsoft on kehittänyt ja jotka sisältyvät DirectX 9 :ään . Kielessä käytetään tyyppejä "int", "float", "half" ( 16 -bittinen liukuluku ). Kieli tukee toimintoja ja rakenteita. Kielessä on erikoisia optimointeja "pakattujen taulukoiden" muodossa ( englanniksi pakattu arrays ): ilmoitukset kuten "float a[4]" ja "float4 a" vastaavat eri tyyppejä; toinen ilmoitus luo "pakatun taulukon"; toiminnot "pakatun taulukon" kanssa ovat nopeampia kuin tavallisella. Huolimatta siitä, että kielen on kehittänyt nVidia, lähdekoodi voidaan koota ATI :n GPU-näytönohjainten ohjeiksi . On huomattava, että kaikilla Shader-ohjelmilla on omat ominaisuutensa, jotka voidaan oppia erikoistuneista lähteistä. Shader-ohjelmointikielet DirectX:lle DirectX ASM DirectX ASM on DirectX :lle suunniteltu matalan tason Shader-ohjelmointikieli . Kielen syntaksi on samanlainen kuin kokoonpanokielen syntaksi x86 - prosessoreille . Kielestä on useita versioita, jotka eroavat toisistaan tuettujen GPU-ohjeiden ja laitteistovaatimusten osalta. Vertex-varjostin voi sisältää 100-200 käskyä. Pikselivarjostusohjeiden määrä on rajoitetumpi; esimerkiksi kieliversiossa 1.4 pikselivarjostimessa voi olla enintään 32 ohjetta. HLSL HLSL ( High L Level S hader L Anguage ) on korkean tason Shader-ohjelmointikieli, joka on suunniteltu DirectX : lle ja samanlainen kuin C. Se on lisäosa DirectX ASM -kielelle . Voit käyttää rakenteita, menettelyjä ja toimintoja.