EDIT: Dette er et duplikat av et spørsmål fra stack overflow: https://stackoverflow.com/questions/9222217/how-does-the-fragment-shader-know-what-variable-to-use-for-the-color-of-a-pixel

Hvis du vil sende en verdi fra vertex shader til fragment shader, bør vertex shader deklarere en variabel som out, bør fragment shader deklarere andre variabler som in og begge variablene må ha navn og typer like. Men dette skjer ikke når du vil sende fargeverdien fra fragmentskyggen. Faktisk kan du ringe utgangsvariabelen som du vil. Hvorfor? I eldre versjon var det en variabel kalt gl_FragColor
Hvordan kobler programmet din outputfragmentvariabel med gl_FragColor?

Kommentarer

Svar

Det fungerer nesten nøyaktig på samme måte som vertex shader-innganger.

I vertex shaders har du innganger. Og disse inngangene representerer vertex-attributtindekser, tallene du sender til glVertexAttribPointer og

og så videre. Du setter opp hvilken inngang som trekker fra hvilket attributt. I GLSL 3.30 bruker du denne syntaksen:

layout(location = 2) in color; 

Dette setter color vertex shader-inngangen til å komme fra attributtet sted 2. Før 3.30 (eller uten ARB_explicit_attrib_location), må du enten konfigurere dette eksplisitt med glBindAttrbLocation før lenke eller spørre programmet for attributtindeksen med glGetAttribLocation . Hvis du ikke eksplisitt oppgir et attributtsted, vil GLSL tildele en plassering vilkårlig (dvs. på en implementeringsdefinert måte).

Det er nesten alltid å sette den i skyggen. det bedre alternativet.

Uansett fungerer fragment shader-utganger nesten nøyaktig på samme måte. Fragmentskygger kan skrive til flere utgangsfarger , som selv blir kartlagt til flere buffere i framebufferen . Derfor må du indikere hvilken utgang som går til hvilken fragmentutgangsfarge.

Dette prosessen begynner med fragmentets utgangsplasseringsverdi. Den er satt på samme måte som toppunkt-skyggeinngangssteder:

layout(location = 1) out secColor; 

Det er også API-funksjonene «b314cc041a»>

glBindFragDataLocation og glGetFragDataLocation , som er analoge med glBindAttribLocation og glGetAttribLocation.

Hvis du ikke gjør noe eksplisitt assi informasjon, implementeringer vil vanligvis tildele en av utgangsvariablene til plassering 0. Imidlertid krever OpenGL-standarden ikke denne oppførselen, så du bør ikke være avhengig av den heller.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *