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

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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *