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

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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *