OpenGL en utilisant GL_STENCIL avec une sphère
-
08-10-2019 - |
Question
Je travaille avec OpenGL et je suis en train de créer une sphère qui a une surface réfléchissante. Je l'ai réfléchissait, mais la réflexion n'est pas correct. L'objet de la réflexion doit être plié et déformé selon la courbure de la surface, au lieu j'obtenir seulement une réflexion rectiligne. Je ne l'ai pas utilisé GL_STENCIL si bien aide serait très apprécié. J'ai fourni des morceaux de code tels que la création de la sphère et la méthode de tirage au sort. Si quelqu'un a besoin de plus me le faire savoir.
Création:
sphere = gluNewQuadric();
gluQuadricDrawStyle(sphere, GLU_FILL);
gluQuadricNormals(sphere, GLU_SMOOTH);
gluSphere(sphere, 1, 100, 100);
gluDeleteQuadric(sphere);
Dessin:
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
Depuis que je suis nouveau à l'utilisation GL_STENCIL je ne savais pas si elle est juste un petit quelque chose ou s'il reste beaucoup à faire pour détecter l'angle de réflexion.
La solution
Avez-vous pensé à utiliser la réflexion / environnement mapping
Il existe 2 formes principales. Spherical environment mapping fonctionne généralement en ayant un environnement de pré-calculé carte. Il peut, cependant, été fait dynamiquement. Son principal inconvénient est qu'il est vue dépendante. L'autre système est cartographie environnement cubique . Cubique est très facile à mettre en place et implique de rendre simplement votre scène 6 fois dans 6 direction différente (par exemple sur chaque face du cube). Cubique cartographie env est une vue indépendante. Il existe un autre système qui se trouve entre sphérique et cubique. Son appelé double la cartographie de l'environnement paraboloïde. Il a le dos d'étirage qui générer les deux paraboloïdes est assez complexe (comme sphérique), mais (comme cube) est vue indépendant.