| Name |
| |
| OES_standard_derivatives |
| |
| Name Strings |
| |
| GL_OES_standard_derivatives |
| |
| Contributors |
| |
| John Kessenich |
| OpenGL Architecture Review Board |
| |
| Contact |
| |
| Benj Lipchak (benj.lipchak 'at' amd.com) |
| |
| Notice |
| |
| Copyright (c) 2005-2013 The Khronos Group Inc. Copyright terms at |
| http://www.khronos.org/registry/speccopyright.html |
| |
| Specification Update Policy |
| |
| Khronos-approved extension specifications are updated in response to |
| issues and bugs prioritized by the Khronos OpenGL ES Working Group. For |
| extensions which have been promoted to a core Specification, fixes will |
| first appear in the latest version of that core Specification, and will |
| eventually be backported to the extension document. This policy is |
| described in more detail at |
| https://www.khronos.org/registry/OpenGL/docs/update_policy.php |
| |
| Status |
| |
| Ratified by the Khronos BOP, March 20, 2008. |
| |
| Version |
| |
| Date: July 18, 2007 Revision: 0.99 |
| |
| Number |
| |
| OpenGL ES Extension #45 |
| |
| Dependencies |
| |
| OpenGL ES 2.0 is required. |
| |
| Overview |
| |
| The standard derivative built-in functions and semantics from OpenGL 2.0 are |
| optional for OpenGL ES 2.0. When this extension is available, these |
| built-in functions are also available, as is a hint controlling the |
| quality/performance trade off. |
| |
| Issues |
| |
| None. |
| |
| New Procedures and Functions |
| |
| None |
| |
| New Tokens |
| |
| Accepted by the <target> parameter of Hint and by the <pname> parameter of |
| GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: |
| |
| FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B |
| |
| New Keywords |
| |
| None. |
| |
| New Built-in Functions |
| |
| dFdx() |
| dFdy() |
| fwidth() |
| |
| New Macro Definitions |
| |
| #define GL_OES_standard_derivatives 1 |
| |
| Additions to Chapter 5 of the OpenGL ES 2.0 specification: |
| |
| In section 5.2 (Hints), add the following to the list of supported hints: |
| |
| FRAGMENT_SHADER_DERIVATIVE_HINT_OES |
| |
| Derivative accuracy for fragment processing built-in functions dFdx, dFdy |
| and fwidth. |
| |
| Additions to Chapter 8 of the OpenGL ES Shading Language specification: |
| |
| Replace section 8.8 (Fragment Processing Functions) with the following |
| paragraphs: |
| |
| Fragment processing functions are only available in fragment shaders. |
| |
| The built-in derivative functions dFdx, dFdy, and fwidth are optional, and |
| must be enabled by |
| |
| #extension GL_OES_standard_derivatives : enable |
| |
| before being used. |
| |
| Derivatives may be computationally expensive and/or numerically unstable. |
| Therefore, an OpenGL ES implementation may approximate the true derivatives |
| by using a fast but not entirely accurate derivative computation. |
| |
| The expected behavior of a derivative is specified using forward/backward |
| differencing. |
| |
| Forward differencing: |
| |
| F(x+dx) - F(x) is approximately equal to dFdx(x).dx 1a |
| |
| dFdx(x) is approximately equal to F(x+dx) - F(x) 1b |
| -------------- |
| dx |
| |
| Backward differencing: |
| |
| F(x-dx) - F(x) is approximately equal to -dFdx(x).dx 2a |
| |
| dFdx(x) is approximately equal to F(x) - F(x-dx) 2b |
| -------------- |
| dx |
| |
| |
| With single-sample rasterization, dx <= 1.0 in equations 1b and 2b. For |
| multi-sample rasterization, dx < 2.0 in equations 1b and 2b. |
| |
| dFdy is approximated similarly, with y replacing x. |
| |
| An OpenGL ES implementation may use the above or other methods to perform |
| the calculation, subject to the following conditions: |
| |
| 1. The method may use piecewise linear approximations. Such linear |
| approximations imply that higher order derivatives, dFdx(dFdx(x)) and |
| above, are undefined. |
| |
| 2. The method may assume that the function evaluated is continuous. |
| Therefore derivatives within the body of a non-uniform conditional are |
| undefined. |
| |
| 3. The method may differ per fragment, subject to the constraint that the |
| method may vary by window coordinates, not screen coordinates. The |
| invariance requirement described in section 3.1 of the OpenGL ES 2.0 |
| specification is relaxed for derivative calculations, because the method |
| may be a function of fragment location. |
| |
| Other properties that are desirable, but not required, are: |
| |
| 4. Functions should be evaluated within the interior of a primitive |
| (interpolated, not extrapolated). |
| |
| 5. Functions for dFdx should be evaluated while holding y constant. |
| Functions for dFdy should be evaluated while holding x constant. |
| However, mixed higher order derivatives, like dFdx(dFdy(y)) and |
| dFdy(dFdx(x)) are undefined. |
| |
| 6. Derivatives of constant arguments should be 0. |
| |
| In some implementations, varying degrees of derivative accuracy may be |
| obtained by providing GL hints (section 5.6 of the OpenGL ES 2.0 |
| specification), allowing a user to make an image quality versus speed trade |
| off. |
| |
| |
| GLSL ES functions |
| ================= |
| |
| genType dFdx (genType p) |
| |
| Returns the derivative in x using local differencing for the input argument |
| p. |
| |
| genType dFdy (genType p) |
| |
| Returns the derivative in y using local differencing for the input argument |
| p. |
| |
| These two functions are commonly used to estimate the filter width used to |
| anti-alias procedural textures. We are assuming that the expression is |
| being evaluated in parallel on a SIMD array so that at any given point in |
| time the value of the function is known at the grid points represented by |
| the SIMD array. Local differencing between SIMD array elements can |
| therefore be used to derive dFdx, dFdy, etc. |
| |
| genType fwidth (genType p) |
| |
| Returns the sum of the absolute derivative in x and y using local |
| differencing for the input argument p, i.e.: |
| |
| abs (dFdx (p)) + abs (dFdy (p)); |
| |
| New State |
| |
| Add to Table 6.27: Hints |
| |
| Get Value Type Get Command Initial Value Description |
| --------- ---- ----------- ------------- ----------- |
| FRAGMENT_SHADER_DERIVATIVE_ Z3 GetIntegerv DONT_CARE Fragment shader |
| HINT_OES derivative |
| accuracy hint |
| |
| Revision History |
| |
| 7/07/2005 Created. |
| 7/06/2006 Removed from main specification document. |
| 7/18/2007 Updated to match desktop GLSL spec and added hint. |