在OpenGL / JOGL中,使用多个剪裁平面时,似乎应用所有剪裁平面的并集。我想要的是应用所有剪切平面的交集。这可能吗?请参见下面简化的2D示例。
编辑:顶点着色器剪裁的示例(请参见下面的注释)。
#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;
}
glClipPlane
,不会被剪辑的顶点是在至少一个平面的正半空间内。一旦发生这种情况,其他任何平面都无关紧要。gl_ClipDistance
来获得此效果(或几乎任何其他效果)。gl_ClipVertex
来达到同样的目的?因为在我的OpenGL 2.1项目中无法使用 gl_ClipDistance
。 - martinez314gl_ClipDistance
跳到gl_ClipVertex
。我能找到的每个gl_ClipVertex
示例都只是gl_ModelViewMatrix * gl_Vertex
。如果能看到使用gl_ClipVertex
修改剪裁平面的示例,就像您描述如何使用gl_ClipDistance
一样,那将非常有帮助。我尝试在我的顶点着色器中将gl_ClipVertex
设置为各种修改后的顶点,但从未看到任何相对于被剪裁的内容发生变化。如果您能发布一个示例,那将非常有帮助。 - martinez314gl_ClipVertex
这个名称是一个误称,因为它虽然看起来像一个顶点,有4个分量,但实际上它是一个平面方程,而不是一个顶点。也就是说,它是一个法向量加上到原点的距离。gl_ClipDistance
是平面和顶点的点积,或者说是“顶点距离被裁剪的距离”,这个概念更容易理解。将gl_ClipVertex
设置为实际的顶点可能不会给出很多有意义的输出,因为通常情况下_w = 1.0_--所以除非一个顶点非常靠近原点,否则你会一直进行裁剪。 - Damongl_ClipVertex
的效果有关 - 很明显我还需要学习一些GLSL知识。) - martinez314
discard;
。 - fintelia