EDIT: Acesta este un duplicat al unei întrebări din depășirea stivei: https://stackoverflow.com/questions/9222217/how-does-the-fragment-shader-know-what-variable-to-use-for-the-color-of-a-pixel
Dacă doriți să trimiteți o valoare de la vertex shader la fragment shader, vertex shader ar trebui să declare o variabilă ca out
, fragmentul shader ar trebui să declare altă variabilă ca in
și ambele variabile trebuie să aibă numele și tipurile lor egale. Dar acest lucru nu se întâmplă când doriți să trimiteți valoarea culorii din fragmentul de umbră. De fapt, puteți apela variabila de ieșire după cum doriți. De ce? În versiunea mai veche exista o variabilă numită gl_FragColor
Cum leagă programul variabila de fragment de ieșire de gl_FragColor?
Comentarii
- Discuție despre meta despre duplicatele pe mai multe site-uri și dacă acestea reprezintă o problemă
- Dacă aveți întrebări suplimentare, vă rugăm să le postați ca întrebări noi, mai degrabă decât să le modificați într-una existentă. modul în care răspunsurile la întrebări separate pot fi comparate independent. Puteți include în continuare legături între întrebări dacă acestea sunt corelate.
Răspuns
Funcționează aproape exact în același mod ca și intrările de vertex shader.
În umbrele de vertex, aveți intrări. Și aceste intrări reprezintă indici de atribut de vârf, numerele pe care le transmiteți glVertexAttribPointer
și
și așa mai departe. Configurați ce intrare extrage din ce atribut. În GLSL 3.30, utilizați această sintaxă:
layout(location = 2) in color;
Aceasta setează intrarea color
vertex shader pentru a proveni din atribut locația 2. Înainte de ora 3.30 (sau fără ARB_explicit_attrib_location), ar trebui să configurați acest lucru în mod explicit cu glBindAttrbLocation
înainte conectarea sau interogarea programului pentru indexul atributului cu glGetAttribLocation
. Dacă nu furnizați în mod explicit o locație de atribut, GLSL va atribui o locație în mod arbitrar (adică: într-o manieră definită de implementare).
Setarea acesteia în shader este aproape întotdeauna opțiunea mai bună.
În orice caz, ieșirile fragmentelor de umbră funcționează aproape exact în același mod. Umbrele de fragmente pot scrie pe culori multiple de ieșire , care sunt mapate la mai multe buffere din framebuffer . Prin urmare, trebuie să indicați ce ieșire merge la ce culoare de ieșire fragment.
procesul începe cu valoarea locației de ieșire a fragmentului. Este setat foarte asemănător cu locațiile de intrare a vertex shader:
layout(location = 1) out secColor;
Există, de asemenea, funcțiile API glBindFragDataLocation
și glGetFragDataLocation
, care sunt analoage cu glBindAttribLocation
și glGetAttribLocation
.
Dacă nu faceți niciun assi explicit gnments, implementările vor atribui de obicei una dintre variabilele dvs. de ieșire la locația 0. Cu toate acestea, standardul OpenGL nu necesită acest comportament, deci nu ar trebui să depindeți nici de acesta.