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
- Diskussion om meta om duplikater på tværs af websteder, og om de er et problem
- Hvis du har yderligere spørgsmål, bedes du sende dem som nye spørgsmål i stedet for at redigere dem til en eksisterende. Dette hvordan svarene på separate spørgsmål kan sammenlignes uafhængigt. Du kan stadig medtage links mellem spørgsmålene, hvis de er relateret.
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.