Laboration 0

Introduktion/repetition till OpenGL 3.2 med shaders

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 transformering 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 (testat på Linux och Mac):
Lab0.tar.gz
common.tar.gz

Äldre versioner:
Lab0-150902.tar.gz
common-150902.tar.gz
Lab0-2014.tar.gz
common-2014-09-05.tar.gz
Lab0-2014-prel.tar.gz
Lab0.tar.gz
common-2013-09-17.tar.gz

Den lite äldre preliminära 2014-versionen är testad men makefilen fungerar inte. Man kan lätt kompilera med given kommandorad, given i huvudprogrammet. Detta är korrigerat i den nya versionen.

Kompilera med make (makefil enbart för Linux) eller med den kommandorad som finns övers i lab0.c (Linux och Mac). Kör med ./lab0.

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?

Ljussättningen är "fusk", tar bara normalvektorns z-komponent, vilket koperas till "shade" i vertex-shaders). 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 fragment shadern, 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.)
VectorUtils3: Vektor- och matrisoperationer.
LoadTGA: Texturladdare för TGA-filer.
MicroGlut: Förenklad variant av GLUT (Linux och Mac samt begrändas beta för Windows).

För Mac-användare: För Mac använder jag Lightweight IDE, vars viktigaste funktion är att kompilera bekvämt utan makefiler. Därför är det inga sådana med. MacOSX 10.7 eller bättre krävs för OpenGL 3.2.

För Windows/Visual Studio-användare: I demomappen (TSBK07-files/demos/)för grundkursen i datorgrafik (TSBK07) finns flera exempelprojekt som ni kan använda som utgångspunkt. Leta efter demos märkta "vs". Tyvärr använder de det äldre vektorbiblioteket VectorUtils2, mendet hoppas jag är ett måttligt problem. Ett nyare demo, med nya MicroGlut-betan, finns här: länk

1. Modifiera position, rotation, kamera

Labbfilen definierar tre matriser (projectionMatrix, viewMatrix, objectExampleMatrix), multiplicerar ihop två av dem och laddar upp till två matriser i shadern, kallas där projectionMatrix och viewMatrix (men namnen måste inte matcha mellan shader och huvudprogram).

Ändra lämplig matris för att få kaninen att snurra. Om du gör detta tidsberoende får du en enkel animation.

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

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!