opengl - sacar - Cómo recortar solo intersección(no unión) de planos de recorte?
corel draw recortar imagen con forma (2)
Multi-pase:
#include <GL/glut.h>
void scene()
{
glColor3ub( 255, 0, 0 );
glBegin( GL_QUADS );
glVertex2i( -1, -1 );
glVertex2i( 1, -1 );
glVertex2i( 1, 1 );
glVertex2i( -1, 1 );
glEnd();
}
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
double w = glutGet( GLUT_WINDOW_WIDTH );
double h = glutGet( GLUT_WINDOW_HEIGHT );
double ar = w / h;
glOrtho( -2 * ar, 2 * ar, -2, 2, -1, 1);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glEnable( GL_CLIP_PLANE0 );
// -y plane
GLdouble plane0[] = { -1, 0, 0, 0 };
glClipPlane( GL_CLIP_PLANE0, plane0 );
scene();
// -x plane
GLdouble plane1[] = { 0, -1, 0, 0 };
glClipPlane( GL_CLIP_PLANE0, plane1 );
scene();
glutSwapBuffers();
}
int main( int argc, char **argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE );
glutInitWindowSize( 640, 480 );
glutCreateWindow( "Clipping" );
glutDisplayFunc( display );
glutMainLoop();
return 0;
}
En OpenGL / JOGL, cuando se utiliza más de un plano de recorte, la unión de todos los planos de recorte parece aplicarse. Lo que quiero es, en cambio, la intersección de todos los planos de recorte que se aplicarán. es posible? Vea el ejemplo 2-D simplificado a continuación.
Editar: un ejemplo de recorte por vertex shader (ver comentarios a continuación).
Usando glClipPlane
, no. Los vértices se recortan si están fuera del semiespacio positivo de al menos un plano. Una vez que eso sucede, no importa lo que pueda ser cualquier otro avión.
Sin embargo, puede obtener este efecto (o casi cualquier otro efecto) al escribir valores apropiados para gl_ClipDistance
en un sombreado de vértices.
Cualquier porción donde el valor interpolado que usted escriba sea menor que 0.0 ("medio espacio negativo") será recortada, y podrá escribir cualquier valor que desee, por ejemplo, la distancia cuadrada a un punto, o la suma de distancias a dos planos, o cualquier otra cosa que calcules