EDIT: Dit is een duplicaat van een vraag uit stack-overflow: https://stackoverflow.com/questions/9222217/how-does-the-fragment-shader-know-what-variable-to-use-for-the-color-of-a-pixel
Als u een waarde wilt verzenden van hoekpuntshader naar fragmentarcering, moet de hoekpuntshader één variabele declareren als out
, de fragmentshader moet een andere variabele declareren als in
en beide variabelen moeten hun naam en type gelijk hebben. Maar dit gebeurt niet wanneer u de kleurwaarde vanuit de fragmentshader wilt verzenden. In feite kunt u de uitvoervariabele aanroepen zoals u wilt. Waarom? In een oudere versie was er één variabele met de naam gl_FragColor
Hoe koppelt het programma je outputfragmentvariabele aan gl_FragColor?
Reacties
- Discussie over meta over duplicaten van meerdere sites en of deze een probleem zijn
- Als u aanvullende vragen heeft, plaats deze dan als nieuwe vragen in plaats van ze te bewerken in een bestaande. Dit manier waarop de antwoorden op afzonderlijke vragen onafhankelijk van elkaar kunnen worden vergeleken. U kunt nog steeds links tussen de vragen opnemen als ze gerelateerd zijn.
Antwoord
Het werkt bijna op dezelfde manier als invoer van vertex-shaders.
In vertex-shaders heb je invoer. En deze invoer vertegenwoordigen vertex-kenmerkindices, de getallen die je doorgeeft aan glVertexAttribPointer
en
enzovoort. Je stelt in welke input uit welk attribuut haalt. In GLSL 3.30 gebruikt u deze syntaxis:
layout(location = 2) in color;
Dit stelt de color
hoekpuntshader-invoer in om uit het attribuut te komen locatie 2. Vóór 3.30 (of zonder ARB_explicit_attrib_location) zou u dit expliciet moeten instellen met glBindAttrbLocation
ervoor het programma koppelen of doorzoeken op de kenmerkindex met glGetAttribLocation
. Als u niet expliciet een attribuutlocatie opgeeft, zal GLSL een locatie willekeurig toewijzen (dwz: op een door de implementatie gedefinieerde manier).
Het instellen in de arcering is bijna altijd de betere optie.
In elk geval werken fragmentshader-uitvoer bijna op dezelfde manier. Fragment-shaders kunnen schrijven naar meerdere uitvoerkleuren , die zelf worden toegewezen aan meerdere buffers in de framebuffer . Daarom moet u aangeven welke uitvoer naar welk fragment uitvoerkleur gaat.
Dit proces begint met de waarde van de uitvoerlocatie van het fragment. Het wordt op dezelfde manier ingesteld als de invoerlocaties van de vertexshader:
layout(location = 1) out secColor;
Er zijn ook de API-functies glBindFragDataLocation
en glGetFragDataLocation
, die analoog zijn aan glBindAttribLocation
en glGetAttribLocation
.
Als je geen expliciete assi gnments, zullen implementaties gewoonlijk een van uw uitvoervariabelen toewijzen aan locatie 0. De OpenGL-standaard vereist dit gedrag echter niet, dus u moet er ook niet van afhankelijk zijn.