En introduksjon til shadere i OpenGL

Thu 31 December 2009

Her vil vi kort presentere hva en shader i OpenGL er for noe. Vi vil også prøve å forklare de mest markante forskjellene mellom fixed og programmed -pipe OpenGL. Dette er første artikkelen i en serie som skal ende opp i at du kan lage dine egne shadere.

Historikk

OpenGL er en industri standard, platform uavhengig, API. API spesifikasjonene ble fullført i 1992, og den første implementasjonen kom i 1993. OpenGL API spesifikasjonene blir utviklet av "Architectural Review Board" (ARB) som består av representanter fra 3DLabs, Apple, ATI, Dell, IBM, Intel, NVIDIA, SGI og Sun Microsystems. Les mer om OpenGL her.

Frem til versjon 1.5 var OpenGL basert på en såkallt fixed function pipeline. Det vil si at alle operasjoner gjøres i en bestemt rekkefølge, samt at den underliggende funksjonaliteten er bestemt. En kan skru av og på forskjellige deler av grafikk hardwaren, men en kan ikke programmere den.

I OpenGL 2.0 kom muligheten for å programmere deler av pipelinen, og man fikk da en programmable function pipeline. De to delene man nå fikk tilgang til å styre selv er "Vertex processing" og "Fragment processing. Utviklere kunne nå implementere egne algoritmer for rendering, basert på et høynivå shader språk, nemlig GLSL.

Grunnleggende

Som tidligere nevnt har man valgt å gjøre Vertex og Fragment prosessering programmerbar. Dette fordi at det er disse to delene av pipelinen som utfører de tyngste og mest komplekse operasjonene.

Vertex processing: Operasjoner som blir utført på hver eneste node. Dette er f.eks transformasjoner og lyssetting.

Fragment processing: Operasjoner som blir utført på hver eneste piksel. Disse blir da naturlig nok utført etter at primitiver er rasterisert. Dette er f.eks lesing fra tekstur minne og teksturere fragmenter.

Programmable pipeline kan gjøre alt som fixed pipeline kan, og mye mer.

En shader er en kodesnutt som utføres på en OpenGL programmerbar prosesor, men vi bruker gjerne navnet "OpenGL Shader" for å skille koden fra f.eks "Renderman Shader", eller "DirectX Shader". Som du kanskje allerede har gjettet så har vi to typer OpenGL shadere, nemlig "Vertex shader" og "Fragment shader".

OpenGL gir oss mulighet til å kompilere og linke en shader til et program. Det er disse programmene som kjøres på de programmerbare grafikkenhetene.

  • OpenGL Shading language er et høynivå prosedyre språk.
  • OpenGL Shading language er en del av OpenGL fra versjon 2.0.
  • OpenGL Shading language er basert på C og C++ syntaks.
  • Vi bruker et nesten identisk språk for Vertex og Fragment shadere.

Hvorfor skrive egne shadere?

OpenGL støtter mange tradisjonelle metoder for å rendere scener. Dette gjør at det for mange ikke er nødvendig å skrive egne shadere. En kommer veldig langt ved å bruke de mulighetene som allerede ligge i fixed pipeline.

Men de siste årene har etterspørselen etter mer avanserte effekter, lyssetting med mer blitt større og større. Ønsker du area lights, egne antialiasing algoritmer, procedural textures, med mer så er GLSL verdt å lære seg.

  • Realistiske materialer: metall, stein, tre og lignende.
  • Realistiske lyseffekter: area lights, soft shadows.
  • Effekter: ild, røyk, vann, skyer og lignende.
  • Avansert rendering: GI, Raytracing og lignende.
  • NPR effekter.
  • Procedural textures.
  • Bildebehandling: convolution, unsharp og avanserte blend metoder.
  • Animasjon effekter: key-frame interpolation, partikkel systemer, procedural defined motion.
  • Egendefinerte antialiasing.
  • Generell prosessering: sortering, matematisk modellering, fluid dynamics og lignende.

Mange av elementene i listingen over er mulig, og tradisjoennelt utført via software implementering, men det å nå kunne gjøre jobben i hardware på grafikkortet vil avlaste CPU, samt føre til en dramatisk økning i render ytelse. Det er her på sin plass å nevne at en økning i ytelse krever at implementeringen er god.

En dårlig hardware implementasjon er ikke nødvendigvis raskere en en god software implementasjon.

Inspirasjon

Alle bilder er hentet fra "3Dshaders.com"

{gallery}custom_articles/opengl/glsl intro/galleri{/gallery}

Tagged as : opengl cuda