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 gefunden

    Also 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 gefunden

    Also 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 gefunden

    Also 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/fD1e9eMp

    nur 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


Anmelden zum Antworten