OpenGL usando GL_STENCIL con una esfera
-
08-10-2019 - |
Pregunta
Estoy trabajando con OpenGL y estoy tratando de crear una esfera que tiene una superficie reflectante. Tengo que refleja que el reflejo no es correcto. El objeto de la reflexión debe ser doblada y deformada de acuerdo a la curva de la superficie, en lugar que estoy recibiendo sólo un reflejo directo. No he utilizado GL_STENCIL el punto de ayuda sería muy apreciada. He proporcionado piezas de código tales como la creación de la esfera y el método de sorteo. Si alguien necesita más que me haga saber.
Creación:
sphere = gluNewQuadric();
gluQuadricDrawStyle(sphere, GLU_FILL);
gluQuadricNormals(sphere, GLU_SMOOTH);
gluSphere(sphere, 1, 100, 100);
gluDeleteQuadric(sphere);
Dibujo:
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
Ya que soy nuevo en el uso GL_STENCIL no estaba seguro de si es sólo algo pequeño o si aún queda mucho por hacer para detectar que ángulo de reflexión.
Solución
Ha considerado el uso mapeo de reflexión / entorno ?
Hay 2 formas principales. esférico mapeo ambiente por lo general trabaja por tener un mapa de entorno de pre-calculada. Puede, sin embargo, se ha hecho de forma dinámica. Su principal inconveniente es que es dependiente de vista.
El otro sistema es Medio Ambiente Cubic mapeo . Cúbico es muy fácil de configurar e implica simplemente la representación de la escena 6 veces en 6 dirección diferente (es decir, en cada cara del cubo). mapeo env cúbico es vista independiente.
Hay otro sistema que se encuentra entre esférica y cúbico. Se llama doble paraboloide mapeo medio ambiente. Tiene la parte posterior sorteo que la generación de la doble paraboloides es bastante compleja (como esférica), pero (como cúbico) es vista independiente.