PDA

View Full Version : [C] OpenGl


scorpion89
08-05-2006, 16:50
Ho dei problemi a fare un programmino semplice semplice sotto linux ecco il codice:

#include <stdio.h>
#include <stdlib.h>
#include <GL/gl.h>
#include <GL/glx.h>
#include <GL/glu.h>

int main(){

glBegin( GL_LINES );

glEnd();

return 0;
}


Ma quando vado a compilare con "gcc prova_opengl.c -o prova" mi da questo errore.

/tmp/ccAKxJLS.o: In function `main':
open.c:(.text+0x24): undefined reference to `glBegin'
open.c:(.text+0x29): undefined reference to `glEnd'
collect2: ld returned 1 exit status


Più che un errore delle opengl sembrerebbe un errore di mancanza delle open ma le ho installate correttamente!

Ciao e grazie

andbin
08-05-2006, 17:39
Ma quando vado a compilare con "gcc prova_opengl.c -o prova" mi da questo errore.

/tmp/ccAKxJLS.o: In function `main':
open.c:(.text+0x24): undefined reference to `glBegin'
open.c:(.text+0x29): undefined reference to `glEnd'
collect2: ld returned 1 exit status
Usa:
gcc -lGL prova_opengl.c -o prova

Per il momento dovrebbe bastare (per l'esempio che hai postato). Man mano che sviluppi con OpenGL, potrebbe poi essere necessario linkare altre librerie, sempre usando il parametro -l.

scorpion89
08-05-2006, 17:49
Con gcc -lGL nn funzionava, dopo un breve momento di panico sono caduto nel rapsus omicida provando tutte le combinazioni e prima di finire in paranoia ho trovato la soluzione.
gcc -lGLU prova_opengl.c -o prova
funziona!!!!!

Ciao e grazie

PS di quali altre librerie potrei aver bisogno??

scorpion89
08-05-2006, 19:23
Finalmente sono riuscito a fare un programmino che per ora nn fa niente ma almeno sono riuscito a buttare giù un po' di dubbi. Il codice è in versione didattica(davvero commentato..)
Potreste guardarlo e dirmi se ci sono errori colossali o cmq se si può fare meglio
Accetto tutti i commenti

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

//programma base da implementare
int main( int argc , char *argv[] ){

//inizializzazione modalita video
glutInit( &argc , argv );
//scelgo la modalità di visualizzazione
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );

//creo la finestra
glutInitWindowSize( 500 , 500);
//posizionamento della finestra
//glutInitWindowPosition( 100 , 100 );

glutCreateWindow( "Titolo Finestra" );

//eventi ke vengono gestiti dalle OpenGL e vengono monitorati continuamente
//glutDisplayFunc(<procedura>); //nn può mancare è essenziale
//glutReshapeFunc(<procedura>); //viene chiamata al momento del resize della finestra argomenti: larghezza ,altezza
//glutMouseFunc(<procedura>); //viene chiamata alla pressione del mouse argomenti: bottone, stato(premuto o rilasciato) , posizioni del puntatore
//glutKeyboardFunc(<procedura>); //viene chiamata alla pressione di un tasto argomenti: carattere , posizione del mouse
//glutTimerFunc(<timeout>,<procedura>,<intero>); //viene chiamata ogni tot millisecondi

//abilitazioni grafiche
glEnable( GL_DEPTH_TEST );
glEnableClientState( GL_COLOR_ARRAY ); //abilitazione della gestione
glEnableClientState( GL_VERTEX_ARRAY ); //di array dei vertici, colori e normali

//dichiarazione array
//glVertexPointer( 3 , GL_FLOAT , 0 , <array> );
/* spiegazione:
arrays:

glVertexPointer: identifica quale e' l'array di vertici (quarto
argomento) e comunica che gli elementi di tale array sono triple
di numeri GL_FLOAT da individuarsi nella struttura dati array in
modo contiguo (0 valore di skip). Simili chiamate di
identificazione valgono per i colori e per le normali.
*/
//glColorPointer( 3 , GL_FLOAT , 0 , <array> );

glutMainLoop(); //ciclo ke viene eseguito fino a quando nn si verifica un segnale di kill
//se nn c'è una procedura come parametro resta in attesa degli eventi


return 0;
}


Grazie(come sempre... :D ) e ciao

k0nt3
08-05-2006, 23:04
se ti interessa a livello didattico questo (http://nehe.gamedev.net/) è un ottimo sito per imparare

ps. perchè usi C e non C++? di solito gli oggetti si sposano bene con la programmazione 3D ;)

71104
08-05-2006, 23:50
ps. perchè usi C e non C++? di solito gli oggetti si sposano bene con la programmazione 3D ;) C e C++ non sono mica mutuamente esclusivi: quando gli servirà di usare una classe la userà...

k0nt3
09-05-2006, 00:02
C e C++ non sono mica mutuamente esclusivi: quando gli servirà di usare una classe la userà...
ma non puoi usare gli oggetti in C (a meno che mjordan posta questo benedetto tutorial :asd: )! quindi tanto vale iniziare il codice in C++ style che è un pò diverso da C style. comunque tanto sta a lui decidere, magari si vuole ammazzare di programmazione strutturata :D .
il fatto più che altro è che in giro trovi molto più materiale in C++ riguardo a queste cose.

71104
09-05-2006, 00:24
quindi tanto vale iniziare il codice in C++ style che è un pò diverso da C style. capirai, cambia solo un #include -.-

shinya
09-05-2006, 09:12
ma non puoi usare gli oggetti in C!

Questo non è vero!
E' come dire che non puoi usare le liste perchè il linguaggio non le prevede di suo.

scorpion89
09-05-2006, 09:46
Si ma io a scuola(superiori) programmo solo C e se gli porto un programma con le classi, cosa ke mi verrà spiegata il prossimo anno, nn so se sono molto contenti!!!!
Visto ke stò facendo un programma ke fa vedere un dado rotante a video mi basta il C x ora!!!
Un altra domanda, come faccio ad applicare le texture al mio dado???

Ciao e grazie

PS ops già visto x le texture, tutto sul sito!! Per altri dubbi vi chiederò!!

k0nt3
09-05-2006, 10:13
Questo non è vero!
E' come dire che non puoi usare le liste perchè il linguaggio non le prevede di suo.
dai lo so.. li ho fatti anche io un paio di oggetti con il C (aspetto ancora il tutorial eh!) ma se dovessi usare OpenGL opterei per C++ visto che in C bisogna fare un pò di fatica inutile.
capirai, cambia solo un #include -.-
è diverso lo stile IMHO.. è vero che puoi fare lo stesso programma che facevi in C che tanto compila lo stesso, ma non è molto consigliato. comunque chiudiamola qui che tanto gli serve usare C e per fare il dado che ruota va più che bene ;)

fek
09-05-2006, 10:37
ma non puoi usare gli oggetti in C (a meno che mjordan posta questo benedetto tutorial :asd: )! quindi tanto vale iniziare il codice in C++ style che è un pò diverso da C style. comunque tanto sta a lui decidere, magari si vuole ammazzare di programmazione strutturata :D .
il fatto più che altro è che in giro trovi molto più materiale in C++ riguardo a queste cose.

Certo che puoi consumare delle classi scritte in C++ da C, basta conoscere la mangling convention del compilatore. e passare l'oggetto come primo parametro della chiamata al metodo. DirectX e' una collezione di oggetti e in questo modo puo' essere consumata sia da C sia da C++.

k0nt3
09-05-2006, 10:49
Certo che puoi consumare delle classi scritte in C++ da C, basta conoscere la mangling convention del compilatore. e passare l'oggetto come primo parametro della chiamata al metodo. DirectX e' una collezione di oggetti e in questo modo puo' essere consumata sia da C sia da C++.
tutto è possibile in C :asd: ma secondo te conviene? il supporto agli oggetti nel linguaggio torna molto comodo qui (e penso che lo sai meglio di me :D ). comunque dipende anche dallo scopo, e sono daccordo che per il dado basta il C.

71104
09-05-2006, 20:40
tutto è possibile in C :asd: ma secondo te conviene? il supporto agli oggetti nel linguaggio torna molto comodo qui (e penso che lo sai meglio di me :D ). non si parlava della convenienza infatti :p

71104
09-05-2006, 20:42
Certo che puoi consumare delle classi scritte in C++ da C, basta conoscere la mangling convention del compilatore. e passare l'oggetto come primo parametro della chiamata al metodo. DirectX e' una collezione di oggetti e in questo modo puo' essere consumata sia da C sia da C++. giusto! e aggiungo anche che esiste un paradigma di programmazione detto ADT che permette di programmare in C (o in altri linguaggi procedurali analogamente potenti) secondo un'ottica vagamente OO.

71104
09-05-2006, 20:44
Questo non è vero!
E' come dire che non puoi usare le liste perchè il linguaggio non le prevede di suo. già, ADT oppure demangling manuale :)
entrambe molto scomode ovviamente, ma come possibilità esistono sempre.

k0nt3
09-05-2006, 21:23
non si parlava della convenienza infatti :p
e di cosa? tutto è nato quando ho scritto: "perchè usi C e non C++? di solito gli oggetti si sposano bene con la programmazione 3D"
mi sembra implicito che è un consiglio dettato dalla convenienza, mica ho detto che non si può fare programmi 3D in C
giusto! e aggiungo anche che esiste un paradigma di programmazione detto ADT che permette di programmare in C (o in altri linguaggi procedurali analogamente potenti) secondo un'ottica vagamente OO.
l'ho scritto anche io prima che si può fare
già, ADT oppure demangling manuale
entrambe molto scomode ovviamente, ma come possibilità esistono sempre.
prendere degli oggetti e leggerli in codice strutturato non è programmazione a oggetti

comunque state perdendo il senso di quello che ho detto... se uno si mette a programmare roba grafica (soprattutto 3D) in C a voi non verrebbe voglia di consigliare un qualche linguaggio a oggetti? se poi DEVE usare C e fare un dado che ruota è un altro discorso, ma non lo sapevo prima.