EDIT: Toto je duplikát otázky z přetečení zásobníku: https://stackoverflow.com/questions/9222217/how-does-the-fragment-shader-know-what-variable-to-use-for-the-color-of-a-pixel

Pokud chcete odeslat hodnotu z shaderu vrcholů do shaderu fragmentů, měl by vrchol shaderu deklarovat jednu proměnnou jako out, shader fragmentu by měl deklarovat jinou proměnnou jako in a obě proměnné musí mít stejný název i typ. Ale to se nestane, když chcete odeslat hodnotu barvy ze shaderu fragmentu. Ve skutečnosti můžete volat výstupní proměnnou, jak chcete. Proč? Ve starší verzi byla jedna proměnná s názvem gl_FragColor
Jak program propojuje vaši proměnnou výstupního fragmentu s gl_FragColor?

Komentáře

Odpovědět

Funguje téměř přesně stejně jako vstupy shaderů vrcholů.

Ve shaderech vrcholů máte vstupy. A tyto vstupy představují indexy atributů vrcholů, čísla, která předáváte glVertexAttribPointer a

a tak dále. Nastavíte, který vstup táhne z kterého atributu. V GLSL 3.30 používáte tuto syntaxi:

layout(location = 2) in color; 

Tím se nastaví color vstup shaderu vrcholů, který pochází z atributu umístění 2. Před 3.30 (nebo bez ARB_explicit_attrib_location) byste to museli buď nastavit explicitně pomocí glBindAttrbLocation dříve propojení nebo dotaz na program pro index atributů s glGetAttribLocation . Pokud explicitně neuvedete umístění atributu, GLSL přiřadí umístění libovolně (tj. Způsobem definovaným implementací).

Nastavení ve shaderu je téměř vždy lepší volba.

V každém případě výstupy shaderu fragmentů fungují téměř přesně stejným způsobem. shadery fragmentů mohou zapisovat do více výstupních barev , které samy o sobě jsou namapovány na více vyrovnávacích pamětí v framebufferu . Proto je třeba uvést, který výstup jde do které výstupní barvy fragmentu.

This proces začíná hodnotou výstupního umístění fragmentu. Je nastaven velmi podobně jako vstupní umístění vertex shaderu:

layout(location = 1) out secColor; 

K dispozici jsou také funkce API glBindFragDataLocation a glGetFragDataLocation , které jsou analogické s glBindAttribLocation a glGetAttribLocation.

Pokud neprovádíte žádné výslovné rady vlády, implementace obvykle přiřadí jednu z vašich výstupních proměnných k umístění 0. Standard OpenGL však toto chování nevyžaduje , takže byste na něj neměli také záviset.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *