Libyssa
Libyssa

Reputation: 51

How Can I use glClipPlane more than 6 times in OPENGL?

I have a Sphere . I would like to clip some planes like below picture. I need more than 10 clipping plane but maximum glClipPlane limit is 6. How can I solve this problem.

enter image description here

My Sample Code below;

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);

Upvotes: 1

Views: 3213

Answers (2)

Speed0oo0
Speed0oo0

Reputation: 1

enter image description here

You can just reuse "Gl.glEnable(Gl.GL_CLIP_PLANE1);" because you was disabled it later ...

Upvotes: 0

Andon M. Coleman
Andon M. Coleman

Reputation: 43319

You should consider multi-pass rendering and the stencil buffer.

Say you need 10 user clip-planes and you are limited to 6, you can setup the first 6, render the scene into the stencil buffer and then do a second pass with the remaining 4 clip planes. You would then use the stencil buffer to reject parts of the screen that were clipped on the prior pass. So this way you get the effect of 10 user clip planes when the implementation only supports 6.

// 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

It is not perfect, it is quite fill-rate intensive and limits you to a total of 1536 clip planes (given an 8-bit stencil buffer), but it will get the job done without resorting to features present only in GLSL 130+ (namely gl_ClipDistance []).

Upvotes: 2

Related Questions