OpenGL ES 3.0 – Halti has arrived
Khronos just released the specs for OpenGL ES 3.0 during Siggraph earlier today. Rumors were going on for some time and Khronos announced that they will release something.
Back in May I wrote “The best thing we can hope for is a clean rewrite of the specification text and OpenGL ES 3.0 – ideally in the same document.” – We got our rewrite of the Desktop OpenGL specs and also a new version 4.3 and OpenGL ES 3.0! They are still separate specs, so finding out what the difference is between ES and the various desktop versions can be a pain.
So what is new? OpenGL ES 3.0 looks pretty much like OpenGL 3.3 without geometry shaders. In addition it has ES specific stuff like binary shaders and is full compatible with OpenGL ES 2.0. So let’s see where the differences compared to 3.3 are:
- No geometry shaders and no layered framebuffers
- No conditional rendering
- No multisampled textures and thus no rendering to multisampled textures (but multisampled rendertargets)
- No logical operations after blending
- No timer queries
- Of course: No concept of deprecation and contexts as ES 2.0 was based on GL 2 and didn’t have the old fixed-function stuff to begin with
- Different formats for texture compression
- Internal format queries added, these were added to GL after 3.3
Or, looking from the OpenGL ES 2.1 vs 3.0 side we gain:
- A newer version of GLSL: 300 based on GLSL 330 of desktop GL (without geometry shaders etc. and without the noise function)
- Uniform Buffer Objects – e.g. useful for simpler handling of uniforms shared over multiple programs
- Pixel Buffer Objects – asynchronous upload and download of pixel data
- Vertex Array Objects – these were already present as an extension and make the handling of vertex attributes simpler
- Rendering to a specific mipmap level
- Multiple Render Targets – needed to render to multiple textures at once, e.g. for deferred shading
- Sampler Objects – decouple texture data and texture sampling parameters, you can for example sample the same texture with two different filter modes much simpler
- Immutable textures – the content might still get changed, but the format, size etc. is fixed which reduces validation checks in the driver
- At least 16 texture units instead of 8 for the fragment shader
- One and two-component textures – e.g. two-components for a normal map
- Seamless cubemap filtering
- Non power-of-two textures – very useful as rendertargets!
- More internal texture formats (including new compression modes: ETC2/EAC)
- 3D textures and 2D texture arrays – very useful to store multiple textures of the same mesh and selecting the texture ‘layer’ to use in the shader
- Instanced rendering – less draw calls to render the same geometry multiple times (think of 500 Zombies which differ in there model matrix and a few appearance attributes (e.g. a texture layer of a texture array) rendered with one call)
- Transform Feedback – store the output of the vertex shader in a buffer for later use
- Primitive restart – e.g. render multiple triangle strips with one draw call, a special ‘index’ in the element array buffer will define that a new triangle strip starts
- Indices can now be integers with more than 16 bits
OpenGL ES 3.0 is a big step forward from ES 2.0 adding most nice features from its big desktop cousin. GL 3.x programmers might just miss geometry shaders as rendering to multisample textures is even on the desktop not very common due to performance reasons. Sharing code between desktop and embedded systems will be much simpler with ES 3 while moving forwards from ES 2 should be painless as well.
As there are already some mobile GPUs available that support Halti, it will only be a matter of time until the first smartphone and tablet OSes add support for 3.0.