How to glscissor multiple overlapping regions


I realise the answer might be / probably isn’t to use glscissor but I didn’t know how to describe the problem differently.

I’d like to be able to do the following in a UI I am building

  • Have a scroll pane
  • Have the scroll pane contain a 2d ui element such as a tree, data is stored / rendered in a scene based structure (parent objects with children)
  • The tree effectively has a set of labels drawn with icons to control the opening and closing of nested elements
  • When opening the tree up it is larger than the scroll pane so shouldn’t be drawn outside of the scroll pane
  • Each label is a fixed size and the text (basically a texture), shouldn’t be drawn outside of its bounds too

If I use glScissor on the scroll pane every thing works ok, if I nest the glscissor’s so that the scroll pane and the labels both use glscissor I get in to issues. If I scissor the labels and then restore the scissor for the scroll pane for other drawing, I lose the scroll panes scissor during the label draw so labels can get drawn outside the scroll pane (either overlapping or completely outside).

So my question is are there better ways to do this clipping or more clever ways to use glScissor? I have read that some people use the stencil buffer, but I am unsure of the design principals of stencils (having never used them( to know whether it would solve this problem or not).

When you add a new clip rectangle, you need to set the scissor rectangle to the intersection of the new clip rectangle and the existing scissor rectangle, not just to the new clip rectangle. Keep track of the scissor rectangle in the application; querying it using glGet may be slow.

Stencilling doesn’t have any benefit here.

Thanks, i already keep a track of the scissor rectangles in the application. I just need to add the intersection code. Thanks for the pointers to fixing my issue

See also EXT_window_rectangles.