Avatar billede tangveje Nybegynder
10. marts 2003 - 21:37 Der er 32 kommentarer og
1 løsning

OpenGL programmering under Linux

Jeg har fået den ide at jeg vil kaste mig over noget OpenGL programmering med C++ under Linux, med henblik på, måske en dag, at kunne udvikle spil. Så jeg søgte på google, og det eneste jeg rigtigt fandt var denne side : http://nehe.gamedev.net/ som egentlig ser forfærdelig god ud. Desværre kan jeg ikke få eksemplerne til at virke med GCC.

Jeg ville derfor høre om nogen her kan henvise til en god side omhandlende OpenGL specielt under Linux med GCC, for begyndere og ikke eksperter :) Eller hvad som helst der kan hjælpe mig til at komme igang. Det jeg gerne vil finde er en introduktion til det mest grundlæggende vedrørende OpenGL, alt det andet, mere avancerede, ser der jo ud til at være massere sider om.

På forhånd tak :)
Avatar billede soreno Praktikant
10. marts 2003 - 21:50 #1
Du bør starte med at kigge på glut:
http://www.opengl.org/developers/documentation/glut.html

Det er et crossplatform API der tager sig af triviel kode (input, initialisering af grafik og sådan noget).

Der findes et hav af eksempler, ikke mindst i glut pakken, der bruger glut.

Glut videreudvikles ikke mere men det er et rigtigt godt sted at starte når man skal lære OpenGL - man bliver tvungen til at koncentrere sig om OpenGL istedet for triviel Vinduesopsætning.

Du kan sikkert, afhængig af din distribution, finde nogle developer pakker med glut.

F.eks.
http://rpmfind.net/linux/rpm2html/search.php?query=glut&submit=Search+...
http://packages.debian.org/cgi-bin/search_packages.pl?keywords=glut&searchon=names&subword=1&version=stable&release=all

I øvrigt mener jeg at nogle af nehe's tutorials er portet til glut. Jeg synes dog at nehe's tutorials er ret overfladiske, specielt hvad angår lys..
Avatar billede tangveje Nybegynder
10. marts 2003 - 22:03 #2
Jeg tror jeg allerede har glut installeret... Kan i hvert fald finde bl.a. glut.h og fglut.h i /usr/include/GL

Har ikke kigget nehe's tutorials grundigt igennem, synes bare det var glimrende at finde noget hvor det bliver beskrevet så grundigt, det er sommetider rart at få tingene skåret ud i pap på den måde :)

Vil lige se hvad jeg kan finde ud af
Avatar billede soreno Praktikant
10. marts 2003 - 22:05 #3
Jeg bruger selv noget ala dette som skabelon:
#include <GL/glut.h>

#define WINDOWTITLE "Skabelon"
#define WINDOWWIDTH 640
#define WINDOWHEIGHT 480
#define ZNEAR 0.1f
#define ZFAR 9999.0f

bool fullscreen = false;
bool renderWireframe = false;
int angle = 0;

void init(void)
{
    glClearColor(0.0, 0.0, 0.0, 0.0);

    glClearDepth(1.0f);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glEnable(GL_DEPTH_TEST);   
    glBlendFunc(GL_SRC_ALPHA, GL_SRC_COLOR);
}

void renderFunc(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    renderWireframe ? glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) : glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

    glLoadIdentity();
    glTranslatef(0, 0, -2);
    glRotatef(angle, 0.0f, 1.0f, 0.0f);
    glBegin(GL_QUADS);
        glColor3f(0.0f, 1.0f, 1.0f); glVertex3f( 0.5f,  0.5f, 0.0f);
        glColor3f(1.0f, 0.0f, 1.0f); glVertex3f( 0.5f, -0.5f, 0.0f);
        glColor3f(1.0f, 1.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.0f);
        glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-0.5f,  0.5f, 0.0f);       
    glEnd();

    glutSwapBuffers();
}

void idleFunc()
{
    glutPostRedisplay();
    angle++;
}

void reshapeFunc(int w, int h)
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, (GLfloat)w/(GLfloat)h, ZNEAR, ZFAR);
    glMatrixMode(GL_MODELVIEW);
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glLoadIdentity();
}

void keyboardFunc(unsigned char key, int x, int y)
{
    switch(key)
    {
        case 13: // Enter
            if(glutGetModifiers()==GLUT_ACTIVE_ALT)
            {
                if(fullscreen)
                    glutReshapeWindow(WINDOWWIDTH, WINDOWHEIGHT);
                else
                    glutFullScreen();
                fullscreen=!fullscreen;
            }
            break;
        case 27: // Esc
            glutDestroyWindow(glutGetWindow());
            exit(0);
            break;
        case 'W':
        case 'w':
            renderWireframe=!renderWireframe;
            break;
    }
}

int main(int argc, char** argv)
{
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowSize(WINDOWWIDTH, WINDOWHEIGHT);

    glutInitWindowPosition(((glutGet(GLUT_SCREEN_WIDTH) - WINDOWWIDTH) / 2), ((glutGet(GLUT_SCREEN_HEIGHT) - WINDOWHEIGHT)  /2));
    glutCreateWindow(WINDOWTITLE);

    init();
    glutDisplayFunc(renderFunc);
    glutIdleFunc(idleFunc);
    glutReshapeFunc(reshapeFunc);
    glutKeyboardFunc(keyboardFunc);

    glutMainLoop();
    return 0;
}

Min makefile ser sådan ud (med MinGW - men det burde være det samme som gcc i Linux):
# Compiler
CC=g++

# Parameters given to the compiler
CFLAGS=-s -mwindows

OUTPUT=main.exe

# targets
all:
    $(CC) -c "main.cpp" $(CFLAGS)
    $(CC) -o $(OUTPUT) "main.o" -lopengl32 -lglu32 -lglut32 $(CFLAGS)

clean:
    del *.o
    del $(OUTPUT)
Avatar billede tangveje Nybegynder
10. marts 2003 - 22:12 #4
Jeg er vist lidt lost her. Alle de koder jeg har prøvet giver en masse fejl, din giver dog færrest. Din kode nøjes med disse par fejl

t.c:9: tolkningsfejl before "fullscreen"
t.c:9: 'false' ikke erklæret her (ikke i en funktion)
t.c:9: warning: data definition has no type or storage class
t.c:10: tolkningsfejl before "renderWireframe"
t.c:10: 'false' ikke erklæret her (ikke i en funktion)
t.c:10: warning: data definition has no type or storage class

Har ikke lige styr på makefiles, men det er vel heller ikke nødvendigt at bruge en makefile eller hvad?
Avatar billede tangveje Nybegynder
10. marts 2003 - 22:16 #5
Jeg har en ide om at jeg er gået glip af et eller andet helt elementært her :(
Avatar billede soreno Praktikant
10. marts 2003 - 22:17 #6
hvordan ser output ud hvis du skriver (går udfra din fil hedder main.cpp):
g++ -c main.cpp

?
Avatar billede tangveje Nybegynder
10. marts 2003 - 22:19 #7
main.cpp: In function `void keyboardFunc(unsigned char, int, int)':
main.cpp:75: `exit' undeclared (first use this function)
main.cpp:75: (et kaldenavn der ikke er erklæret, rapporteres kun én gang per
  funktion)
Avatar billede soreno Praktikant
10. marts 2003 - 22:23 #8
Ahh, du mangler at include stdlib

Dine includes (til mit eksemple) skal se sådan ud:
#include <GL/glut.h>
#include <stdlib.h>
Avatar billede tangveje Nybegynder
10. marts 2003 - 22:29 #9
OK, så kommer der intet output (Går som det skal, regner jeg med :)

Men det er som om jeg har overset et eller andet, for jeg får ikke noget ud af det, udover en ubrugelig main.o fil (.o filer plejer da ellers at være executables, eller drømmer jeg?)
Avatar billede soreno Praktikant
10. marts 2003 - 22:33 #10
Du kompilerer med:
g++ -c main.cpp

Og linker med:
g++ -o main -lopengl32 -lglu32 -lglut32


Du kan også samle det i én sætning:
g++ main.cpp -o main -lopengl32 -lglu32 -lglut32

Grunden til jeg adskildte kompileringen og linkningen er at jeg ikke er helt sikker på at det er den korrekte måde at linke på (jeg har ikke lige en Linux boks jeg kan teste på..).
Avatar billede soreno Praktikant
10. marts 2003 - 22:37 #11
Nå ja, jeg glemte vist at fortælle at den eksekvérbare fil, hvis alt går vel, hedder main.

./main
Avatar billede tangveje Nybegynder
10. marts 2003 - 22:38 #12
OK, det er det jeg siger, jeg er gået glip af et eller andet elementært, må lige have styr på det før jeg fortsætter for meget med openGL, men nu har jeg da noget at gå tilbage til :)

Hvis jeg bruger din 2 delte metode får jeg følgende fejl

/usr/bin/ld: cannot find -lopengl32
collect2: ld returned 1 exit status

Betyder vel at openGL mangler, hvilket jeg ikke helt kan forstå. :(
Avatar billede soreno Praktikant
10. marts 2003 - 22:46 #13
Lidt research indikerer at libs'ene hedder noget forskelligt fra Windows..

Prøv:
g++ -o main -lGL -lGLU -lglut32

Hvis ikke det virker så prøv:
g++ -o main -lGL -lGLU -lglut
Avatar billede tangveje Nybegynder
10. marts 2003 - 22:50 #14
Ja OK, får da prøvet nogen ting af her :) Følgende fejl får jeg med din sidste kommando

/usr/lib/gcc-lib/i386-redhat-linux/3.2/../../../crt1.o: In function `_start':
/usr/lib/gcc-lib/i386-redhat-linux/3.2/../../../crt1.o(.text+0x18): undefined re
ference to `main'
collect2: ld returned 1 exit status
Avatar billede soreno Praktikant
10. marts 2003 - 22:52 #15
Har du installeret alle pakker (OpenGL, glut og gcc) fra Red Hat cd'en ?

Så vidt jeg er orienteret er gcc3.2 ikke kompatibel med gcc2.9.x - dvs. hvis libs'ene er lavet af 2.9.x dur de ikke med 3.2 versionen.
Avatar billede tangveje Nybegynder
10. marts 2003 - 22:55 #16
Ja, jeg har lavet en fuld installation (alt hvad der kan presses ud af de 3 cd'er), så hvis det følger med RH som standard er det intstalleret.
Avatar billede soreno Praktikant
10. marts 2003 - 22:56 #17
Prøv at compile dette på samme måde:

#include <GL/glut.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
  return 0;
}

giver det også problemer ?
Avatar billede tangveje Nybegynder
10. marts 2003 - 22:58 #18
Giver præcist samme fejl
Avatar billede tangveje Nybegynder
10. marts 2003 - 23:02 #19
Her er lige med kommandoer og det hele, hvis det skulle være til nogen hjælp

[casper@0x503ed1d6 casper]$ g++ -c test.cpp
[casper@0x503ed1d6 casper]$ g++ -o test -lGL -lGLU -lglut
/usr/lib/gcc-lib/i386-redhat-linux/3.2/../../../crt1.o: In function `_start':
/usr/lib/gcc-lib/i386-redhat-linux/3.2/../../../crt1.o(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status
Avatar billede soreno Praktikant
10. marts 2003 - 23:04 #20
Ahhh nu ved jeg det - du skal jo også linke med "main.o", sådan:
g++ -o main main.o -lGL -lGLU -lglut
Avatar billede tangveje Nybegynder
10. marts 2003 - 23:07 #21
Ahhh, fedest, nu lykkedes det :) Men, når jeg så skriver ./main får jeg denne dejligt korte fejl

Lagersegmentfejl

Som siger mig absolut intet
Avatar billede tangveje Nybegynder
10. marts 2003 - 23:08 #22
Igen, lige det hele for god ordens skyld

[casper@0x503ed1d6 casper]$ g++ -c main.cpp
[casper@0x503ed1d6 casper]$ g++ -o main main.o -lGL -lGLU -lglut
[casper@0x503ed1d6 casper]$ ./main
Lagersegmentfejl
Avatar billede soreno Praktikant
10. marts 2003 - 23:10 #23
Hvordan har du installeret OpenGL ?
Du kører vel X-window ?
Avatar billede tangveje Nybegynder
10. marts 2003 - 23:13 #24
Jeg her ikke "personligt" installeret OpenGL, det er installeret automatisk sammen med RH, hvis det da er installeret (hvilket dog ville undre mig hvis det ikke var, ellers ville jeg vel ikke have header filerne, og den ville vel slet ikke compile overhovedet)
Avatar billede tangveje Nybegynder
10. marts 2003 - 23:14 #25
Og ja jeg kører med X-window
Avatar billede soreno Praktikant
10. marts 2003 - 23:17 #26
Nu er jeg ikke ekspert i Red Hat, men sidst jeg prøvede skulle jeg selv installere OpenGL.
Jeg har et nvidia baseret kort (GeForce2mx) og hentede en driver her:
http://www.nvidia.com/view.asp?IO=linux_display_ia32_1.0-4191


Start med at hente og køre denne:
ftp://download1.nvidia.com/XFree86_40/1.0-4191/NVchooser.sh

Den fortæller hvilke filer der skal hentes for at du kan installere OpenGL.

Læs dernæst denne meget grundigt og hold tungen lige i munden:
http://download.nvidia.com/XFree86_40/1.0-4191/README

(Det kræver lidt arbejde at få det til at virke).
Avatar billede tangveje Nybegynder
10. marts 2003 - 23:21 #27
OK, vil jeg kigge på. Men uanset hvad har du da i hvert fald gjort dig fortjent til points... Tak for hjælpen, jeg tror efterhånden jeg har en hel del der skal kigges på :)
Avatar billede soreno Praktikant
10. marts 2003 - 23:26 #28
Avatar billede soreno Praktikant
10. marts 2003 - 23:28 #29
Avatar billede tangveje Nybegynder
10. marts 2003 - 23:30 #30
Takker :)
Avatar billede tangveje Nybegynder
11. marts 2003 - 05:28 #31
Og så fik jeg det til at virke, egentlig slet ikke så kompliceret... Så tak endnu en gang, endelig kan jeg komme igang med at lære noget :)
Avatar billede soreno Praktikant
11. marts 2003 - 08:55 #32
"egentlig slet ikke så kompliceret.." skrev du 6 timer efter dit forrige indlæg.. :-)
Avatar billede tangveje Nybegynder
11. marts 2003 - 15:05 #33
Jeg valgte at bruge størstedelen af de 6 timer på andre ting :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester