EDIT: Detta är en duplikat av en fråga från stacköverflöde: https://stackoverflow.com/questions/9222217/how-does-the-fragment-shader-know-what-variable-to-use-for-the-color-of-a-pixel
Om du vill skicka ett värde från vertex shader till fragment shader, ska vertex shader förklara en variabel som out
, ska fragment shader deklarera andra variabler som in
och båda variablerna måste ha sina namn och typer lika. Men detta händer inte när du vill skicka färgvärdet från fragmentskuggaren. I själva verket kan du ringa utmatningsvariabeln som du vill. Varför? I äldre version fanns det en variabel som heter gl_FragColor
Hur länkar programmet din output-fragmentvariabel med gl_FragColor?
Kommentarer
- Diskussion om meta om duplicering på flera webbplatser och om de är ett problem
- Om du har ytterligare frågor, lägg upp dem som nya frågor snarare än att redigera dem till en befintlig fråga. hur svaren på separata frågor kan jämföras oberoende. Du kan fortfarande inkludera länkar mellan frågorna om de är relaterade.
Svar
Det fungerar nästan exakt på samma sätt som ingångar för vertex shader.
I vertex-skuggor har du ingångar. Och dessa ingångar representerar index för vertexattribut, siffrorna du skickar till glVertexAttribPointer
och
och så vidare. Du ställer in vilken ingång som drar från vilket attribut. I GLSL 3.30 använder du den här syntaxen:
layout(location = 2) in color;
Detta ställer in color
vertex shader-ingången för att komma från attribut plats 2. Före 3.30 (eller utan ARB_explicit_attrib_location) måste du antingen ställa in detta uttryckligen med glBindAttrbLocation
innan länka eller fråga programmet för attributindex med glGetAttribLocation
. Om du inte uttryckligen anger en attributplats, tilldelar GLSL en plats godtyckligt (dvs. på ett implementeringsdefinierat sätt).
Att ställa in den i skuggningen är nästan alltid det bättre alternativet.
Hur som helst fungerar fragmentskuggningsutgångar nästan exakt på samma sätt. Fragmentskuggor kan skriva till flera utgångsfärger , som själva mappas till flera buffertar i frambufferten . Därför måste du ange vilken utgång som går till vilken fragmentutfärg.
Detta processen börjar med fragmentets utmatningsplatsvärde. Den ställs in lika mycket som inmatningsplatserna för vertex-skuggning:
layout(location = 1) out secColor;
Det finns också API-funktionerna glBindFragDataLocation
och glGetFragDataLocation
, som är analoga med glBindAttribLocation
och glGetAttribLocation
.
Om du inte gör något uttryckligt Områden, implementeringar kommer vanligtvis att tilldela en av dina utdatavariabler till plats 0. OpenGL-standarden kräver dock inte detta beteende, så du borde inte heller vara beroende av den.