2010-12-04 6 views
4

Ich arbeite mit OpenGL und ich versuche, eine Kugel zu schaffen, die eine reflektierende Oberfläche hat. Ich habe es reflektiert, aber die Reflexion ist nicht korrekt. Das Objekt in der Reflexion sollte entsprechend der Krümmung der Oberfläche gebogen und deformiert werden, stattdessen bekomme ich nur eine geradlinige Reflexion. Ich habe GL_STENCIL nicht viel benutzt, also würde Hilfe sehr geschätzt werden. Ich habe Teile des Codes zur Verfügung gestellt, wie die Erstellung der Kugel und die Zeichenmethode. Wenn jemand mehr braucht, lass es mich wissen.OpenGL mit GL_STENCIL mit einer Kugel

Creation:

sphere = gluNewQuadric(); 
gluQuadricDrawStyle(sphere, GLU_FILL); 
gluQuadricNormals(sphere, GLU_SMOOTH); 
gluSphere(sphere, 1, 100, 100); 
gluDeleteQuadric(sphere); 

Zeichnung:

glClearColor (0.0,0.0,0.0,1); 
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
glLoadIdentity(); 

glTranslatef(0, 0, -10); 

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); //disable the color mask 
glDepthMask(GL_FALSE); //disable the depth mask 
glEnable(GL_STENCIL_TEST); //enable the stencil testing 
glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFF); 
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); //set the stencil buffer to replace our data 

sphereDraw(); //the mirror surface 

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); //enable the color mask 
glDepthMask(GL_TRUE); //enable the depth mask 

glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF); 
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); //set the stencil buffer to keep our next lot of data 

glPushMatrix(); 
glScalef(1.0f, -1.0f, 1.0f); //flip the reflection vertically 
glTranslatef(0,2,-20); //translate the reflection onto the drawing plane 
glRotatef(angle,0,1,0); //rotate the reflection 
//draw object as our reflection 
glPopMatrix(); 

glDisable(GL_STENCIL_TEST); //disable the stencil testing 

glEnable(GL_BLEND); //enable alpha blending 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //set the blending function 
sphereDraw(); //draw our bench 
glDisable(GL_BLEND); //disable alpha blending 

//draw object 

Da ich neu bin GL_STENCIL zu verwenden war ich nicht sicher, ob es nur etwas klein oder wenn viel mehr muss getan werden, um nachzuweisen dieser Winkel der Reflexion.

+0

BTW- Ihr Leben wird wahrscheinlich einfacher, wenn das erste, was Sie tun, ist die Verwendung von Shadern. Die Schablonenreflexion "biegt" sich nicht von Natur aus. – Kos

Antwort

2

Haben Sie in Betracht gezogen, reflection/environment mapping zu verwenden?

Es gibt 2 Hauptformen. Spherical environment mapping funktioniert normalerweise mit einer vorberechneten Umgebungskarte. Es kann jedoch dynamisch gemacht werden. Der Hauptnachteil ist, dass es abhängig von der Ansicht ist.

Das andere System ist Cubic Environment mapping. Cubic ist sehr einfach einzurichten und beinhaltet einfach 6 Szenen in 6 verschiedenen Richtungen (dh auf jede Seite des Würfels). Cubic Env Mapping ist View-unabhängig.

Es gibt ein anderes System, das zwischen sphärischen und kubischen sitzt. Es heißt dual paraboloid environment mapping. Es hat den Nachteil, dass das Erzeugen der Doppelparaboloide ziemlich komplex ist (wie sphärisch), aber (wie kubisch) ist es blickunabhängig.

+0

hatte ich schon die kubische Mapping gesehen, aber das scheint ein bisschen viel. Der Grund, warum ich die Frage gestellt habe, ist wegen einer Reflexionen und dieser NeHe Tutorial, aber ich hätte lieber Spiegelung als Schatten. Vielen Dank für Ihren Kommentar, wenn ich das genauer betrachte, wird es sich lohnen, sie zu erkunden. – ars265

+0

@Anthony: Cubic Environment Mapping ist wirklich einfach zu tun. Ihr Problem ergibt sich aus der Tatsache, dass Ihr Reflexionssystem nur für eine flache Ebene funktioniert. Entweder Sie verwenden eine der oben genannten Methoden ... oder Sie erhalten keine genauen (ish) Reflexionen. – Goz

+0

@Anthony: Gleichermaßen sind Schatten ziemlich einfach und das Lernen von Cube Mapping ist praktisch für omnidirektionale Lichter. – Goz