SZERKESZTÉS: Ez egy kérdés másolata a verem túlcsordulásából: https://stackoverflow.com/questions/9222217/how-does-the-fragment-shader-know-what-variable-to-use-for-the-color-of-a-pixel
Ha a vertex shaderből a fragment shaderbe szeretne küldeni egy értéket, akkor a vertex shadernek egy változót out
, a fragmens shader más változót kell deklarálnia in
és mindkét változó nevének és típusának meg kell egyeznie. De ez nem történik meg, ha a színértéket a töredék árnyékolóból akarja elküldeni. Valójában hívhatja a kimeneti változót, ahogy akarja. Miért? A régebbi verzióban volt egy változó, gl_FragColor
Hogyan kapcsolja össze a program a kimeneti töredék változót a gl_FragColorral?
Megjegyzések
- Megbeszélés a metákról a webhelyek közötti másolatokról és arról, hogy ezek problémát jelentenek-e
- Ha további kérdései vannak, kérjük, tegye fel új kérdésekként, ne pedig szerkessze őket meglévővé. a különálló kérdésekre adott válaszok egymástól függetlenül összehasonlíthatók. A kérdések között továbbra is tartalmazhat linkeket, ha azok összefüggenek.
Válasz
Szinte pontosan ugyanúgy működik, mint a csúcsfestő árnyékoló bemenetei.
A csúcsfedő árnyékolókban vannak bemenetei. És ezek a bemenetek a csúcsattribútum-indexeket képviselik, a és
és így tovább. Beállítja, hogy melyik bemenet melyik attribútumból származik. A GLSL 3.30 verzióban ezt a szintaxist használja:
layout(location = 2) in color;
Ez beállítja a color
csúcs árnyékoló bemenetét az attribútumból. hely 2.30 előtt (vagy ARB_explicit_attrib_location nélkül), ezt vagy kifejezetten be kell állítania a glBindAttrbLocation
előtt összekapcsolja vagy lekérdezi a programot az attribútumindexhez a következővel: glGetAttribLocation
. Ha nem ad meg kifejezetten egy attribútumhelyet, akkor a GLSL önkényesen (azaz megvalósítás által meghatározott módon) rendel hozzá egy helyet.
A shaderben való beállítása szinte mindig a jobb megoldás.
Mindenesetre a töredék árnyékoló kimenetek szinte pontosan ugyanúgy működnek. A töredék árnyékolók többféle kimeneti színbe írhatnak , amelyeket maguk is leképeznek több pufferre a framebufferben . Ezért meg kell adnia, hogy melyik kimenet melyik töredék kimeneti színéhez kerül.
Ez A folyamat a töredék kimeneti helyének értékével kezdődik. Nagyon hasonlóan állítja be a csúcs árnyékoló bemeneti helyeit:
layout(location = 1) out secColor;
Vannak API függvények is glBindFragDataLocation
és glGetFragDataLocation
, amelyek analógak a glBindAttribLocation
és glGetAttribLocation
elemekkel.
Ha nem teszel kifejezetten A megvalósítások általában a kimeneti változók egyikét a 0 helyhez rendelik. Az OpenGL szabvány azonban nem igényli ezt a viselkedést, ezért nem szabad ettől sem függenie.