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
- Diskuse o metadatech o duplikátech mezi weby a o tom, zda jsou problémem
- Pokud máte další dotazy, pošlete je prosím jako nové otázky, nikoli je upravujte do existujícího. způsob, jakým lze odpovědi na jednotlivé otázky porovnávat nezávisle na sobě. Stále můžete zahrnout odkazy mezi otázkami, pokud spolu souvisejí.
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.