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

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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *