EDIT: Dette er en duplikat af et spørgsmål fra stackoverløb: 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 værdi fra vertex shader til fragment shader, skal vertex shader deklarere en variabel som out, fragment shader skal erklære anden variabel som in og begge variabler skal have deres navne og typer lig. Men dette sker ikke, når du vil sende farveværdien fra fragmentskygge. Faktisk kan du kalde outputvariablen som du vil. Hvorfor? I ældre version var der en variabel kaldet gl_FragColor
Hvordan linker programmet din outputfragmentvariabel med gl_FragColor?

Kommentarer

Svar

Det fungerer næsten nøjagtigt på samme måde som vertex shader-input.

I vertex shaders har du input. Og disse input repræsenterer vertex-attributindeks, de tal, du videregiver til glVertexAttribPointer og

og så videre. Du konfigurerer, hvilket input der trækker fra hvilken attribut. I GLSL 3.30 bruger du denne syntaks:

layout(location = 2) in color; 

Dette indstiller color vertex shader-input til at komme fra attribut placering 2. Før 3.30 (eller uden ARB_explicit_attrib_location) skal du enten opsætte dette eksplicit med glBindAttrbLocation før sammenkædning eller forespørgsel på programmet for attributindekset med glGetAttribLocation . Hvis du ikke eksplicit angiver en attributplacering, tildeler GLSL en placering vilkårligt (dvs. på en implementeringsdefineret måde).

At indstille den i skyggen er næsten altid den bedre mulighed.

Under alle omstændigheder fungerer fragment shader-output næsten nøjagtigt på samme måde. Fragment shaders kan skrive til flere outputfarver , som selv bliver kortlagt til flere buffere i framebufferen . Derfor skal du angive, hvilken output der går til hvilken fragmentoutputfarve.

Dette processen begynder med fragmentets outputplaceringsværdi. Den indstilles meget på samme måde som vertex shader-inputplaceringer:

layout(location = 1) out secColor; 

Der er også API-funktionerne glBindFragDataLocation og glGetFragDataLocation , som er analoge med glBindAttribLocation og glGetAttribLocation.

Hvis du ikke gør noget eksplicit assi gnments, implementeringer tildeler normalt en af dine outputvariabler til placering 0. Imidlertid kræver OpenGL-standarden ikke denne adfærd, så du skal heller ikke stole på den.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *