MUOKKAA: Tämä on kopio kysymyksestä pinon ylivuodosta: https://stackoverflow.com/questions/9222217/how-does-the-fragment-shader-know-what-variable-to-use-for-the-color-of-a-pixel
Jos haluat lähettää arvon kärkien varjostimesta fragmentti-varjostimeen, kärkiparametrien on ilmoitettava yksi muuttuja nimellä out
, katkelma-varjostimen on ilmoitettava muu muuttuja in
ja molempien muuttujien nimien ja tyyppien on oltava samat. Mutta tätä ei tapahdu, kun haluat lähettää väriarvon fragmentin varjostimesta. Itse asiassa voit kutsua lähtömuuttujaa haluamallasi tavalla. Miksi? Vanhemmassa versiossa oli yksi muuttuja nimeltä gl_FragColor
Kuinka ohjelma linkittää ulostulofragmenttimuuttujan gl_FragColoriin?
Kommentit
- Keskustelu sivustojen välisten kaksoiskappaleiden metasta ja niiden ongelmasta
- Jos sinulla on kysyttävää, lähetä ne uusina kysymyksinä sen sijaan, että muokkaat niitä olemassa oleviksi. tapa, jolla vastauksia erillisiin kysymyksiin voidaan verrata itsenäisesti. Voit silti lisätä linkkejä kysymysten välille, jos ne liittyvät toisiinsa.
Vastaa
Se toimii melkein samalla tavalla kuin kärkipisteiden varjostimien syötteet.
Kärkipisteiden varjostimissa sinulla on syötteitä. Ja nämä syötteet edustavat kärkipisteominaisuusindeksejä, numeroita, jotka välität osoitteeseen glVertexAttribPointer
ja
ja niin edelleen. Määrität, mikä tulo vetää mistä attribuutista. GLSL 3.30 -käyttöjärjestelmässä käytetään tätä syntaksia:
layout(location = 2) in color;
Tämä asettaa color
-verkon varjostimen tulon attribuutiksi sijainti 2. Ennen 3.30 (tai ilman ARB_explicit_attrib_location) joudut joko asettamaan tämän nimenomaisesti glBindAttrbLocation
ennen linkitetään tai kysellään ohjelmaa attribuuttihakemistosta osoitteella glGetAttribLocation
. Jos et anna nimenomaisesti määritteen sijaintia, GLSL määrittää sijainnin mielivaltaisesti (ts. Toteutuksen määrittelemällä tavalla).
Sen asettaminen varjostimessa on melkein aina parempi vaihtoehto.
Joka tapauksessa fragmenttivarjostimen lähdöt toimivat melkein samalla tavalla. Fragmenttivarjostimet voivat kirjoittaa useisiin ulostuloväreihin , jotka itse kartoitetaan useisiin puskureihin kehyspuskurissa . Siksi sinun on ilmoitettava, mikä lähtö menee mihin fragmentin ulostuloväriin.
Tämä prosessi alkaa fragmentin ulostulon sijaintiarvolla. Se asetetaan hyvin samalla tavalla kuin kärkipaikan varjostimen syöttösijainnit:
layout(location = 1) out secColor;
On myös API-toimintoja glBindFragDataLocation
ja glGetFragDataLocation
, jotka ovat analogisia glBindAttribLocation
ja glGetAttribLocation
kanssa.
Jos et tee mitään nimenomaista assi gnmentit, toteutukset yleensä määrittävät yhden lähtömuuttujistasi sijaintiin 0. OpenGL-standardi ei kuitenkaan vaadi tätä käyttäytymistä, joten sinun ei pitäisi myöskään riippua siitä.