Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Artiklar / Titel på artikeln

Programmera OpenGL i C++ Del 2

Postad 2004-12-10 av Jesper Brännström i sektionen ASP.NET, C#, Okategoriserat med 5 Kommentarer | Läst av: 5270, Betyg: 85%

Förord

I föregående artikel gick vi igenom hur man kommer igång med programmering av OpenGL i Visual Studio.NET. Denna artikel utgår från föregående artikel och går igenom lite mer specifikt vad varje funktion gör. Det som koden i denna artikel kommer att göra är att få en tredimensionell kub att rotera på skärmen.
Innehåll
  » våra funktioner
  » main funktinoen
  » init funktionen
  » reshape funktionen
  » display funktionen
  » Slutresultat
  » Avslutning
Relaterade artiklar
  » Programmera OpenGL i C++ Del 1
§


våra funktioner

Koden i denna artikel kommer bestå av fyra funktioner.










FunktionFörklaring
void display() Har hand om själva utritningen på skärmen
void init() Har hand om initieringen som behöver göras första när programmet startar
void reshape(int w, int h) Denna funktion har hand om sådant som måste ändras då fönstret ändrar storlek.
void main(int argc, char** argv) Uppstarten av programmet




main funktinoen

Vi börjar med att gå igenom vad funktionerna i main funktionen gör. Såhär ser koden ut för main.


int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Andra Opengl Programmet");
init();

glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(display);
glutMainLoop();

return 0;
}


glutInit(&argc, argv);
Initierar glut biblioteket. Anledningen till att man skickar med argumenten från main är att glut kan använda vissa argument då man startar programmet.

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
Berättar för glut att vi vill använda oss av dubbel buffert och RGB skalan för färger.

glutInitWindowSize(500,500);
Sätter vilken storlek som fönstret skall ha vid uppstart.

glutInitWindowPosition(100, 100);
Sätter startpositionen på fönstret.

glutCreateWindow("Andra Opengl Programmet");
Skapar ett fönster och sätter titelraden till det man har satt i parametern.

glutDisplayFunc(display);
Tar emot en funktions pekare till en funktion och säger till glut att display är våran display funktion. glutMainLoop ser sedan till att köra denna funktion.

glutReshapeFunc(reshape);
Anger vilken funktion som ska köras då fönstret ändrar storlek. Denna funktion ska vara av typen void
(*func) (int, int). Där de båda int parametrarna är bredd och höjd.

glutIdleFunc(display);
Anger vilken funktion som ska köras då programmet inte har något att göra. I denna applikation anger vi att display ska vara våran funktion eftersom vi vill att den ska rita om skärmen hela tiden.

glutMainLoop()
Startar progammets huvud loop.


init funktionen


void init()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glEnable(GL_DEPTH_TEST);
}

Init funktionen är i detta program väldigt simpel. Bara två funktioner som måste sättas då programmet kör igång.

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
Det denna funktion gör är att den sätter den färg som ska bli då skärmen rensas. Mellan varje utritning måste man nämligen rensa skärmen. gl sätter denna funktion till (0,0,0,0) som standard om man inte har med funktionen i sin kod.

glEnable(GL_DEPTH_TEST);
Denna funktion aktiverar glfunktioner och glDisable avaktiverar. Det finns över 60st värden som denna funktion kan ta som inparameter. I detta fall aktiverar vi djup test. Ni kan testa att kommentera bort denna rad för att se hur kuben ser ut utan att använda sig av depth test.



reshape funktionen


void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);

glLoadIdentity();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 0.1, 100.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

gluLookAt(0.0, 0.0, -1.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}

Glut kommer att se till att denna funktion körs varje gång som fönstret ändrar storlek.


display funktionen


void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // ränsar alla pixlar på skärmen

glRotatef(angle, 1.0f, 1.0f, 1.0f); //roterar våran kub

glBegin(GL_QUADS); //startar våran Quad utritning,

glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f( 0.3f, 0.3f,-0.3f); //Topp
glVertex3f(-0.3f, 0.3f,-0.3f);
glVertex3f(-0.3f, 0.3f, 0.3f);
glVertex3f( 0.3f, 0.3f, 0.3f);

glColor3f(0.0f, 1.0f, 1.0f);
glVertex3f( 0.3f,-0.3f, 0.3f); //Botten
glVertex3f(-0.3f,-0.3f, 0.3f);
glVertex3f(-0.3f,-0.3f,-0.3f);
glVertex3f( 0.3f,-0.3f,-0.3f);

glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f( 0.3f, 0.3f, 0.3f); //Framsida
glVertex3f(-0.3f, 0.3f, 0.3f);
glVertex3f(-0.3f,-0.3f, 0.3f);
glVertex3f( 0.3f,-0.3f, 0.3f);

glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f( 0.3f,-0.3f,-0.3f); //baksida
glVertex3f(-0.3f,-0.3f,-0.3f);
glVertex3f(-0.3f, 0.3f,-0.3f);
glVertex3f( 0.3f, 0.3f,-0.3f);

glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-0.3f, 0.3f, 0.3f); //Vänster
glVertex3f(-0.3f, 0.3f,-0.3f);
glVertex3f(-0.3f,-0.3f,-0.3f);
glVertex3f(-0.3f,-0.3f, 0.3f);

glColor3f(1.0f, 0.0f, 1.0f);
glVertex3f(0.3f, 0.3f,-0.3f); //Höger
glVertex3f(0.3f, 0.3f, 0.3f);
glVertex3f(0.3f,-0.3f, 0.3f);
glVertex3f(0.3f,-0.3f,-0.3f);

glEnd();

glutSwapBuffers(); //Shiftar buffert
}

Displayfunktionen är den funktion som sköter självaste utritningen på skärmen.

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Rensar skärmen. Det som måste rensas i detta program är färg och djup buffert.

glRotatef(angle, 1.0f, 1.0f, 1.0f);
Kanske inte är allt får svårt att lista ut att denna funktion sköter roteringen av våran kub. Exakt hur denna funktion fungerar kommer vi gå igenom i nästa artikel.

glBegin(GL_QUADS);
Här specifierar vi vilken typ av data vi ska rita ut. Här kan vi ange om vi vill rita linjer, punkter eller något annat. De olika alternativen som finns är
















VärdeFörklaring
GL_POINTS Individuella punkter
GL_LINES Linje
GL_LINE_STRIPSerie av ihopkopplade linjer
GL_LINE_LOOP Serie av ihopkopplade linjer fast där det blir en linje mellan sista och första punkten
GL_TRIANGLES Trianglar
GL_TRIANGLE_STRIP Ihoplänkade trianglar i strip ordning
GL_TRIANGLE_FANIhoplänkade trianglar i fan ordning
GL_QUADSFyrsidiga polygoner
GL_QUAD_STRIPIhoplänkade fyrsidiga polygoner
GL_POLYGONSimpel vanlig polygon



glColor3f(0.0f, 0.0f, 1.0f);
Sätter vilken färg som ska användas i RGB format. Kan vara värden från 0.0 till 1.0. Denna rad ger alltså blå färg.

glVertex3f( 0.3f, 0.3f,-0.3f);
Skapar i detta fall en punkt i en 3d rymd. Eftersom vi använder oss av Quads så kommer inget att ritas ut förän den fått 4st Vertex punkter. Denna funktion kan även skrivas glVertex2f eller glVertex4f. Där siffran står för hur många dimentioner som ska användas. f:et i slutet står för att det ska vara GLfloat som invärde. Kan vara s, i, f eller d. Där s står för single, i för int, f för float och d för double. Det är däremot rekommenderat att använda sig av float eftersom grafikkortetn idag är anpassade för att beräkna float tal.

glEnd();
Avslutar våran glBegin()

glutSwapBuffers();
Eftersom vi använder oss av dubble buffert så måste vi även skifta mellan våra bufferts. Detta är precis vad denna funktion gör.


Slutresultat

Slutresultatet efter att ni skrivigt koden ovanför kommer att se ut såhär. En kub som roterar.



Avslutning

Nu har ni fått lite större överblick över vad dom de olika funktionerna i glut, glu och gl gör. Nästa artikel kommer att handla om rotation, translation och skalning av objekt. Om ni har några synpunkter på denna artikel eller om det är någon bit ni inte förstår, tveka inte att höra av er till mig så får jag får göra något åt det. Lycka till med OpenGL kodandet och glöm inte att testa att sätta olika värden på funktionerna, det är ett mycket bra sätt att lära sig hur de fungerar.

Här har ni även källkoden till denna artikel:
Källkod
Upp

5 Kommentarer


  1. Krister Johansson
    14 dec 2004

    Varför får jag domma felen? Jag har tagit källkoden osv men det funkar inte.... c:\documents and settings\administratör\mina dokument\visual studio projects\firstoplelgl\asdf.cpp(3): warning C4305: 'initializing' : truncation from 'double' to 'GLfloat' och c:\documents and settings\administratör\mina dokument\visual studio projects\firstoplelgl\asdf.cpp(14): warning C4305: 'argument' : truncation from 'double' to 'GLfloat'


  2. Jesper Brännström
    14 dec 2004

    Tack Krister för att du meddelade mig detta. Självklart måste man skriva 0.0f istället för 0.0 eftersom kompilatorn tolkar 0.0 som en double och inte en float som det ska vara i detta tillfälle. Jag har nu ändrat detta och lagt upp ny källkod. Nu ska det fungera :-)


  3. Eric Johansson
    6 sep 2005

    När kommer nästa artikel??? Skulle gärna vilja läsa mer!


  4. Jesper Brännström
    7 sep 2005

    Det var ca 8-9 månader sen jag skrev ihop dessa två artiklar. Jag hoppades på lite respons men det verkar som dessa artiklar inte är så intressanta. Kul i alla fall att du gillade att läsa dem Eric. Jag får se ifall jag kanske tar tag i att skriva vidare på den här serien. Lovar inget just nu i alla fall. Om jag skriver fler artiklar. Vad är de i så fall ni vill se?


  5. Rasmus Anderzon
    21 jun 2006

    Om man får rösta så röstar jag på att en till artikel. Mycket bra artiklar

Skriv en kommentar på artikeln

Ditt betyg på artikeln



Kommentar:





Nyligen

  • 09:10 Casinos in der Schweiz
  • 07:35 AI Presentation Platform
  • 09:54 casinos in Ireland
  • 07:11 Hjälp, byta till naturlig deo – fu
  • 13:56 Vinkkejä lainojen yhdistämiseen?
  • 14:26 Website about cricket
  • 12:24 Bästa casinobonusarna just nu, har
  • 17:31 Mostbet Bangladesh

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 574 887
28 077
260 357
7 397
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies