LWJGL verschiedene Perspektiven mischen

Hallo
Ich möchte eine 3D Welt anzeigen, durch die man sich bewegen kann. Aber es soll auch etwas im Vordergrund angezeigt werden, so wie Items, Lebensbalken und ein Fadenkreuz. Das will ich machen indem ich gluOrtho2D und gluPerspective hintereinander mache, auf meinem Androidprogramm(Opengl ES) funktioniert das auch, aber auf dem PC wird nur die Welt, nicht aber die Vordergrund Elemente nicht. So mache ich es:

            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glViewport(0, 0, w, h);
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            GLU.gluPerspective(45.0f, (float) w / (float) h, 0.1f, 1000);
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
            GLU.gluLookAt(camX, camY, camZ, camFocusX,  camFocusY, camFocusZ, upX, upY, upZ);
            world.render();
            
            glDisable(GL_DEPTH_TEST);
            glMatrixMode(GL_PROJECTION);
            glPushMatrix();
            glLoadIdentity();
            GLU.gluOrtho2D(0, w, h, 0);
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
            kreuz.draw();
            lebensbalken.draw();
            glEnable(GL_DEPTH_TEST);

[OT]es wird dir hier keiner helfen können / wollen. warum habe ich dir schon erklärt.
lern modernes opengl. links dazu habe ich dir schon gegeben.[/OT]

Sooo off-topic ist das gar nicht. Und ich verstehe auch bis zu einem gewissen Grad, dass man skeptisch gegenüber “modernem” OpenGL is. Der Aufwand (selbst für die einfachsten Sachen) ist exorbitant viel größer, als bei “veraltetem” OpenGL. (Matrix class, anyone?).
Ansonsten kann man anhand des Codes nicht viel sagen. Ein glPushMatrix ohne passendes glPopMatrix fällt mir auf. “Binary Search Debugging” könnte schon weiterhelfen: Rendert er den ersten Teil, wenn du den zweiten Teil auskommentierst?

Moin,

im Zweifelsfall wie immer: KSKB

Gruß
Fancy

na gut, dann helft ihm halt. ich bin raus, weil ich das alte opengl dank euch zum glück nicht gelernt hab ^^

Ja, beide Teile funktionieren, wenn man den jeweils anderen Teil auskommentiert.

Und zu dem OpenGL: Ich benutze das veraltete eigentlich nur, weil ich das ganze von Android her mit Opengl Es schon relativ gut kenne und mir das moderne OpenGL relativ suspekt ist, v. a. was die allgemeine Funktionalität gegenüber dem alten OpenGL und das Verhältnis Aufwand/Leistung angeht. Ich beschäftige mich mit dem modernen OpenGL, nur ist es so, dass ich gerne bei meinem alten Zeug bleibe, obwohl ich hoffe beides ein bisschen kombinieren kann.

kombinieren geht schon mal gar nicht. (Also gehen tuts schon, aber machen sollte man das nicht, belehrt mich eines besseren wenn dem nicht der fall ist…)

Ich weiß, das sagt sich leicht… aber im prinzip ist das moderne opengl gar nicht mal soooo schwer, wie man am anfang denkt.
sogar ich habs geschafft, da einzusteigen, und bin dabei es “richtig” zu lernen ^^

Bei diesen Tutorials, die im anderen Thema verlinkt wurden komm ich schon damit nicht weiter, wie ich die Methoden richtig einsetzte.In dem Tutorial ist das ja für c++ und ich weiß nicht wie ich das übertragen soll

versuchs mal hier, der arbeitet mit lwjgl

The World of Shaders - GoHarsha.com

Das hilft bei der Beantwortung der konkreten Frage nur bedingt. Wie @Fancy schon sagte, ein KSKB könnte helfen. Aber je nachdem, wie das ganze gezeichnet wird, könnte der Detph Buffer da irgendwie dazwischenfunken. Im Moment ist es ja quasi so:

            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            drawBackgroundStuff();           

            glDisable(GL_DEPTH_TEST);
            drawForegroundStuff();
            glEnable(GL_DEPTH_TEST);

Damit wird dafür gesorgt, dass der Vordergrund IMMER gezeichnet wird. Aber es wird nicht verhindert, dass der Hintergrund übermalt wird. Es könnte sein, dass man da irgendwas mit Stencil Buffern machen müßte, aber damit hab’ ich selbst nie gearbeitet. Vielleicht gibt es aber auch eine einfachere Lösung, wenn man z.B. weiß, was in “kreuz.draw();” gemacht wird.

int kreuz.draw() wird das Fadenkreuz gezeichnet:


glEnable(GL_BLEND);
	    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
	    glEnable(GL_TEXTURE_2D);
		glBindTexture(GL_TEXTURE_2D, tex.getTextureID());
		glBegin(GL_TRIANGLES);
		glTexCoord2f(1, 0);
		glVertex3f((m.w-20)/2+20, (m.h-20)/2, 0);
		glTexCoord2f(0, 0);
		glVertex3f((m.w-20)/2, (m.h-20)/2, 0);
		glTexCoord2f(0, 1);
		glVertex3f((m.w-20)/2, (m.h-20)/2+20, 0);
		glTexCoord2f(0, 1);
		glVertex3f((m.w-20)/2, (m.h-20)/2+20, 0);
		glTexCoord2f(1, 1);
		glVertex3f((m.w-20)/2+20, (m.h-20)/2+20, 0);
		glTexCoord2f(1, 0);
		glVertex3f((m.w-20)/2+20, (m.h-20)/2, 0);
		glEnd();
		glDisable(GL_BLEND);
		glDisable(GL_TEXTURE_2D);

mach mal das push matrix ding weg. (oder pop matrix irgendwo rein… ich weiß nur nicht wo…)

Es ändert nix, wenn ich das pushMatrix weg mach

versuch mal blend func ganz am anfang an zu machen. und was passiert, wenn du nur den draw code auskommentierst von der welt?

Danke, wenn ich Blend func am Anfang mache funktionierts.Nur ist es so, dass vor einem einem farbigen hintergrund (z. B. wenn man seinen Blick zum Boden richtet) das Quadrat, auf dem die Fadenkreuz-Textur ist schwarz ist. sodass um das Fadenkreuz so ein schwarzer Rand ist.

mach statt GL_ONE, GL_ONE_MINUS_SRC_ALPHA…
hatte ich glaube ich im anderen thread schon einmal vorgeschlagen…

GL_ONE macht aus der transparenz nämlich immer keine transparenz wenn dadrunter nichts ist. (so in der art)
evtl das hier mal durchlesen: https://www.opengl.org/sdk/docs/man/html/glBlendFunc.xhtml

GL_ONE_MINUS_SRC_ALPHA ändert nichts, und auf der Seite sind so viele Möglichkeiten, dass ich nicht weiß, was ich nehmen soll.

Sieht nach “im-Nebel-gestocher” aus. Wenn du ein KSKB gepostet hättest, hätte @Fancy bestimmt schon auf “DIE ZEILE” getippt (oder allgemeinere Verbesserungsvorschläge gemacht, aber … man kann sich ja auch mal zum <sütterlinSchriftart>guten, alten OpenGL 1.x</sütterlinSchriftart> herablassen :D)

Wie ist das mit “dem guten alten OpenGL 1.x” gemeint ?
Der Aufwand für ein KSKB wäre glaub ich zu hoch, ich benutze auch externe Bibliotheken, aber die Methode in der Gezeichnet wird, hier:

private void draw() {
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glViewport(0, 0, w, h);
        glEnable(GL_BLEND);
	    glBlendFunc(GL_SRC_ALPHA, GL_SRC_ALPHA);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        GLU.gluPerspective(45.0f, (float) w / (float) h, 0.1f, 1000);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        GLU.gluLookAt(camX, camY, camZ, camFocusX, camFocusY, camFocusZ, upX, upY, upZ);
        
        glDisable(GL_BLEND);
	glViewport( 0, 0, a.w, a.h);
	glColor4f(0, 0.39f, 0, 0);
        glNormal3f(normals[0], normals[1], normals[2]);
       	glBegin(GL_QUADS);
		for(int i = 0; i < 4; i++){
			glVertex3f(coords**[0], coords**[1], coords**[2]);
		}
		glEnd();
        glDisable(GL_CULL_FACE);
        
        glDisable(GL_DEPTH_TEST);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        GLU.gluOrtho2D(0, w, h, 0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        
        glColor4f(1, 1, 1, 1);
	    glEnable(GL_TEXTURE_2D);
		glBindTexture(GL_TEXTURE_2D, texture.getTextureID());
		glBegin(GL_TRIANGLES);
		glTexCoord2f(1, 0);
		glVertex3f((m.w-20)/2+20, (m.h-20)/2, 0);
		glTexCoord2f(0, 0);
		glVertex3f((m.w-20)/2, (m.h-20)/2, 0);
		glTexCoord2f(0, 1);
		glVertex3f((m.w-20)/2, (m.h-20)/2+20, 0);
		glTexCoord2f(0, 1);
		glVertex3f((m.w-20)/2, (m.h-20)/2+20, 0);
		glTexCoord2f(1, 1);
		glVertex3f((m.w-20)/2+20, (m.h-20)/2+20, 0);
		glTexCoord2f(1, 0);
		glVertex3f((m.w-20)/2+20, (m.h-20)/2, 0);
		glEnd();
		glDisable(GL_TEXTURE_2D);
        
        glEnable(GL_DEPTH_TEST);
        Display.update();
	}

na, opengl 1.x ist eben nicht gut… aber alt…

du fängst grad an zu lernen, und schon externe bibliothek? -en?
für was denn zB?