Fragment Shader — vad det är, uppgifter och funktionsprincip

Författare: IT Sectr Publicerad: 2026-06-11 Lästid: 10 min

Fragment Shader — är ett programmerbart steg i grafikkedjan som bestämmer den slutgiltiga färgen för varje fragment (pixel) i en bild. Enligt uppgifter från Khronos Group, 2025, tar fragment shadern emot interpolerad data från Vertex Shader och utför beräkningar av belysning, texturering och färgeffekter. Fragment Shader anropas för varje pixel, vilket gör det till det mest resurskrävande steget i grafikkedjan.

Huvudpunkter

  • Fragment Shader — programmerbart steg i GPU som bestämmer färgen på varje pixel på skärmen.
  • Antalet anrop är lika med skärmupplösningen, vilket gör det till den huvudsakliga beräkningsbelastningen för rendering.
  • Texturering och Phong-belysning — typiska uppgifter som implementeras i fragment shadern.
  • GLSL och Metal Shading Language tillhandahåller standardverktyg för att skriva Fragment Shader.
  • Prestanda för Fragment Shader är avgörande för att uppnå 60 FPS i mobila applikationer.

Vad är Fragment Shader?

Fragment Shader (fragment- eller pixelshader) — är ett programmerbart steg i grafikkedjan som beräknar den slutgiltiga färgen för varje fragment i bilden. Ett fragment är en potentiell pixel som, efter att ha passerat djup- och stenciltester, blir en synlig pixel på skärmen.

Fragment Shader exekveras efter rasterisering, när tredimensionella primitiver (trianglar) redan har omvandlats till en uppsättning fragment. Shadern tar emot på ingången interpolerade attribut — texturkoordinater, normaler, färger som beräknades i Vertex Shader för triangelns hörn och linjärt interpolerades för varje pixel inuti den.

Historia om Fragment Shaders utveckling

Före uppkomsten av programmerbara shaders (före DirectX 8 / OpenGL 2.0) utfördes beräkningen av pixelfärgen av en fast pipeline med en begränsad uppsättning operationer. Programmerbar Fragment Shader dök upp år 2001 och utökade radikalt grafikkapaciteten: utvecklare fick full kontroll över färgen på varje pixel, vilket möjliggjorde fotorealistisk belysning, komplexa material och post-effekter.

Hur fungerar Fragment Shader?

Fragment Shader startas av GPU för varje fragment som genereras av rasteriseraren. Varje shader-anrop bearbetar ett fragment, läser dess indata, exekverar användarkoden och skriver utdatavärdet — fragmentets färg i RGBA-format.

Indata och utdata

Fragment Shaders indata inkluderar interpolerade attribut från Vertex Shader (texturkoordinater, normaler, färger), uniforma variabler (ljuskällor, matriser) och textursamplers. Utdatat — färgvektor (gl_FragColor i OpenGL ES 2.0 eller användarvariabel i ES 3.0) som skrivs till färgbufferten.

glsl
#version 300 es
precision mediump float;

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

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

Huvuduppgifter för Fragment Shader

Fragment Shader ansvarar för bildens visuella kvalitet. Alla effekter som användaren ser på skärmen — färg, skuggor, reflektioner, transparens — beräknas precis i detta steg av grafikkedjan.

Texturering

Den vanligaste operationen — att hämta färg från en textur baserat på interpolerade UV-koordinater. Sampler2D och funktionen texture() gör det möjligt att få pixelns färg från en texturatlas. Filtrering (bilinjär, trilinejär, anisotropisk) styrs via samplerparametrar och påverkar skärpan i bilden vid olika betraktningsvinklar.

Phong-belysning

Phong-belysningsmodellen (Phong shading) beräknas i Fragment Shader för varje pixel, vilket ger jämnare högdagrar än vertexbelysning (Gouraud shading). Phong lighting inkluderar tre komponenter: ambient (omgivningsljus), diffuse (diffust) och specular (spegelreflexion).

glsl
// Fragment shader med Phong-belysning
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);
}

Post-effekter och blending

Fragment Shader gör det möjligt att applicera efterbehandling: färgkorrigering via LUT-tabeller, oskärpa (blur), glödeffekt (bloom) och tonemapping för HDR-rendering. Alla dessa effekter fungerar på pixelnivå och exekveras i realtid.

Prestanda för Fragment Shader och optimering

Prestanda för Fragment Shader — den huvudsakliga faktorn som begränsar FPS i moderna mobila spel. Eftersom shadern anropas för varje pixel, kan även en liten ökning av kodkomplexiteten leda till en märkbar minskning av bildhastigheten.

Huvudsakliga prestandaproblem

  • Overdraw — omritning av samma pixel på grund av överlappande objekt. Särskilt kritiskt för halvgenomskinliga objekt.
  • Villkorliga förgreningar — förgreningar i Fragment Shader minskar effektiviteten av SIMD-exekvering, eftersom GPU måste exekvera båda grenarna.
  • Texturuppslag — varje texturuppslag (texture lookup) har en fördröjning på tiotals GPU-cykler. Minimering av antalet samplers snabbar upp shadern.

Optimeringsmetoder för Fragment Shader

För mobila GPU:er (Qualcomm Adreno, ARM Mali) rekommenderas: använd mediump precision för float-variabler, kombinera texturuppslag, tillämpa early-z-tester för att avvisa osynliga fragment före shader-exekvering.

MetodBeskrivningVinst
Mediump precision16-bitars precision istället för 32-bitarsUpp till 2x hastighet
Early-ZDj Mättekniktest före shadernMinskning av anrop
Texture atlasingEn textur istället för fleraMindre växlingar

Fragment Shader vs Vertex Shader: jämförelse

Båda typerna av shaders programmeras av utvecklaren, men de arbetar i olika steg av pipeline och löser olika uppgifter. Fragment Shader är betydligt mer resurskrävande på grund av antalet anrop.

ParameterFragment ShaderVertex Shader
Antal anropMiljontals (skärmupplösning)Tusentals (antal hörn)
IndataInterpolerade attributHörnattribut
HuvudfunktionBeräkning av fragmentfärgTransformering av geometri
Tillgång till texturerFull (flera samplers)Begränsad
Påverkan på prestandaHög (beroende på upplösning)Måttlig (beroende på geometri)

Exempel på Fragment Shader-kod

Fragment Shader kan vara enkel (texturuppslag) eller komplex (flerskiktsbelysning). Låt oss titta på två praktiska exempel: grundläggande texturering och en gradienteffekt med hjälp av tid.

Grundläggande texturering i GLSL

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);
}

Exempel i Metal Shading Language

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;
}

Vanliga frågor

Vad är Fragment Shader med enkla ord?

Fragment Shader — är ett mini-program på GPU som bestämmer vilken färg varje pixel på skärmen ska ha. Om Vertex Shader bestämmer objektets form, så bestämmer Fragment Shader hur objektet ser ut — textur, belysning, färg.

Varför är Fragment Shader så resurskrävande?

Fragment Shader anropas för varje pixel på skärmen. På en enhet med upplösningen 2532x1170 (iPhone) är det nästan 3 miljoner anrop per bildruta. Vid 60 FPS exekveras shadern 180 miljoner gånger per sekund, vilket kräver enorm beräkningskraft.

Vilka effekter kan man göra i Fragment Shader?

I Fragment Shader implementeras: texturering, belysning (Phong, PBR), skuggor, reflektioner, refractioner, bloom, skärpedjup, färgkorrigering, LUT-filter och procedurell texturgenerering.

Hur optimerar man Fragment Shader på mobila enheter?

Använd mediump precision för float, minska antalet texturuppslag, tillämpa early-z-avvisning, kombinera shader-operationer och undvik villkorliga förgreningar inuti shadern.

Vad är skillnaden mellan Fragment Shader och Pixel Shader?

Det är samma sak. Termen Fragment Shader används i OpenGL / Vulkan, och Pixel Shader i terminologin för Direct3D (Microsoft). Funktionellt är de identiska: båda beräknar färgen på varje fragment/pixel.

Sammanfattning

  • Fragment Shader — programmerbart steg i GPU som beräknar färgen på varje pixel i bilden.
  • Antal anrop är lika med skärmupplösningen, vilket gör det till det mest resurskrävande rendringssteget.
  • Texturering, Phong-belysning och post-effekter — fragment shaderns huvuduppgifter.
  • Prestanda beror direkt på antalet texturuppslag och användning av highp precision.
  • Mediump precision och early-z-tester — viktiga optimeringstekniker för mobila GPU:er.
  • OpenGL ES använder termen Fragment Shader, Direct3D — Pixel Shader, innebörden är densamma.
  • GLSL och Metal Shading Language — huvudspråken för att skriva Fragment Shader i mobil utveckling.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också