Adopting OpenGL ES 3.0
source link: https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/AdoptingOpenGLES3/AdoptingOpenGLES3.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Checklist for Adopting OpenGL ES 3.0
To use OpenGL ES 3.0 in your app:
Updating Extension Code
OpenGL ES 3.0 is a superset of the OpenGL ES 2.0 specification, so apps that use only core OpenGL ES 2.0 features can be used in an OpenGL ES 3.0 context without changes. However, some apps also use OpenGL ES 2.0 extensions. The features provided by these extensions are also available in OpenGL ES 3.0, but using them in an OpenGL ES 3.0 context may require at least minor code changes.
Remove Extension Suffixes
The OpenGL ES 2.0 extensions listed below define APIs that are incorporated into the core OpenGL ES 3.0 specification. To use these features in an OpenGL ES 3.0 context, simply remove the extension suffixes from function and constant names. For example, the name of the glMapBufferRangeEXT
function becomes glMapBufferRange
, and the DEPTH_COMPONENT24_OES
constant (used in the internalformat
parameter of the glRenderbufferStorage
function) becomes DEPTH_COMPONENT24
.
Modify Use of Extension APIs
Some features defined by OpenGL ES 2.0 extensions are in the core OpenGL ES 3.0 specification, but with changes to their API definitions. To use these features in an OpenGL ES 3.0 context, make the changes described below.
Working with Texture Formats
The
, OES_depth_texture
, OES_packed_depth_stencil
, OES_texture_float
, OES_texture_half_float
, and EXT_texture_rg
extensions define constants for use in the EXT_sRGB
internalformat
and type
parameters of the glTexImage
family of functions. The functionality defined by these extensions is available in the OpenGL ES 3.0 core API, but with some caveats:
The
glTexImage
functions do not supportinternalformat
constants without explicit sizes. Use explicitly sized constants instead:// Replace this OpenGL ES 2.0 code:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_HALF_FLOAT_OES, data);
// With this OpenGL ES 3.0 code:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_HALF_FLOAT, data);
OpenGL ES 3.0 does not define float or half-float formats for
LUMINANCE
orLUMINANCE_ALPHA
data. Use the correspondingRED
orRG
formats instead.The vector returned by depth and depth/stencil texture samplers no longer repeats the depth value in its first three components in OpenGL ES 3.0. Use only the first (
.r
) component in shader code that samples such textures.The sRGB format is only valid when used for the
internalformat
parameter in OpenGL ES 3.0. Use GL_RGB or GL_RGBA for the format parameter for sRGB textures.
Alternatively, replace calls to glTexImage
functions with calls to the corresponding glTexStorage
functions. Texture storage functions are available in as core API in OpenGL ES 3.0, and through the
extension in OpenGL ES 1.1 and 2.0. These functions offer an additional benefit: using a EXT_texture_storage
glTexStorage
function completely specifies an immutable texture object in one call; it performs all consistency checks and memory allocations immediately, guaranteeing that the texture object can never be incomplete due to missing mipmap levels or inconsistent cube map faces.
Mapping Buffer Objects into Client Memory
The
extension defines the OES_mapbuffer
glMapBuffer
function for mapping the entire data storage of a buffer object into client memory. OpenGL ES 3.0 instead defines the glMapBufferRange
function, which provides additional functionality: it allows mapping a subset of a buffer object’s data storage and includes options for asynchronous mapping. The glMapBufferRange
function is also available in OpenGL ES 1.1 and 2.0 contexts through the EXT_map_buffer_range extension.
Discarding Framebuffers
The glInvalidateFramebuffer
function in OpenGL ES 3.0 replaces the glDiscardFramebufferEXT
function provided by the
extension. The parameters and behavior of both functions are identical.EXT_discard_framebuffer
Using Multisampling
OpenGL ES 3.0 incorporates all features of the
extension, except for the APPLE_framebuffer_multisample
glResolveMultisampleFramebufferAPPLE
function. Instead the glBlitFramebuffer
function provides this and other other framebuffer copying options. To resolve a multisampling buffer, set the read and draw framebuffers (as in Using Multisampling to Improve Image Quality) and then use glBlitFramebuffer
to copy the entire read framebuffer into the entire draw framebuffer:
glBlitFramebuffer(0,0,w,h, 0,0,w,h, GL_COLOR_BUFFER_BIT, GL_NEAREST);
Continue Using Most Other Extensions in OpenGL ES 3.0
Several key features of iOS device graphics hardware are not part of the core OpenGL ES 3.0 specification, but remain available as OpenGL ES 3.0 extensions. To use these features, continue to check for extension support using the procedures described in Verifying OpenGL ES Capabilities. (See also the iOS Device Compatibility Reference to determine which features are available on which devices.)
Most code written for OpenGL ES 2.0 extensions that are also present as OpenGL ES 3.0 extensions will work in an OpenGL ES 3.0 context without changes. However, additional caveats apply to extensions which modify the vertex and fragment shader language—for details, see the next section.
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK