| Once again, ATI and NVIDIA joined forces to present a full-day tutorial covering the latest and greatest happeneings in OpenGL. Unfortunately I was only able to attend the first half, but the first several sessions covered a number of vital developments that will greatly impact the future of OpenGL. Changing of the Guard
 The ARB is now working to transition the management of OpenGL to the Khronos Group by the end of the year. The Khronos Group manages a number of open, royalty-free standards, including OpenGL ES, which has quickly become the dominant 3D API for mobile devices. Having Khronos manage OpenGL will remove some artificial walls between the evolution of OpenGL and OpenGL ES, and will likely result in OpenGL being updated more quickly and marketed more successfully.
 OpenGL on Windows Vista
 Last SIGGRAPH, alarms were raised when it was learned that OpenGL support on Windows Vista would come with some limitations that were considered unacceptable by many. Developers and hardware vendors were asked to contact Microsoft and ask them to provide a path for IHVs to support OpenGL as a first-class citizen on Vista. As of the February Vista beta, this has now been done. See here for details. OpenGL 2.1
 The next update to OpenGL is on track to be released at SIGGRAPH 2006. The ARB is currently hammering out the details of several candidate features that may be included in 2.1. Anything not currently under consideration will not be included. The features being discussed are as follows:
 
	Pixelbuffer Objects, based on ARB_pixelbuffer_object. These work much like VBOs, using the same basic APIs, but work with image data instead.
	The OpenGL Shading Language will be updated to 1.20. New shaders will have to use #version 120 to take advantage of these changes. You'll be able to link shaders with shared versions, so it won't be necessary to rewrite existing shaders.
	
		New texture functions based on ATI_shader_texture_lod will allow you to sample from a specific level, or sample passing an explicit derivative.
		Built-in fragment special variables based on OpenGL ES 2.0 point sprites will be added for use when point sprites are enabled.
		A new centroid qualifier will allow you to control where a texel is sampled when it's not fully covered by the fragment.
		The update will also include some minor changes, some of which will be backward incompatable:
		
			Names will be more C++ like. A name will hide names of all types (functions, variables, structures). You'll also be able to declare names within a scope, with the exceptions that local function declarations are not allowed, and you cannot redeclare within a scope. The built-in functions are considered to be in a sort of "outermost" scope. If you redeclare them, you'll hide all functions using that name (e.g. redeclaring texture2D will hide all texture2D functions, regardless of the signature).
			Function signature matching will change such that the compiler will first try to find an exact match, then it'll try limited implicit contructors (i.e. int gets promoted to float, ivec3 to vec3, etc.). Multiple implicit matches will result in an error.
			Arrays are now first class citizens. You'll be able to use equality, inequality, and assignment operators as long as they are explicitly sized, as well as use array constructors.
			Non-square matrices will be permitted, and new outerProduct() and transpose() functions and constructors will be added to support them.
		Float buffers as per the current ARB extension. The only likely change is that if you try to create a floating point buffer and they aren't supported, the call will fail rather than falling back to an integer format.
	Support for sRGB textures. This would allow these textures to be used with correct filtering.
	ARB_synch_object derived from GL_NV_fence - but allowing sharing and using separated objects - and GL2_async_core - but a subset, with an eye to a later superset.
	They are working on an ARB_framebuffer_object, which will merge (with some changes) EXT_framebuffer_object, EXT_framebuffer_multisample, and EXT_framebuffer_blit. EXT_packed_depth_stencil will remain a separate extension. Mixed size and format attachments will be allowed, and R and RG formats will be added (L, and LA may be added as well). ARB_fbo_simple, EXT_framebuffer_format, and EXT_immutable_objects are some extensions that have been proposed to address format compatability, but nothing has been decided yet.
 Other news
 The ARB recognizes that they need to do more than just write a spec. To make OpenGL successful, they are going to be putting more effort into: 
	Documentation
	Examples
	Courses
	Tools and utilities
	Conformance tests
	Marketing
	Cross standard collaboration
 OpenGL: What's Next
 ATI and NVIDIA have been working together for more than six months on a proposal to change the direction of OpenGL. Much of that time has been spent talking to developers to find out what they want from OpenGL, and this was the first time they presented what they want to propose publicly.
 Disclaimer: All of this information is pre-workgroup; none of it has been officially proposed to the ARB yet.
 OpenGL has matured over 13+ years. It's not always representative of hardware anymore, but it is fully backwards compatible (unlike other graphics APIs), which has obvious pros and cons. Significant new hardware functionality is on the way, and programmability is just the start. OpenGL needs to be market and timeline driven to provide only what is needed in a timely manner.
 There has been talk for a few years of creating a version of OpenGL that doesn't maintain backward compatability, and it has been suggested that this might happen with OpenGL 3.0. But developers and IHVs have indicated that there is too much out there depending on existing functionality to make a fully clean break.
 The proposal being worked on would divide OpenGL two profiles. The first, dubbed OpenGL Lean and Mean (or OpenGL LM) is the core API that is the right hardware abstraction, providing optimal performance. There would also be a full OpenGL profile that supports all existing functionality, as well as the LM profile. Once this division is made, most future efforts would be put into the LM profile.
 Even in OpenGL 2.0, there are some features that are actually implemented in software layers on top of key core hardware functionality. With LM, this software layering would be removed. This would result in better drivers (since they would be considerably simplified), clear fast paths, and new features wouldn't have to make compromises to work with aging interfaces. With the full profile, anything that isn't in LM would be implemented as software layers. The following sections discuss the various stages of the pipeline and which features at each stage would be implemented in hardware and which would be implemented in software layers.
 Drawing Geometry
 What features to consider layering:
 
	Immediate mode
	Current vertex state
	Non-VBO vertex arrays
	Vertex array enables (with shaders, this should be automatic)
	glArrayElement()
	glInterleavedArrays()
	glRect()
	Display lists
 Removing these would reduce the number of ways to get data to OpenGL, which would simplify drivers and hardware. VBOs would be the preferred method for transferring data.
 They'd like to add:
 
  Geometry instancing
  Geometry-only display lists (for small static data, for instance) (no GL_COMPILE_AND_EXECUTE, since it's very problematic to implement efficiently)
  Arrays activated based on vertex shader usage
 State Objects
 They'd like to add new objects that encapsulate OpenGL state, so that you can switch between sets of GL state in one call. This could be a replacement for push/pop attributes. This would work very efficiently with VBOs in a way similar to display lists.
 Vertex Processing
 What features to consider layering:
 
	All fixed-function vertex processing (since IHVs no longer make fixed-function hardware anyway)
	
		Lighting, materials, and flat shading
		Texture coordinate generation
		Vertex and normal transformation
		Point size distance attenuation
	Built-in values in GLSL
 GLSL enhancements
 
	Integer Support
	
		Full 32 bit integers
		full bit-wise integer ops
		integer texure lookups
		integer vertex attributes
 
Offline compile (already in OpenGL ES)
	
		Enables layering, faster startup, (limited) IP protection
		Binary shader interface
		Intermediate language interface
 
Vertex position invariance across shaders (replaces ftransform())
	Enhanced interpolant control
	
		Flat/smooth
		center/centroid
		perspective correct, or not
 
Vertex ID (what vertex item am I?)
 
Binding texture object IDs to samplers (skip texture image unit)
 Rasterizing primitives
 What features to consider layering: ARB imaging subset, since it isn't really being used. Most of this functionality can be done in fragment shaders anyway.
 They'd like to add having coverage values accessible in the fragment shader
 Fragment Processing
 What features to consider layering:
 
	texture environments and functions
	color sum
	fog
 What they'd like to add
 
	seamless cub map neighborhoods
	texture arrays (aka stacks)
	texture filter shaders
 Changing the Object Model
 In the current object model, teh application supplies an unsigned int "name", or requests one generated by OpenGL. When this object is used, the implementation does a lookup in a hash table to find the actual object. The object is then bound to edit or use it. Objects can be shared among contexts.
 The problems with this model include:
 
	The cost for doing lookup can be 3-5% of driver overhead
	The binding process can cause application bugs because of the indirect reference
	It's actually too flexible, in that it's difficult for the driver to optimize because it can't predict what you're doing.
	There are some grey areas in behavior, such as reusing an existing name
 They'd like to introduce a new object model that would improve performance, be easier to use (intuitive, fewer function calls), and easier to implement for IHVs (removing guesswork and race conditions) which will benefit developers with more optimized drivers.
	
 Proposal: 
	Object ID is a pointer instead of an uint (typedef void* GLobject)
	Object IDs are always generated by implementation
	Object manipulators take an explicit parameter (no more binding)
	Objects are immutable
 Tradeoffs: 
	Performance benefit for well-behaved apps (no more lookups)
	More expensive to create an object since the implementation has to allocate the pointer - but usage will be faster and has a bigger overall performance impact
	No more orphaining
	Easier to manipulate, but also easier to crash
 Debugging support: 
	Implementation may support a "debug mode" where object IDs are cached
	Implementation gives feedback on misued of objects (invalid object ID, incorrect type)
 Immutable objects
 
	Object structure fixed at creation time (the data itself can be changed)
	Removes guesswork since structure is static
	Removes dangerous race conditions when an object is shared between contexts
	Simpler to optimize driver due to less overhead
	Encourages better application code with less state thrashing
 New sharing model:
 
	Large objects (texture images, buffer objects, probrams) are always shared among contexts
	Small objects (state objects, possibly FBOs) are context-locked
 Example: Texture image objects
 
	Encapsulate texture size, shape, and format
	No editable parameters
	glTexParameter() moves to GLSL shader
	No incomplete textures
	No glBindTexture() required, since the structure cannot be edited. New APIs will be needed for specifying the content.
 Backward compatiblity
 
	New object may be "bound" to a legacy object
	New object behaves identically to old except for mutability
 Sampler / parameter objects
 
	Context-locked object holds parameter state. These objects will be mutable since they are unshared.
	Bind image object diretly to sampler
	Bind sampler object to shader, or bind separate objects to shader
 Benefits to other object types
 
	Buffer object size and usage
	
		Resizes are messy
		Redefining usage may force promotion
		Enforces application behavior
	Framebuffer object attachments/formats
	
		Avoids completeness check
		Moves all guesswork to creation time
	Program objects
	
 Texture Shaders
 What features to consider layering:
 
	Texture filter state
	Texture wrap modes
	TExture comparision modes
	sRGB
 Instead, have texture shaders in OpenGL LM
 Sample Shader
 What features to consider layering:
 
	Depth test
	Stencil test
	Blend
 Instead, have sample shaders in OpenGL LM
 Primitive Shader
 Also called geometry shader, this is a new pipeline stage between vertex shader and rasterization.
 Usability enhancements
 
	Better error handling
	
		Callback mechanism
		More error codes
		More general glInfoLog() for all GL state - human readable
	Emphasis on tools
 Misc
 Consider layering
 
	Color index rendering
	accumulation buffer
	Evaluators
	Selection
	Feedback
	Multiple paths for specifying pixels/texesl
 What will stay
 Q&A
 They want to make these changes as soon as possible, initially via extensions (so as hardware supports each, it can be immediately released), and then formally deprecate legacy functionality with 3.0.
 |