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

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.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük