Programm läuft fehlerhaft unter linux
-
Halllo das folgende Programm verhält sich unter Xubuntu 14.04 scheinbar anders als unter Windows. Beobachtung unter Xubuntu wird die grüne Seite nicht angezeigt und die gegenüberliegende blaue Seite "springt" ständig auf die eigentlich verdeckte hintere Seite.
main.cpp:#include "cube.hpp" #include <windows.h> #include <GL/glut.h> Cube *cube = new Cube(75.0f); void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); cube->draw(); glPopMatrix(); glutSwapBuffers(); } void timer(int = 0) { cube->tick(); display(); glutTimerFunc(10, timer, 0); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(400, 400); glutInitWindowPosition(600, 300); glutCreateWindow("Cube"); glClearColor(0, 0, 0, 1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glEnable(GL_DEPTH_TEST); gluPerspective(45, 1, 37, 500); glMatrixMode(GL_MODELVIEW); glutDisplayFunc(display); timer(); glutMainLoop(); }
cube.hpp
#pragma once class Cube { public: Cube(float a); void draw() const; void tick(); private: float a; int angle; };
cube.cpp
#include "cube.hpp" #include <windows.h> #include <GL/glut.h> Cube::Cube(float a) { this->a = a; angle = 0; } void Cube::draw() const { glTranslatef(0, 0, -150); glRotatef(angle, 0, 1, 0); glBegin(GL_QUADS); // left face glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-a/2, a/2, a/2); glVertex3f(-a/2,-a/2, a/2); glVertex3f(-a/2,-a/2,-a/2); glVertex3f(-a/2, a/2,-a/2); // right face glColor3f(0.0f, 0.0f, 1.0f); glVertex3f (a/2, a/2, a/2); glVertex3f( a/2,-a/2, a/2); glVertex3f( a/2,-a/2,-a/2); glVertex3f( a/2, a/2,-a/2); // bottom face glColor3f(1.0f, 1.0f, 0.0f); glVertex3f( a/2,-a/2, a/2); glVertex3f(-a/2,-a/2, a/2); glVertex3f(-a/2,-a/2,-a/2); glVertex3f( a/2,-a/2,-a/2); // top face glColor3f(1.0f,1.0f, 1.0f); glVertex3f( a/2, a/2, a/2); glVertex3f(-a/2, a/2, a/2); glVertex3f(-a/2, a/2,-a/2); glVertex3f( a/2, a/2,-a/2); // back face glColor3f(1.0f, 0.5f, 0.0f); glVertex3f( a/2, a/2,-a/2); glVertex3f(-a/2, a/2,-a/2); glVertex3f(-a/2,-a/2,-a/2); glVertex3f( a/2,-a/2,-a/2); // front face glColor3f(1.0f, 0.0f, 0.0f); glVertex3f( a/2, a/2, a/2); glVertex3f(-a/2, a/2, a/2); glVertex3f(-a/2,-a/2, a/2); glVertex3f( a/2,-a/2, a/2); glEnd(); } void Cube::tick() { angle++; }
woran könnte das liegen?
-
cppbug schrieb:
woran könnte das liegen?
Ich hab' ja selbst keine Ahnung (mehr) von opengl, aber ein wenig rumspielen zeigte, dass da was mit der Tiefe nicht stimmt.
Dann war die Lösung einfach:glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
Dementsprechend sollte der Titel evtl. sein "Würfel rendern mit opengl", Linux kann jetzt nix dafür...
-
könntest du bitte die Sourcen so anpassen, dass sie sich wenigstens problemlos auf Linux compilieren lassen?
Bereits in den ersten Zeilen kommt der erste Fehler.
cube.cpp:2:21: schwerwiegender Fehler: windows.h: Datei oder Verzeichnis nicht gefundenAlso stell eine Version online, die problemlos mit g++ compiliert, und stell ein paar Screenshots rein, sodass wir den Unterschied zwischen Win und Linux sehen können.
-
dfsdfsfd schrieb:
könntest du bitte die Sourcen so anpassen, dass sie sich wenigstens problemlos auf Linux compilieren lassen?
Bereits in den ersten Zeilen kommt der erste Fehler.
cube.cpp:2:21: schwerwiegender Fehler: windows.h: Datei oder Verzeichnis nicht gefundenAlso stell eine Version online, die problemlos mit g++ compiliert, und stell ein paar Screenshots rein, sodass wir den Unterschied zwischen Win und Linux sehen können.
Nimm die paar windows.h includes raus und es sollte kompilieren.
-
dfsdfsfd schrieb:
könntest du bitte die Sourcen so anpassen, dass sie sich wenigstens problemlos auf Linux compilieren lassen?
Bereits in den ersten Zeilen kommt der erste Fehler.
cube.cpp:2:21: schwerwiegender Fehler: windows.h: Datei oder Verzeichnis nicht gefundenAlso stell eine Version online, die problemlos mit g++ compiliert, und stell ein paar Screenshots rein, sodass wir den Unterschied zwischen Win und Linux sehen können.
Unter Linux sollte man natürlich die windows.h in main.cpp und cube.cpp einbinden (am besten einfach auskommentieren dann kompiliert's auch unter Linux)
hab's schnell mal eben bei pastebin hochgeladen
http://pastebin.com/sZmnLnQw
http://pastebin.com/26WeLfGs
http://pastebin.com/fD1e9eMpnur das makefile hab ich vergessen...
CPPFLAGS=-Wall -g OBJECTS=main.o cube.o TARGET=cube %.o: %.cpp g++ -c $(CPPPFLAGS) -o $@ $< $(TARGET): $(OBJECTS) g++ $(OBJECTS) -o $(TARGET) -lGL -lGLU -g -lglut main.o: main.cpp cube.hpp cube.o: cube.cpp cube.hpp
einfach alles in einen Ordner schieben; make und dann ./cube
-
Ahh.
Und weil culling in die Hose ging, habe ich nochmal hingeschaut: left- und back-face sind zudem falsch gewickelt.
-
Furble Wurble schrieb:
cppbug schrieb:
woran könnte das liegen?
Ich hab' ja selbst keine Ahnung (mehr) von opengl, aber ein wenig rumspielen zeigte, dass da was mit der Tiefe nicht stimmt.
Dann war die Lösung einfach:glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
Dementsprechend sollte der Titel evtl. sein "Würfel rendern mit opengl", Linux kann jetzt nix dafür...
Du hast recht!
hab grad in main.cpp (Zeile 25) aus
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
gemacht. Und nun läuft's auch unter Xubuntu 14.04. Den depth buffer test wollte ich eigentlich mit
glEnable(GL_DEPTH_TEST);
machen, hat aber auf einmal net gefunzt.
Schon eigenartig unter Xubuntu 13.10 und Windows 7 lief's auch immer so wie ich's vorher gemacht hatte.
Vielen Dank
-
Furble Wurble schrieb:
left- und back-face sind zudem falsch gewickelt.
...und top face auch.
cppbug schrieb:
Vielen Dank
Immer gerne.
-
[quote="Furble Wurble"]
Furble Wurble schrieb:
left- und back-face sind zudem falsch gewickelt.
...und top face auch.
Was meinst Du mit schief gewickelt?
-
cppbug schrieb:
Furble Wurble schrieb:
Furble Wurble schrieb:
left- und back-face sind zudem falsch gewickelt.
...und top face auch.
Was meinst Du mit schief gewickelt?
Bei den drei Flächen sind die Vertices nicht im oder gegen den Uhrzeigersinn definiert - d.h. was Vorder und Rückseite ist ist nicht so recht geklärt.
Du siehst das, wenn Du culling aktivierst:glEnable(GL_CULL_FACE);
-
Furble Wurble schrieb:
cppbug schrieb:
Furble Wurble schrieb:
Furble Wurble schrieb:
left- und back-face sind zudem falsch gewickelt.
...und top face auch.
Was meinst Du mit schief gewickelt?
Bei den drei Flächen sind die Vertices nicht im oder gegen den Uhrzeigersinn definiert - d.h. was Vorder und Rückseite ist ist nicht so recht geklärt.
Du siehst das, wenn Du culling aktivierst:glEnable(GL_CULL_FACE);
ich weiss zwar nicht von welchem Modell Du ausgehst aber wenn ich hiervon ausgehe, hast Du zumindest bei left und top recht
http://www.computing.northampton.ac.uk/~gary/csy3019/CSY3019SectionD.html
-
Warum benutzt du uraltes OpenGL? Die FixedPipeline wurde vor vielen Jahren abgeschafft, heute programmiert man OGL nur noch mit Buffern und Shadern. Achte darauf nie ein Tut zu machen wo noch glBegin und glEnd verwendet wird.
-
deprecatedOpenGL schrieb:
Warum benutzt du uraltes OpenGL? Die FixedPipeline wurde vor vielen Jahren abgeschafft, heute programmiert man OGL nur noch mit Buffern und Shadern. Achte darauf nie ein Tut zu machen wo noch glBegin und glEnd verwendet wird.
Keine Ahnung. Bin selbst grad erst dabei mich da reinzuarbeiten. Hab wohl einfach nur irgendein oldschool-tutorial erwischt
Wenn Du ein gutes kennst, kannst es ja mal schnell posten ^^danke