Buffer i OpenGL. Grunnleggende Grafikk Våren Color Buffer Per-Pixel Buffer Storage. Color buffer. Kommando glgetintegerv(parameter, GLint *svar)

Størrelse: px
Begynne med side:

Download "Buffer i OpenGL. Grunnleggende Grafikk Våren 2007. Color Buffer Per-Pixel Buffer Storage. Color buffer. Kommando glgetintegerv(parameter, GLint *svar)"

Transkript

1 Buffer i OpenGL Grunnleggende Grafikk Våren 2007 OpenGL Buffers og Spesialeffekter Arnt Roald Kristoffersen arntrk@hin.no D3390 Forskjellige buffer Color buffer Depth buffer Stencil buffer Accumulation buffer Sletting av buffer Fragment Tester Avanserte teknikker Motion blur ITE 1605 Grunnleggende Grafikk for Spillprogrammering og ITE1530 Datamaskingrafikk Color buffer Sjekke for Støtte av stereo bool stereobuff; glgetbooleanv(gl_stereo, stereobuff); Gir oss Venstre- og Høyre- Buffer Sjekke for støtte av double-buffering bool doublebuff; glgetbooleanv(gl_doublebuffer, doublebuff); Gir oss front- og bak- buffer Sjekke antall Aux buffer int antall; glgetintegerv(gl_aux_buffers, antall); Gir oss antall ekstra buffer Color Buffer Per-Pixel Buffer Storage Kommando glgetintegerv(parameter, GLint *svar) parameter GL_RED_BITS, GL_GREEN_BITS, GL_BLUE_BITS, GL_ALPHA_BITS GL_INDEX_BITS

2 Depth Buffer Inneholder dybde verdi for hver pixel Viktig å kunne rendre bare deler av et objekt Distansen fra øyet til objektet Hidden Surface Removal Stencil Buffer Begrenser rendring til deler av skjermen Eksempel fra innsiden av traktoren Render innsiden av traktoren instumenter etc. Rendre vinduene til stencil buffer Rendre terrenget utenfor Per-Pixel Buffer Storage int svar; glgetintegerv(gl_depth_bits, &svar) Accumulation Buffer Inneholder RGBA farge verdier udefinert ved bruk i color-index mode Typisk bruk akkumulere serier med bilder til et endelig sammensatt bilde. Alltid utført i rektangulære bokser, som vanligvis overført data til og fra color buffer. Slette bufferene Det å slette skjermen eller uansett annet buffer, er typisk en av de mest dyre operasjoner man kan utføre, se tabellen nedenfor Oppløsning Antall piksler Framerate 600 x 400 = x 600 = x 1024 = x 1050 = Table 1: Rendring av en Kube (QtExample) med "nvidia GeForce Go 7900GTX"

3 Slette bufferene Kommandoer for spesifisering av slette verdier glclearcolor(red, green, blue, alpha) glclearindex(index) glcleardepth(depth) glclearstencil(glint s) glclearaccum(red, green, blue, alpha) Slette bufferene glclear(glbitfield mask) Verdier for mask GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT, GL_ACCUM_BUFFER_BIT. Eksempel glclear( GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT ) Fragment tester Sortert etter hvor tidlig testen gjøres Scissor test Alpha test Stencil test Depth test Blending Dithering Logical operations Jo tidligere en fragment kan forkastes, jo raskere tegnes scenen Scissor test Alpha test Definerer et rektangulært område på skjermen, hvor kun fragmenter som havner innen for dette område vil tegnes til skjermen. Rektanglet defineres ved å bruke kommandoen: glscissor(glint x, GLint y, GLsizei width, GLsizei height) Tilstands variablene GL_SCISSOR_TEST 1 bestemmer om testen er aktivert, mens GL_SCISSOR_BOX 2 definerer posisjon og størrelse på rektanglet. 1 Brukes med kommandoene glenable(), gldisable(), og glisenabled(). 2 Brukes med kommandoen glgetintegerv(). Lar deg akseptere eller avvise en fragment basert på dens alpha verdi, ved å bruke kommandoen: glalphafunc(glenum func, GLclampf ref) Setter referanse verdien (ref) og sammenlignings funksjonen (func) for alpha testen. Verdien ref er klampet mellom 0 og 1. Mulige verdier for func, se tabellen nedenfor. Parameter GL_NEVER GL_ALWAYS GL_LESS GL_LEQUAL GL_EQUAL GL_GEQUAL GL_GREATER GL_NOTEQUAL Meaning Never accept the fragment Always accept the fragment Accept fragment if fragment alpha < reference alpha Accept fragment if fragment alpha reference alpha Accept fragment if fragment alpha = reference alpha Accept fragment if fragment alpha reference alpha Accept fragment if fragment alpha > reference alpha Accept fragment if fragment alpha reference alpha Tilstands variabelen GL_ALPHA_TEST 1 bestemmer om testen er aktivert 1 Brukes med kommandoene glenable(), gldisable(), og glisenabled().

4 Stencil test Stencil testen sammenligner en referanse verdi med pikselen lagret i stencil bufferet, men blir utført bare hvis det finnes en stencil buffer (hvis ikke, så vil testen alltid passere). Velger sammenligningsfunksjonen, med glstencilfunc(glenum func, GLint ref, GLuint mask) glstencilfuncsepatate(glenum face, GLenum func, GLint ref, GLuint mask) Funksjon GL_NEVER GL_LESS GL_LEQUAL GL_GREATER GL_GEQUAL GL_EQUAL GL_NOTEQUAL GL_ALWAYS Beskrivelse Feiler alltid. Passerer hvis ref verdien < stencil buffer verdien Passerer hvis ref verdien stencil buffer verdien Passerer hvis ref verdien > stencil buffer verdien Passerer hvis ref verdien stencil buffer verdien Passerer hvis ref verdien = stencil buffer verdien Passerer hvis ref verdien stencil buffer verdien Vil alltid passere testen. Satt som default. Stencil test Bestemme hvordan data in stencil bufferet er modifisert når testen slår til eller feiler, med glstencilop(glenum fail, GLenum zfail, GLenum zpass) glstencilopseparate(glenum face, GLenum fail, GLenum zfail, GLenum zpass) Funksjon Beskrivelse GL_KEEP Verdien i stencil bufferet forandres ikke. GL_ZERO Verdien i stencil bufferet blir satt til 0. GL_REPLACE Verdien i stencil bufferet blir satt til ref verdi GL_INCR Verdien i stencil bufferet økes med 1 GL_INCR_WRAP GL_DECR Verdien i stencil bufferet minskes med 1 GL_DECR_WRAP GL_INVERT Inverterer bitene i stencil buffer verdien Depth test Funksjonen til dybde testen kan bestemmes, med gldepthfunc(glenum func) Funksjon Beskrivelse GL_NEVER Passerer aldri dybde testen. GL_ALWAYS Passerer alltid dybde testen. GL_LESS Passerer testen hvis verdien er mindre. (default) GL_LEQUAL Passerer testen hvis verdien er mindre eller lik. GL_EQUAL Passerer testen hvis verdien er lik. GL_GEQUAL Passerer testen hvis verdien er større eller lik. GL_GREATER Passerer testen hvis verdien er større. GL_NOTEQUAL Passerer testen hvis verdien er ikke lik. Dybde testen kan slåes av og på, ved å sette tilstanden GL_DEPTH_TEST. Blandingsfunksjoner Blending glblendfunc(glenum srcfactor, GLenum destfactor) glblendfuncseparate(glenum srcrgb, GLenum destrgb, GLenum srcalpha, GLenum destalpha) Parametrene GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_DEST_COLOR, GL_ONE_MINUS_DEST_COLOR, GL_SRC_ALPHA,... Enable blending glenable(gl_blend)

5 Dithering Logiske operasjoner For systemer med dårlig farge oppløsning Mellom fragmentene og pikslene i farge bufferet Mulig å forbedre oppløsningen, Implementert i hardware på bekostning spatial oppløsning Slå av og på med tilstanden GL_DITHER gldisable() og glenable() kommando gllogicop(glenum opcode) Opcode GL_AND, GL_OR, GL_NAND, GL_NOR, osv. Se Rødboka side 481 Blending billboarding Accumulation buffer void render () { glenable(gl_blend); glblendfunc(gl_src_alpha, GL_ONE_MINUS_SRC_ALPHA); glenable(gl_alpha_test); glalphafunc(gl_greater, 0); Kommando glaccum(glenum op, GLfloat value) } glbindtexture(gl_texture_2d, texname); // kalkulasjoner som er nødvendig for å vende treet mot kamera glbegin(gl_quads); gltexcoord2f(0,0); glvertex3f(p1); gltexcoord2f(1,0); glvertex3f(p2); gltexcoord2f(1,1); glvertex3f(p3); gltexcoord2f(0,1); glvertex3f(p4); glend(); P4 P3 Operation GL_ACCUM GL_LOAD GL_ADD GL_MULT GL_RETURN Description Får RGBA verdier fra farge bufferet, multiplisere dem med value og deretter legge dem til eksisterende innhold av accumulation buffer Får RGBA verdier fra farge bufferet, multiplisere dem med value og erstatte dem med eksisterende innhold av accumulation buffer Legg til value parameteren til hver eksisterende verdi i accumulation buffer Multipliser verdien av hver piksel i accumulation buffer med value Multipliser verdien av hver piksel i accumulation buffer med value og send resultatet til farge buffer. P1 P2

6 Accumulation buffer Motion Blur Bruker accumulation bufferet, flere ganger, slik glaccum(gl_accum, 1.0f/N) N er antall bilder som blir akkumulert, fungerer her som en decay factor mellom bildene. Sender resultatet tilbake farge bufferet glaccum(gl_return, 1.0) Stencil Buffer Speiling av sjakkbrikker i sjakkbrett void render() { glclear(gl_stencil_buffer_bit); glenable(gl_stencil_test); glstencilfunc(gl_always, 1, 1); glstencilop(gl_replace, GL_REPLACE, GL_REPLACE); gldepthmask(gl_false); glcolormask(gl_false, GL_FALSE, GL_FALSE, GL_FALSE); glcullface(gl_back); glenable(gl_cull_face); // rendre sjakkbrettet til stensilbuffer gldisable(gl_cull_face); gldepthmask(gl_true); glcolormask(gl_true, GL_TRUE, GL_TRUE, GL_TRUE); glstencilfunc(gl_equal, 1, 1); glstencilop(gl_keep, GL_KEEP, GL_KEEP); // rendre sjakkbrikkene speilet i brettet gldisable(gl_stencil_test); } // rendre sjakkbrettet på normal måte // rendre sjakkbrikkene på normal måte