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!