Gå til innhold

OpenGL, hvorfor funker ikke denne kodesnutten?


Anbefalte innlegg

Hvorfor fungerer ikke denne koden, når programmet kjøres kommer det kun opp ett hvitt tomt vindu.

 

#include <glut/glut.h>
float P0[3] = {0.0,2.0,0.0};
float P1[3] = {1.5,1.5,0.0};
float P2[3] = {2.0,0.0,0.0};
float P3[3] = {1.5,-1.5,0.0};
float P4[3] = {0.0,2.0,0.0};
float P5[3] = {-1.5,-1.5,0.0};
float P6[3] = {-2.0,0.0,0.0};
float P7[3] = {-1.5,1.5,0.0};
void points()
{
glClear(GL_COLOR_BUFFER_BIT);

glPointSize(5.0);
glBegin(GL_POINT);
 glVertex3fv(P0);
 glVertex3fv(P1);
 glVertex3fv(P2);
 glVertex3fv(P3);
 glVertex3fv(P4);
 glVertex3fv(P5);
 glVertex3fv(P6);
 glVertex3fv(P7);   
glEnd();

glFlush();
}
void lines(){
glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_LINES);
 glVertex3fv(P0);
 glVertex3fv(P1);
glEnd();

glFlush();
}
void line_strip(){

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_LINE_STRIP);
 glVertex3fv(P0);
 glVertex3fv(P1);
glEnd();

glFlush();
}
void init(){
glClearColor(1.0,1.0,1.0, 1.0);   //set clear color to black
glColor3f(0.0,0.0,0.0);	 //set fill color to white

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0,1.0,-1.0,1.0);
}
int main(int argc, char *argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(0,0);
glutCreateWindow("Simple");
glutDisplayFunc(points);
glutDisplayFunc(lines);
glutDisplayFunc(line_strip);
init();
glutMainLoop();
}

Lenke til kommentar
Videoannonse
Annonse

Du har to forskjellige matrise-stacker du kan leke med: Projection og modelview.

Du kan skifte mellom disse med glMatrixMode.

For å tegne flere figurer, så gjør du en glBegin ... glEnd med det du vil ha.

 

Du kan rotere, translere og skalere med glRotate, glTranslate og glScale funksjonene.

 

Bruk glPushMatrix/glPopMatrix for å mellomlagre den aktuelle matrisen.

 

Vær klar over at dette ikke er moderne OpenGL. Alle OpenGL kall i den koden du har gitt der er deprekerte, og er ikke meningen å bruke lenger. Det er grunnen til at jeg lurte på hvor du hadde den koden fra.

Lenke til kommentar
Du har to forskjellige matrise-stacker du kan leke med: Projection og modelview. Du kan skifte mellom disse med glMatrixMode. For å tegne flere figurer, så gjør du en glBegin ... glEnd med det du vil ha. Du kan rotere, translere og skalere med glRotate, glTranslate og glScale funksjonene. Bruk glPushMatrix/glPopMatrix for å mellomlagre den aktuelle matrisen. Vær klar over at dette ikke er moderne OpenGL. Alle OpenGL kall i den koden du har gitt der er deprekerte, og er ikke meningen å bruke lenger. Det er grunnen til at jeg lurte på hvor du hadde den koden fra.

 

Spennende at du sier at dem er deprekerte, da dette er slik kode som høyskolen jeg går på vil at vi skal lære. Kan være at dem ønsker at vi kun skal forstå det grunnleggende i 3D programmering? Nå aner ikke jeg hvor nært knytta denne eldre koden er i forhold til nyere kode?

 

Hvor gammel anslagsvis vil du si at denne koden er?

Takk for den tid du har gitt meg på mine spørsmål!

Lenke til kommentar

Spennende at du sier at dem er deprekerte, da dette er slik kode som høyskolen jeg går på vil at vi skal lære. Kan være at dem ønsker at vi kun skal forstå det grunnleggende i 3D programmering? Nå aner ikke jeg hvor nært knytta denne eldre koden er i forhold til nyere kode?

 

Hvor gammel anslagsvis vil du si at denne koden er?

Takk for den tid du har gitt meg på mine spørsmål!

 

OpenGL har forandret seg ganske mye de siste årene, og det er nok en del læresteder som henger litt etter. I tillegg krever moderne bruk av OpenGL litt mer oppsett, og det blir nok da fristende å lære bort eldre kode for å unngå forvirring.

 

I moderne OpenGL må man skrive små shader-programmer (programmer som kjører direkte på skjermkortet) som bytter ut deler av fixed function pipeline. I tillegg vil man typisk opprette buffere i skjermkortminnet, og så overføre dataene man vil tegne over i dette minnet.

 

Akkurat koden du har skrevet ovenfor er derfor ganske forskjellig fra nyere kode. Koden ovenfor er i hvertfall fra før 2009, antageligvis eldre. Nå skal det imidlertid nevenes at selv om måten du har skrevet OpenGL ovenfor ikke er den mest moderne er det ikke unyttig å lære seg den allikevel. Veldig mange 3d-applikasjoner er skrevet på denne måten.

 

Boka du nevner ovenfor kom så vidt jeg kan se ut i 2007, og den vil ikke inneholde bruk av moderne OpenGL. Jeg vil anbefale deg OpenGL superbible 5th edition. Den kom ut i 2010, så den inneholder ikke det aller nyeste, men jeg syns den på en god måte introduserer deg for moderne OpenGL uten at man helt mister oversikten. Nå skal det snart komme ut ny versjon av The Red Book (regnet som standardboka i OpenGL), men er litt usikker på når den faktisk blir publisert, har blitt utsatt flere ganger.

Lenke til kommentar

Følgende skal fungere:

 

#include &--#60;glut/glut.h&--#62;
float P0[3] = {0.0,2.0,0.0};
float P1[3] = {1.5,1.5,0.0};
float P2[3] = {2.0,0.0,0.0};
float P3[3] = {1.5,-1.5,0.0};
float P4[3] = {0.0,-2.0,0.0};
float P5[3] = {-1.5,-1.5,0.0};
float P6[3] = {-2.0,0.0,0.0};
float P7[3] = {-1.5,1.5,0.0};
void enable2D(float width, float height, unsigned char center) {
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0.0f, width, 0.0f, height);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
if (center) glTranslatef(0.5f * width, 0.5f * height, 0.0f);
}
void disable2D() {
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
}
void points() {
glColor3f(1.0f, 1.0f, 1.0f);
glPointSize(5.0);
glBegin(GL_POINTS);
	glVertex3fv(P0);
	glVertex3fv(P1);
	glVertex3fv(P2);
	glVertex3fv(P3);
	glVertex3fv(P4);
	glVertex3fv(P5);
	glVertex3fv(P6);
	glVertex3fv(P7);
glEnd();
}
void lines() {
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_LINES);
	glVertex3fv(P0);
	glVertex3fv(P1);
glEnd();
}
void line_strip() {
glColor3f(1.0f, 0.5f, 0.5f);
glBegin(GL_LINE_STRIP);
	glVertex3fv(P4);
	glVertex3fv(P5);
glEnd();
}
void render() {
glClear(GL_COLOR_BUFFER_BIT);
points();
lines();
line_strip();
glutSwapBuffers();
}
void init() {
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);   //set clear color to black
glColor3f(1.0f, 1.0f, 1.0f);  //set fill color to white
enable2D(10, 10, 1);
}
int main(int argc, char *argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(0,0);
glutCreateWindow("Simple");
glutDisplayFunc(render);
init();
glutMainLoop();
return 0;
}

 

Men som flere nevner er dette gammeldags OpenGL, og ikke slik det bør anvendes i dag. glBegin() er ikke det verste, dette kan faktisk være nyttig for å få forståelse av rendering. Det skal nevnes at det ikke er mulig å bruke moderne OpenGL med GLUT, og at GLUT er noe forferdelig makkverk som gir OpenGL et dårlig rykte.

 

Se på koden jeg la ved, jeg gjorde et par endringer.

* enable2D() har tre parametre, de to første er dimensjonen, den siste er bool om du vil sentrere renderingen.

* en egen render()-funksjon som styrer all rendering.

* slo på double buffering, slik at du tegner til et bak-buffer og bytter med skjermen når du er ferdig.

 

Jeg synes det er kjempeflott at du skal lære deg OpenGL (selv om det er elementært), det er bare hyggelig å hjelpe, for det er alt for få som kan OpenGL.

Endret av efikkan
  • Liker 1
Lenke til kommentar
(..)

Jeg synes det er kjempeflott at du skal lære deg OpenGL (selv om det er elementært), det er bare hyggelig å hjelpe, for det er alt for få som kan OpenGL.

 

Er litt nysgjerrig på 3D grafikk generelt, men vet enda ikke hvilke praktiske sammenhenger dette kurset noensinne vil gi meg… Men men, kan være greit å friske opp i mattekunnskapene uansett ッ

Lenke til kommentar

Notis: Jeg mente ikke at OpenGL var for elementært, men at dette var elementær grafikk.

 

Jeg håper dere får lære litt om quaternioner, som er nødvendig for å kunne rotére fritt om alle akser, glRotatef() vil ikke kunne gjøre dette, siden de bruker Euler-vinkler som gir noe som heter "gimbal lock". Med litt triksing kan du klare deg med dette for f.eks. et 1.persons skytespill.

Lenke til kommentar

Notis: Jeg mente ikke at OpenGL var for elementært, men at dette var elementær grafikk.

 

Jeg håper dere får lære litt om quaternioner, som er nødvendig for å kunne rotére fritt om alle akser, glRotatef() vil ikke kunne gjøre dette, siden de bruker Euler-vinkler som gir noe som heter "gimbal lock". Med litt triksing kan du klare deg med dette for f.eks. et 1.persons skytespill.

I et førstepersonsskytespill så vil rotasjoner nær sagt alltid skje i to dimensjoner, og gimbal lock kan dermed ikke oppstå, så skal funke fint til akkurat det :)

Kommer an på spillet, men generelt sett.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...