Here is a list of the biggest features and changes in OpenGL throughout the years.
- 2D textures
- 3D textures
- BGRA texture format
- packed formats
- cubemap textures
- multi textures
- texture combiners
- texture compression
- MSAA
- depth textures and texture compare utilities (shadow rendering)
- separate color/alpha blending funcs
- vertex and fragment ASM programs (extension)
- Vertex Buffer Objects
- occlusion queries
- GLSL 1.0 with vertex and pixel shaders (extension)
- GLSL 1.1 with vertex and pixel shader
- Multiple Render Targets
- NPOT textures
- GLSL 1.2
- Pixel Buffer Objects
- sRGB textures
- old features deprecation (forward-compatible context creation)
- fixed function vertex and fragment processing
- direct mode (glBegin/glEnd)
- display lists
- indexed color render targets
- GLSL 1.3
- FrameBuffer Objects
- floating-point textures and depth buffer
- sRGB framebuffers
- conditional rendering for occlusion queries
- transform feedback
- 2D and 3D texture arrays (could be used instead of texture atlases)
- removed features deprecated in 3.0
- GLSL 1.4
- rectangle textures
- buffer textures
- geometry instancing
- Uniform Buffer Objects (useful for geometry instancing by storing the model-view matrices for instance)
- primitive restart
- signed normalized internal texture formats
- core and compatibility context profiles
- GLSL 1.5
- geometry shaders
- Direct3D frag coord conventions (using origin_upper_left and pixel_center_integer layouts)
- synchronization primitives
- multisample textures
- Direct3D 10 compatibility (backport as much features as possible, other features go in OpenGL 4.0 released at the same time)
- GLSL 3.30
- geometry instancing arrays (use added attribs to control instancing instead of a RO vertex shader counter variable)
- sampler objects (bind sampling states to texture units, allows state sharing, allows a single texture to be sampled with different parameters in a single pass without duplicating the texture data)
- timer queries
- occlusion queries efficiency improvements
- explicit attribute location
- texture swizzle
- Direct3D 11 compatibility
- GLSL 4.00
- tessellation shaders
- blend functions for each color output
- request a minimum number of MSAA samples to be shaded
- cubemap texture arrays
- texture gather (allows getting components of the 2x2 footprint and implement custom filtering)
- texture LOD query from fragment shader
- extended transform feedback
- indirect draws (draw from buffer object memory)
- indirect shader subroutine calls
- 64-bit floating-point shader types
- GLSL 4.10
- OpenGL ES 2 compat
- get/set binary shader programs
- separate shader objects (independently set shaders to stages)
- 64-bit floating-point vertex attribs
- GLSL 4.20
- atomic counters
- texture storage (speed up mipmap level validation by specifying all parameters once and allow implementation to optimize by knowing the texture won't be changed)
- fast transform feedback instanced draws
- shader image load/store and memory barriers
- conservative depth (allows early depth test even if writing depth from fragment shader)
- 64 bytes aligned buffer maps
- GLSL 4.30
- OpenGL ES 3 compat
- compute shaders
- debug mode
- arrays of arrays in shaders
- clear buffer objects (basically a memset)
- GPU side image memcpy
- texture views
- allows framebuffer objects with no attachments (image load/store only may be used without writing to the framebuffer)
- multi indirect draws (allows large batches of drawing commands to be assembled in server memory) AZDO
- robust memory access
- query image size from shader
- shader storage buffer objects (to investigate)
- extended texture storage from 4.2 to multisample textures
- GLSL 4.40
- applied texture storage semantic to buffer objects (immutability allows driver optimization, a persistent flag has been added to allow draw commands while mapped)
- texture clears
- layout keyword extensions
- issue multiple binds in one call
- query to buffer objects (minimizes sync points)
- GLSL 4.50
- OpenGL ES 3.1 compat
- cull whole primitives in fragment shader
- coarse and fine derivatives
- Direct State Access (create, query and change states without binding)
- get texture sub image (useful to get just one slice of texture array)
- get number of texture samples from shader
- flush control over outgoing contexts
- robustness over errors (out of bounds, resets, etc)
- TODO
came to realise bottleneck is often the driver: sync and alloc (buffer updates), validation and compilation (binding objects), etc, so the KRH OpenGL working group worked on Approaching Zero Driver Overhead (AZDO).
- persistent mapped buffer (4.4) -> faster streaming of dyn geometry
- map once at creation (glMapBufferRange) with persistent flags
- no more map/unmap but manual fence syncs
- multi indirect draws (4.3) -> faster submission of many draw calls
- texture arrays (3.0) -> texture changes no longer break batches