Laboration 0

Introduktion/repetition till OpenGL 3.2 med shaders

Detta är en helt ny labb 2012. Tidigare pekade vi slött till grundkursens shaderlabb, men det känns inte som vad ni behöver. Jag hoppas detta materialet, om än kort, är mer fokuserat på de behov ni har inför denna kurs. Det finns säkert några problem att fixa. Säg till oss om något verkar konstigt. Förslag till roliga uppgifter som vi glömde är välkomna!

Denna laboration är ett koncentrat av våra grundkurslabbar. Vi startar lite längre in, ni får en del givet att starta med så vi kommer till saken.

Inga uppgifter är obligatoriska i denna labb. Gör de delar som du tycker känns viktigast för dig.

Har du inte använt OpenGL 3.2 förr så är det viktigt att du övar på att styra transfomering och shading med input från huvudprogrammet.

Är du ovan vid shaders så bör du öva speciellt på dessa.

0. Kom igång

Ladda ner labbskalet här:

Lab0.tar.gz


Kompilera och kör.

Hur gör man för att placera ett objekt där man vill i en scen? Hur flyttar du kaninen 0.1 åt höger?

Vad händer om du inte tar normalens z till alla komponenter? Testa med x och y!

Är detta en Phong-shader eller Gouraud-shader?

Trevliga övningar om du är ovan vid shaders: Gör en shader som deformerar objektet, t.ex. får den att slingra som en orm. Gör en procedurell textur i shader, t.ex. i stil med Ingemar's Psychedelic Teapot.


Notera att ett antal externa hjälpmoduler ingår:

GL_utilities: Shaderladdare och FBO-byggare.
loadobj: Laddare av enkla OBJ-filer. (Klarar tyvärr inte komplexa OBJ.)
VectorUtils2: Vektor- och matrisoperationer.
LoadTGA: Texturladdare för TGA-filer.
ZPR: Kamerahantare.

För Mac-användare: För Mac använder jag Lightweight IDE med MicroGlut (nedstrippad GLUT tänkt speciellt för GL 3.2). MacOSX 10.7 eller bättre krävs för OpenGL 3.2. Jag skall fixa länkar, men det beror lite på om vi har några som vill testa.

1. Uppladdning av en matris till

ZPR (zoom pan rotate) är en modul som ger en kamerahantering som kan vara lämplig för att titta runt på ett objekt, t.ex. för att se hur en shader beter sig. Men tyvärr händer ingenting, för labbskalet innehåller ingen scen-till-kameramatris. Den kan man hämta från ZPR med zprGetProjectionMatrix(). Ladda upp denna till vertexshadern och använd den som del av transformationsmultiplikationen.

2. Varde ljus

Från början har vi fuskljus. Lägg till ljuskällor. En eller flera, diffusa eller spekulära.

Enkelt: Diffus belysning. Helst Phong.

Svårare: Tag med spekulärkomponenten, dvs hela tre-komponents Phongmodellen.

Svårast: Gör flera ljuskällor, med olika egenskaper, färger, positioner, vissa positionsljus och vissa riktningsljus (oändligt avstånd).

3. Bygg en scen

Projektion är givet i koden, levereras från ZPR med zprGetProjectionMatrix. Observera att detta bara är en bekvämlighet; i "riktiga" program kanman ha full kontroll över alla matriser så mycket man önskar.

Gör flera objekt i scenen. Bara att ha två objekt är intressant nog.

Animera ett objekt. För att göra detta behöver du tiden, som du får med GLfloat t = (GLfloat)glutGet(GLUT_ELAPSED_TIME);

4. Texturer

Lägg till en textur till modellen! (Detta är tämligen oförändrat mot hur det fungerar i OpenGL 2.)

I huvudprogrammet måste då texturens bindas till en texturenhet, och texturenhetens nummer meddelas till shadern. Dessutom måste texturkoordinater finnas tillgängliga, och interpoleras från vertex till fragment shader (eller genereras från geometrin).

I huvudprogrammet:
glUniform1i(glGetUniformLocation(program,"exampletexture"),0);//the last argument has to be the same as the texture-unit that is to be used
glActiveTexture(GL_TEXTURE0);//which texture-unit is active
glBindTexture(GL_TEXTURE_2D, texture);//load the texture to active texture-unit
vertex shader:
out vec2 frag_texcoord;
frag_texcoord=in_TexCoord;
fragment shader:
in vec2 frag_texcoord;
uniform sampler2D exampletexture;
out_Color=texture(exampletexture,frag_texcoord);

Vid oklarheter, fråga oss!

Efter dessa övningar hoppas vi att ni känner er bekväma nog med OpenGL 3.2 och GLSL så de inte är något problem i följande laborationer!