如何在OPENGL中使用glClipPlane超过6次?

时间:2013-12-04 11:09:19

标签: opengl

我有一个球体。我想剪下一些如下图所示的飞机。我需要超过10个剪切平面但最大glClipPlane限制为6.我该如何解决这个问题。

enter image description here

我的示例代码如下;

double[] eqn = { 0.0, 1.0, 0.0, 0.72};
        double[] eqn2 = { -1.0, 0.0, -0.5, 0.80 };
        double[] eqnK = { 0.0, 0.0, 1.0, 0.40 };
        /*  */
        Gl.glClipPlane(Gl.GL_CLIP_PLANE0, eqn);
        Gl.glEnable(Gl.GL_CLIP_PLANE0);
        /*  */
        Gl.glClipPlane(Gl.GL_CLIP_PLANE1, eqn2);
        Gl.glEnable(Gl.GL_CLIP_PLANE1);

        Gl.glClipPlane(Gl.GL_CLIP_PLANE2, eqnK);
        Gl.glEnable(Gl.GL_CLIP_PLANE2);          



        //// draw sphere           
        Gl.glColor3f(0.5f, .5f, 0.5f);
        Glu.gluSphere(quadratic, 0.8f, 50, 50);
        Glu.gluDeleteQuadric(quadratic);
        Gl.glDisable(Gl.GL_CLIP_PLANE0);

        Gl.glDisable(Gl.GL_CLIP_PLANE1);
        Gl.glDisable(Gl.GL_CLIP_PLANE2);

2 个答案:

答案 0 :(得分:2)

您应该考虑多次传递渲染和模板缓冲区。

假设您需要10个用户剪裁平面并且您被限制为6,您可以设置前6个,将场景渲染到模板缓冲区中,然后使用剩余的4个剪裁平面进行第二次传递。然后,您将使用模板缓冲区来拒绝在先前传递中剪切的部分屏幕。因此,当实现仅支持6时,您将获得10个用户剪辑平面的效果。

// In this example you want 10 clip planes but you can only do 6 per-pass,
//   so you need 1 extra pass.
const int num_extra_clip_passes = 1;

glClear       (GL_STENCIL_BUFFER_BIT);

// Disable color and depth writes for the extra clipping passes
glDepthMask   (GL_FALSE);
glColorMask   (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

// Increment the stencil buffer value by 1 for every part of the sphere
//   that is not clipped.
glStencilOp   (GL_KEEP, GL_KEEP, GL_INCR);
glStencilFunc (GL_ALWAYS, 1, 0xFFFF);

// Setup Clip Planes: 0 through 5
// Draw Sphere

// Reject any part of the sphere that did not pass _all_ of the clipping passes
glStencilFunc (GL_EQUAL, num_extra_clip_passes, 0xFFFF);

// Re-enable color and depth writes
glDepthMask   (GL_TRUE);
glColorMask   (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);

// Setup Leftover Clip Planes
// DrawSphere

它并不完美,它是非常精确的填充速度,并且限制你总共1536个剪辑平面(给定一个8位模板缓冲区),但是它可以完成工作而不需要仅仅使用GLSL中的功能130+(即gl_ClipDistance [])。

答案 1 :(得分:0)

enter image description here

您可以重复使用" Gl.glEnable(Gl.GL_CLIP_PLANE1);"因为你以后被禁用了......