Fragment Shader — mi ez, feladatai és működési elve

Szerző: IT Sectr Megjelenés: 2026-06-11 Olvasási idő: 10 perc

Fragment Shader — a grafikus pipeline programozható szakasza, amely meghatározza a kép egyes fragmentumainak (pixel) végső színét. A Khronos Group, 2025 adatai szerint a fragment shader interpolált adatokat kap a Vertex Shader-től, és elvégzi a világítási, textúrázási és színeffektusok számításait. Fragment Shader minden pixelhez meghívásra kerül, ami a grafikus pipeline leginkább erőforrás-igényes szakaszává teszi.

Főbb pontok

  • Fragment Shader — a GPU programozható szakasza, amely meghatározza a képernyőn lévő egyes pixelek színét.
  • A hívások száma megegyezik a képernyő felbontásával, ami a renderelés fő számítási terhévé teszi.
  • Textúrázás és Phong-megvilágítás — tipikus feladatok, amelyek a fragment shader-ben valósulnak meg.
  • GLSL és Metal Shading Language szabványos eszközöket biztosít a Fragment Shader írásához.
  • A Fragment Shader teljesítménye kritikus a 60 FPS eléréséhez a mobil alkalmazásokban.

Mi az a Fragment Shader?

Fragment Shader (fragment- vagy pixel shader) — a grafikus pipeline programozható szakasza, amely kiszámítja a kép egyes fragmentumainak végső színét. A fragmentum egy potenciális pixel, amely a mélységi és sablon tesztek áthaladása után látható pixellé válik a képernyőn.

A Fragment Shader a raszterizálás után hajtódik végre, amikor a háromdimenziós primitívek (háromszögek) már fragmentumok halmazává alakultak. A shader a bemeneten interpolált attribútumokat kap — textúrakoordinátákat, normálisokat, színeket, amelyeket a Vertex Shader számított ki a háromszög csúcsaihoz, és lineárisan interpolálta a benne lévő minden egyes pixelhez.

A Fragment Shader evolúciójának története

A programozható shaderek megjelenése előtt (a DirectX 8 / OpenGL 2.0 előtt) a pixel színének kiszámítását egy rögzített pipeline végezte korlátozott műveletkészlettel. Programozható Fragment Shader 2001-ben jelent meg, és radikálisan kiterjesztette a grafika lehetőségeit: a fejlesztők teljes ellenőrzést kaptak minden egyes pixel színe felett, ami lehetővé tette a fotorealisztikus világítás, összetett anyagok és utóhatások megvalósítását.

Hogyan működik a Fragment Shader?

Fragment Shader a GPU által indul a raszterizáló által generált minden egyes fragmentumhoz. Minden shader-hívás feldolgoz egy fragmentumot, beolvassa a bemeneti adatait, végrehajtja a felhasználói kódot, és kiírja a kimeneti értéket — a fragmentum színét RGBA formátumban.

Bemeneti és kimeneti adatok

A Fragment Shader bemeneti adatai tartalmazzák a Vertex Shader-től származó interpolált attribútumokat (textúrakoordináták, normálisok, színek), uniform változókat (fényforrások, mátrixok) és textúra mintavevőket. A kimeneti adatok — színvektor (gl_FragColor OpenGL ES 2.0-ban vagy felhasználói változó ES 3.0-ban), amely a színpufferbe íródik.

glsl
#version 300 es
precision mediump float;

in vec2 vTexCoord;
uniform sampler2D uTexture;
out vec4 fragColor;

void main() {
    fragColor = texture(uTexture, vTexCoord);
}

A Fragment Shader fő feladatai

Fragment Shader felelős a kép vizuális minőségéért. Minden effekt, amit a felhasználó a képernyőn lát — szín, árnyékok, tükröződések, átlátszóság — pontosan a grafikus pipeline ezen szakaszában kerül kiszámításra.

Textúrázás

A leggyakoribb művelet — szín kinyerése a textúrából interpolált UV koordináták alapján. Sampler2D és a texture() függvény lehetővé teszi a pixel színének megszerzését a textúra atlaszból. A szűrés (bilineáris, trilineáris, anizotrop) a mintavevő paraméterein keresztül vezérelhető, és befolyásolja a kép élességét különböző nézési szögeknél.

Phong-megvilágítás

A Phong-megvilágítási modell (Phong shading) a Fragment Shader-ben kerül kiszámításra minden egyes pixelre, ami simább fényeffekteket ad, mint a csúcs megvilágítás (Gouraud shading). Phong lighting három összetevőből áll: ambient (környezeti), diffuse (diffúz) és specular (tükröződő).

glsl
// Fragment shader Phong megvilágítással
in vec3 vNormal;
in vec3 vPosition;
uniform vec3 uLightDir;
uniform vec3 uLightColor;

void main() {
    vec3 norm = normalize(vNormal);
    float diff = max(dot(norm, uLightDir), 0.0);
    fragColor = vec4(uLightColor * diff, 1.0);
}

Utóhatások és blending

A Fragment Shader lehetővé teszi utófeldolgozás alkalmazását: színkorrekció LUT táblákon keresztül, elmosás (blur), fényeffektus (bloom) és tonemapping HDR rendereléshez. Mindezek az effektek pixel szinten működnek és valós időben hajtódnak végre.

A Fragment Shader teljesítménye és optimalizálás

A Fragment Shader teljesítménye — a fő tényező, amely korlátozza az FPS-t a modern mobil játékokban. Mivel a shader minden pixelhez meghívásra kerül, a kód összetettségének kis növekedése is észrevehető képkockasebesség-csökkenéshez vezethet.

Fő teljesítményproblémák

  • Overdraw — ugyanazon pixel újrarajzolása az objektumok átfedése miatt. Különösen kritikus a fél-átlátszó objektumoknál.
  • Feltételes elágazások — az elágazások a Fragment Shader-ben csökkentik a SIMD végrehajtás hatékonyságát, mivel a GPU-nak mindkét ágat végre kell hajtania.
  • Textúra lekérések — minden textúra lekérés (texture lookup) több tucat GPU ciklus késleltetéssel jár. A mintavevők számának minimalizálása felgyorsítja a shadert.

A Fragment Shader optimalizálásának módszerei

Mobil GPU-khoz (Qualcomm Adreno, ARM Mali) ajánlott: mediump precision használata float változókhoz, textúra lekérések kombinálása, early-z tesztek alkalmazása a láthatatlan fragmentumok eldobására a shader végrehajtása előtt.

MódszerLeírásNyereség
Mediump precision16 bites pontosság 32 bit helyettAkár 2x sebesség
Early-ZMélységi teszt a shader előttHívások csökkentése
Texture atlasingEgy textúra több helyettKevesebb váltás

Fragment Shader vs Vertex Shader: összehasonlítás

Mindkét shader típust a fejlesztő programozza, de a pipeline különböző szakaszaiban működnek és különböző feladatokat oldanak meg. Fragment Shader jelentősen erőforrás-igényesebb a hívások száma miatt.

ParaméterFragment ShaderVertex Shader
Hívások számaMilliók (képernyő felbontás)Ezrek (csúcsok száma)
Bemeneti adatokInterpolált attribútumokCsúcs attribútumok
Fő funkcióFragmentum színének kiszámításaGeometria transzformációja
Hozzáférés textúrákhozTeljes (több mintavevő)Korlátozott
Hatás a teljesítményreMagas (felbontástól függ)Mérsékelt (geometriától függ)

Fragment Shader kódpéldák

Fragment Shader lehet egyszerű (textúra lekérés) vagy összetett (többrétegű világítás). Vizsgáljunk meg két gyakorlati példát: alap textúrázás és gradienseffektus idő használatával.

Alap textúrázás GLSL-ben

glsl
#version 300 es
precision mediump float;
in vec2 vTexCoord;
in vec3 vColor;
uniform sampler2D uDiffuseMap;
out vec4 fragColor;

void main() {
    vec4 texColor = texture(uDiffuseMap, vTexCoord);
    fragColor = texColor * vec4(vColor, 1.0);
}

Példa Metal Shading Language-ben

cpp
#include <metal_stdlib>
using namespace metal;

struct FragmentIn {
    float2 texCoord;
    float3 normal;
};

fragment float4
fragmentMain(FragmentIn in [[stage_in]],
              texture2d<float> tex [[texture(0)]]) {
    constexpr sampler s(filter = linear);
    float4 color = tex.sample(s, in.texCoord);
    return color;
}

Gyakran Ismételt Kérdések

Mi az a Fragment Shader egyszerű szavakkal?

Fragment Shader — egy mini-program a GPU-n, amely meghatározza, hogy milyen színű lesz a képernyőn minden egyes pixel. Ha a Vertex Shader meghatározza az objektum alakját, akkor a Fragment Shader határozza meg, hogy az objektum hogyan néz ki — textúra, világítás, szín.

Miért olyan erőforrás-igényes a Fragment Shader?

A Fragment Shader a képernyő minden pixeléhez meghívásra kerül. Egy 2532x1170 felbontású eszközön (iPhone) ez majdnem 3 millió hívás képkockánként. 60 FPS-nél a shader másodpercenként 180 milliószor hajtódik végre, ami hatalmas számítási teljesítményt igényel.

Milyen effekteket lehet készíteni Fragment Shader-ben?

A Fragment Shader-ben megvalósítható: textúrázás, világítás (Phong, PBR), árnyékok, tükröződések, fénytörés, bloom, mélységélesség, színkorrekció, LUT szűrők és procedurális textúra generálás.

Hogyan optimalizáljuk a Fragment Shader-t mobil eszközökön?

Használjon mediump precision-t float-hoz, csökkentse a textúra lekérések számát, alkalmazzon early-z elutasítást, vonja össze a shader műveleteket és kerülje a feltételes elágazásokat a shader-en belül.

Mi a különbség a Fragment Shader és a Pixel Shader között?

Ugyanaz. A Fragment Shader kifejezést az OpenGL / Vulkan használja, a Pixel Shader-t pedig a Direct3D (Microsoft) terminológiája. Funkcionálisan azonosak: mindkettő kiszámítja minden egyes fragmentum/pixel színét.

Összefoglaló

  • Fragment Shader — a GPU programozható szakasza, amely kiszámítja a kép minden egyes pixelének színét.
  • A hívások száma megegyezik a képernyő felbontásával, ami a renderelés leginkább erőforrás-igényes szakaszává teszi.
  • Textúrázás, Phong-megvilágítás és utóhatások — a fragment shader fő feladatai.
  • Teljesítmény közvetlenül függ a textúra lekérések számától és a highp precision használatától.
  • Mediump precision és early-z tesztek — kulcs optimalizációs technikák mobil GPU-khoz.
  • OpenGL ES a Fragment Shader kifejezést használja, Direct3D — Pixel Shader, a lényeg ugyanaz.
  • GLSL és Metal Shading Language — a fő nyelvek a Fragment Shader írásához mobil fejlesztésben.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is