OpenGL GL_STENCIL mit einer Kugel
-
08-10-2019 - |
Frage
Ich arbeite mit OpenGL und ich versuche, eine Kugel zu schaffen, die eine reflektierende Oberfläche aufweist. Ich habe es reflektiert aber die Reflexion ist nicht korrekt. Das Objekt in der Reflexion sollte gebogen und verformt entsprechend die Kurve der Oberfläche, sondern nur eine gerade Reflexion ich erhalte. Ich habe nicht viel GL_STENCIL verwendet, so Hilfe sehr geschätzt würde. Ich habe Teile des Codes vorgesehen, wie die Erstellung der Kugel und das Ziehverfahren. Wenn jemand braucht mehr lassen Sie mich wissen.
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 auf GL_STENCIL ich mit war sich nicht sicher, ob es nur etwas klein oder wenn viel mehr getan werden muss, dass der Winkel der Reflexion zu erkennen.
Lösung
Haben Sie darüber nachgedacht, Reflexions- / Umgebungs-Mapping mit?
Es gibt zwei Hauptformen. Spherical Environment Mapping arbeitet in der Regel durch eine vorausberechneten Umgebungskarte mit. Es kann jedoch wurde dynamisch erfolgen. Sein Hauptnachteil ist, dass es Ansicht abhängig ist.
Das andere System ist Cubic Environment Mapping . Cubic ist sehr einfach einzurichten und beinhaltet einfach Ihre Szene 6 mal in 6 verschiedenen Richtung Rendering (dh auf jeder Seite des Würfels). Cubic env-Mapping ist eine Ansicht unabhängig.
Es ist ein anderes System, das zwischen sphärischen und kubischen sitzt. Seine genannt Dual Paraboloid Environment Mapping . Es hat den Nachteil, dass die Dual Paraboloide Erzeugung sehr komplex ist (wie sphärisch), aber (wie kubisch) es Ansicht unabhängig ist.