Java-Gaming.org    
Featured games (78)
games approved by the League of Dukes
Games in Showcase (426)
Games in Android Showcase (89)
games submitted by our members
Games in WIP (466)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  OpenGL state management - minimises GL calls, type-safe and batchable  (Read 1615 times)
0 Members and 1 Guest are viewing this topic.
Offline ryanm

Senior Member


Projects: 1


Used to be bleb


« Posted 2009-05-06 15:41:16 »

Keeping track of OpenGL state can be a pain in the bum, especially with pluggable rendering. The obvious approaches - of blindly setting all desired state or always returning to some known baseline - make unnecessary GL calls and can be error-prone.

So, here's some code to handle it all for you. JavaDoc is here, and you can browse the svn over there.

Setting up OpenGL with blending, depth testing and a texture enabled looks like
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
State s = new State();

s.blend.enabled = true;
s.blend.srcFactor = SourceFactor.SRC_ALPHA;
s.blend.destFactor = DestinationFactor.ONE_MINUS_SRC_ALPHA;

s.depthTest.enabled = true;
s.depthTest.func = ComparisonFunction.LEQUAL;

s.texture.id = myTexID;
s.texture.filter.min = MinFilter.LINEAR_MIPMAP_LINEAR;
s.texture.filter.mag = MagFilter.LINEAR;
s.texture.wrap.s = TextureWrap.CLAMP;
s.texture.wrap.t = TextureWrap.CLAMP;

s.apply();


Nice features:
  • Applying a state will result in the minimum number of calls to OpenGL needed to transition from the current state to the new one
  • Type-safe: no more GL_INVALID_ENUM, only valid values are presented for code-completion
  • Sortable: States are Comparable, and sorting a list of them on that basis will cluster similar states together, with priority  given to the most expensive state changes (shader and texture changes). Use this to batch up your rendering to minimise state changes and maximise the amount of data you can squirt to OpenGL in one go
  • Comparison can be made fast: You'll probably end up only using a fixed number of State objects that won't change often, so it seems a bit wasteful to have to compare the whole tree of state settings every time. Worry not, comparisons between states that have been passed into the same call to compile only involve one integer subtraction, or you can use getCompiledIndex() to directly address an array. Subsequent changes to compiled States will raise assertion errors, as you've probably messed up the ordering

The only thing to look out for is fairly obvious - The system won't know about changes made to OpenGL state outside of state.apply(), so if you call glDisable( GL11.GL_DEPTH_TEST ) manually, depth testing will stay disabled despite applying a state with it enabled. Of course, this can also be useful, e.g.: switching to wireframe mode without changing all your State objects.
Also remember to call State.resetState() when OpenGL is initialised e.g.: on display re-creation.

The set of opengl state currently managed is:

You can specify that you want to control only a subset of these facets at State construction and reduce the work needed to compare and transition between states.

Does anyone have any suggestions for more that should be handled?

This is currently written for LWJGL, but it wouldn't take much to covert to JOGL (just add the passing around of the gl instance, change GL** to GL, etc)
Also note that the clever shadery bits were nicked from the SPGL and the distance-field rendering from Slick.

edit: added jar download, javadoc links
Pages: [1]
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

 

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

xsi3rr4x (73 views)
2014-04-15 18:08:23

BurntPizza (68 views)
2014-04-15 03:46:01

UprightPath (80 views)
2014-04-14 17:39:50

UprightPath (65 views)
2014-04-14 17:35:47

Porlus (81 views)
2014-04-14 15:48:38

tom_mai78101 (105 views)
2014-04-10 04:04:31

BurntPizza (164 views)
2014-04-08 23:06:04

tom_mai78101 (260 views)
2014-04-05 13:34:39

trollwarrior1 (210 views)
2014-04-04 12:06:45

CJLetsGame (220 views)
2014-04-01 02:16:10
List of Learning Resources
by SHC
2014-04-18 03:17:39

List of Learning Resources
by Longarmx
2014-04-08 03:14:44

Good Examples
by matheus23
2014-04-05 13:51:37

Good Examples
by Grunnt
2014-04-03 15:48:46

Good Examples
by Grunnt
2014-04-03 15:48:37

Good Examples
by matheus23
2014-04-01 18:40:51

Good Examples
by matheus23
2014-04-01 18:40:34

Anonymous/Local/Inner class gotchas
by Roquen
2014-03-11 15:22:30
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!