зеркало из https://github.com/AvaloniaUI/angle.git
772 строки
33 KiB
Plaintext
772 строки
33 KiB
Plaintext
Name
|
|
|
|
EXT_blend_func_extended
|
|
|
|
Name Strings
|
|
|
|
GL_EXT_blend_func_extended
|
|
|
|
Contact
|
|
|
|
Mark Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com)
|
|
|
|
Contributors
|
|
|
|
Daniel Koch, NVIDIA
|
|
Slawomir Grajewski, Intel
|
|
Chris Dalton, NVIDIA
|
|
Brian Salomon, Google
|
|
|
|
From ARB_blend_func_extended...
|
|
|
|
Graham Sellers, AMD
|
|
Mark Young, AMD
|
|
Nick Haemel, AMD
|
|
Pierre Boudier, AMD
|
|
Mais Alnasser, AMD
|
|
Jeff Bolz, NVIDIA
|
|
Pat Brown, NVIDIA
|
|
Ian Stewart, NVIDIA
|
|
Jon Leech, Khronos
|
|
|
|
Status
|
|
|
|
Draft, almost complete
|
|
|
|
Version
|
|
|
|
Last Modified Date: July 29, 2015
|
|
Revision: 5
|
|
|
|
Number
|
|
|
|
XXX
|
|
|
|
Dependencies
|
|
|
|
This extension is written against the OpenGL ES 3.1 (June 4, 2014)
|
|
specification, but can apply to earlier versions back to ES 2.0.
|
|
|
|
GLSL version 300 and 310 language is written against The OpenGL ES
|
|
Shading Language (July 11, 2012).
|
|
|
|
GLSL version 100 language is written against The OpenGL ES Shading
|
|
Language (May 12, 2009).
|
|
|
|
The NV_draw_buffers and EXT_draw_buffers extensions trivially affect
|
|
the definition of this extension.
|
|
|
|
The EXT_draw_buffers_indexed extension affects the definition of
|
|
this extension.
|
|
|
|
Overview
|
|
|
|
This extension provides an ES version of the ARB_blend_func_extended
|
|
functionality.
|
|
|
|
Traditional OpenGL includes fixed-function blending that combines
|
|
source colors with the existing content of a render buffer in
|
|
a variety of ways. A number of extensions have enhanced this
|
|
functionality by adding further sources of blending weights and
|
|
methods to combine them. However, the inputs to the fixed-function
|
|
blending units are constrained to a source color (as output from
|
|
fragment shading), destination color (as the current content of the
|
|
frame buffer) or constants that may be used in their place.
|
|
|
|
This extension adds new blending functions whereby a fragment
|
|
shader may output two colors, one of which is treated as the
|
|
source color, and the other used as a blending factor for either
|
|
source or destination colors. Furthermore, this extension increases
|
|
orthogonality by allowing the SRC_ALPHA_SATURATE function to be used
|
|
as the destination weight.
|
|
|
|
Because of the limitations of the OpenGL ES 2.0 shading language,
|
|
new built-in variables (gl_SecondaryFragColorEXT,
|
|
gl_SecondaryFragDataEXT) are added to the ES 1.00 shading language
|
|
rather than introduce more complex features for user-defined fragment
|
|
outputs. Because such built-in variable are deprecated in ES 3.0,
|
|
these variables are NOT available in the OpenGL ES 3.xx shading
|
|
language verisons.
|
|
|
|
IP Status
|
|
|
|
No known IP claims.
|
|
|
|
New Procedures and Functions
|
|
|
|
void BindFragDataLocationIndexedEXT(uint program, uint colorNumber,
|
|
uint index, const char * name);
|
|
|
|
int GetFragDataIndexEXT(uint program, const char * name);
|
|
|
|
void BindFragDataLocationEXT(uint program, uint colorNumber, const char * name)
|
|
|
|
int GetProgramResourceLocationIndexEXT(uint program, enum programInterface, const char *name);
|
|
|
|
New Tokens
|
|
|
|
Accepted by the <src> and <dst> parameters of BlendFunc and
|
|
BlendFunciEXT, and by the <srcRGB>, <dstRGB>, <srcAlpha> and <dstAlpha>
|
|
parameters of BlendFuncSeparate and BlendFuncSeparateiEXT:
|
|
|
|
SRC1_COLOR_EXT 0x88F9
|
|
SRC1_ALPHA_EXT 0x8589 // OpenGL 1.5 token value
|
|
ONE_MINUS_SRC1_COLOR_EXT 0x88FA
|
|
ONE_MINUS_SRC1_ALPHA_EXT 0x88FB
|
|
SRC_ALPHA_SATURATE_EXT 0x0308
|
|
|
|
Accepted in the <props> array of GetProgramResourceiv:
|
|
|
|
LOCATION_INDEX_EXT 0x930F
|
|
|
|
Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
|
|
and GetFloatv:
|
|
|
|
MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC
|
|
|
|
Additions to Chapter 7 of the OpenGL ES 3.1 Specification (Programs and
|
|
Shaders)
|
|
|
|
Add a row to table 7.2 "GetProgramResourceiv properties and supported
|
|
interfaces" (page 82):
|
|
|
|
Property Supported Interfaces
|
|
------------------ --------------------
|
|
LOCATION_INDEX_EXT PROGRAM_OUTPUT
|
|
|
|
Modify section 7.3.1.1 "Naming Active Resources" subsection to include
|
|
after the LOCATION paragraph (page 84):
|
|
|
|
"For the property LOCATION_INDEX_EXT, a single integer identifying the
|
|
fragment color index of an active fragment shader output variable
|
|
is written to params. If the active variable is not an output for a
|
|
fragment shader, the value -1 will be written to params."
|
|
|
|
Modify (page 87) the paragraph introducing GetProgramResourceLocation
|
|
to begin:
|
|
|
|
"The commands
|
|
|
|
int GetProgramResourceLocation( uint program,
|
|
enum programInterface, const char *name );
|
|
int GetProgramResourceLocationIndexEXT( uint program,
|
|
enum programInterface, const char *name );
|
|
|
|
return the location or the fragment color index, respectively,
|
|
assigned to the variable named name in interface programInterface
|
|
of program object program."
|
|
|
|
Change the ending of the same paragraph to read:
|
|
|
|
"For GetProgramResourceLocationIndexEXT, programInterface must be
|
|
PROGRAM_OUTPUT. The value -1 will be returned by either command if
|
|
an error occurs, if name does not identify an active variable on
|
|
programInterface, or if name identifies an active variable that
|
|
does not have a valid location assigned, as described above. The
|
|
locations returned by these commands are the same locations returned
|
|
when querying the LOCATION and LOCATION_INDEX resource properties."
|
|
|
|
Change the next paragaph to begin:
|
|
|
|
"A string provided to GetProgramResourceLocation or
|
|
GetProgramResourceLocationIndexEXT is considered to match an active
|
|
variable if ..."
|
|
|
|
Change the last paragraph of the section (page 88) to read:
|
|
|
|
... "If the string specifies an element of an array variable,
|
|
GetProgramResourceLocation and GetProgramResourceLocationIndexEXT
|
|
return the location or fragment color index assigned to that
|
|
element. If it specifies the base name of an array, it identifies
|
|
the resources associated with the first element of the array."
|
|
|
|
Additions to Chapter 14 of the OpenGL ES 3.1 Specification (Programmable
|
|
Fragment Processing)
|
|
|
|
Modify section 14.2.3 "Shader Outputs" subsection to include:
|
|
|
|
"The binding of a user-defined varying out variable to a fragment color number
|
|
can be specified explicitly. The command
|
|
|
|
void BindFragDataLocationIndexedEXT(uint program, uint colorNumber,
|
|
uint index, const char * name);
|
|
|
|
specifies that the varying out variable name in <program> should
|
|
be bound to fragment color <colorNumber> when the program is next
|
|
linked. <index> may be zero or one to specify that the color
|
|
be used as either the first or second color input to the blend
|
|
equation, respectively, as described in Section 15.1.5 (Blending).
|
|
If <name> was bound previously, its assigned binding is replaced
|
|
with colorNumber. <name> must be a null-terminated string. The error
|
|
INVALID_VALUE is generated if <colorNumber> is equal or greater
|
|
than the value of MAX_DRAW_BUFFERS and <index> is zero,
|
|
or if <colorNumber> is equal or greater than the value of
|
|
MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT and <index> is greater than or
|
|
equal to one. The command
|
|
|
|
void BindFragDataLocationEXT(uint program, uint colorNumber,
|
|
const char * name)
|
|
|
|
is equivalent to calling BindFragDataLocationIndexedEXT with the
|
|
same values for <program>, <colorNumber> and <name>, and with <index>
|
|
set to zero.
|
|
|
|
When a program is linked, any varying out variables without
|
|
a binding specified through BindFragDataLocationIndexedEXT or
|
|
BindFragDataLocationEXT will automatically be bound to fragment
|
|
colors and indices by the GL. All such assignments will use color
|
|
indices of zero. Such bindings can be queried using the commands
|
|
GetFragDataLocation and GetFragDataIndexEXT. Output binding
|
|
assignments will cause LinkProgram to fail:
|
|
|
|
* if the number of active outputs is greater than the value of
|
|
MAX_DRAW_BUFFERS_EXT;
|
|
|
|
* if the program has an active output assigned to a location greater
|
|
than or equal to the value of MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT
|
|
and has an active output assigned an index greater than or equal
|
|
to one;
|
|
|
|
* if more than one varying out variable is bound to the same number
|
|
and index; or
|
|
|
|
* if the explicit binding assignments do not leave enough space
|
|
for the linker to automatically assign a location for a varying
|
|
out array, which requires multiple contiguous locations.
|
|
|
|
BindFragDataLocationIndexedEXT may be issued before any shader objects
|
|
are attached to a program object. Hence it is allowed to bind any
|
|
name (except a name starting with gl_) to a color number and index,
|
|
including a name that is never used as a varying out variable in
|
|
any fragment shader object. Assigned bindings for variables that
|
|
do not exist are ignored."
|
|
|
|
Add to end of section:
|
|
|
|
"The command
|
|
|
|
int GetFragDataIndexEXT(uint program, const char * name);
|
|
|
|
returns the index of the fragment color to which the variable <name>
|
|
was bound when the program object <program> was last linked. If
|
|
program has not been successfully linked, the error INVALID_OPERATION
|
|
is generated. If name is not a varying out variable, or if an error
|
|
occurs, -1 will be returned. The command is equivalent to
|
|
|
|
GetProgramResourceLocationIndex(program, PROGRAM_OUTPUT, name);"
|
|
|
|
Additions to Chapter 15 of the OpenGL ES 3.1 Specification (Writing
|
|
Fragments and Samples to the Framebuffer)
|
|
|
|
Modify section 15.1.5.2 "Blend Functions":
|
|
|
|
Change the first paragraph to read:
|
|
|
|
"The weighting factors used by the blend equation are determined by
|
|
the blend functions. There are four possible sources for weighting
|
|
factors. These are the constant color (Rc, Gc, Bc, Ac) (see
|
|
BlendColor, p. 211), the first source color (Rs0, Gs0, Bs0, As0),
|
|
the second source color (Rs1, Gs1, Bs1, As1), and the destination
|
|
color (the existing content of the draw buffer). Additionally the
|
|
special constants ZERO and ONE are available as weighting factors."
|
|
|
|
Modify Table 15.2 (RGB and ALPHA source and destination blend
|
|
functions ...) as follows
|
|
|
|
RGB Blend Factors Alpha Blend Factors
|
|
Value (Sr, Sg, Sb) or (Dr, Dg, Db) Sa or Da
|
|
----- ---------------------------- -------------------
|
|
ZERO (0, 0, 0) 0
|
|
ONE (1, 1, 1) 1
|
|
SRC_COLOR (Rs0, Gs0, Bs0) As0
|
|
ONE_MINUS_SRC_COLOR (1, 1, 1) - (Rs0, Gs0, Bs0) 1 - As0
|
|
DST_COLOR (Rd, Gd, Bd) Ad
|
|
ONE_MINUS_DST_COLOR (1, 1, 1) - (Rd, Gd, Bd) 1 - Ad
|
|
SRC_ALPHA (As0, As0, As0) As0
|
|
ONE_MINUS_SRC_ALPHA (1, 1, 1) - (As0, As0, As0) 1 - As0
|
|
DST_ALPHA (Ad, Ad, Ad) Ad
|
|
ONE_MINUS_DST_ALPHA (1, 1, 1) - (Ad, Ad, Ad) 1 - Ad
|
|
CONSTANT_COLOR (Rc, Gc, Bc) Ac
|
|
ONE_MINUS_CONSTANT_COLOR (1, 1, 1) - (Rc, Gc, Bc) 1 - Ac
|
|
CONSTANT_ALPHA (Ac, Ac, Ac) Ac
|
|
ONE_MINUS_CONSTANT_ALPHA (1, 1, 1) - (Ac, Ac, Ac) 1 - Ac
|
|
SRC_ALPHA_SATURATE (f, f, f) 1 New (for ES 2.x)
|
|
SRC1_COLOR_EXT (Rs1, Gs1, Bs1) As1 New
|
|
ONE_MINUS_SRC1_COLOR_EXT (1, 1, 1) - (Rs1, Gs1, Bs1) 1 - As1 New
|
|
SRC1_ALPHA_EXT (As1, As1, As1) As1 New
|
|
ONE_MINUS_SRC1_ALPHA_EXT (1, 1, 1) - (As1, As1, As1) 1 - As1 New
|
|
|
|
For ES 2.0, remove table's footnote saying (ES 3.x already has this
|
|
removed):
|
|
|
|
SRC_ALPHA_SATURATE is valid only for source RGB and alpha
|
|
blending functions.
|
|
|
|
Add the following subsections to Section 5.1.5 Blending, at the end
|
|
of the subsection 15.1.5.2 "Blend Functions":
|
|
|
|
"15.1.5.X Dual Source Blending and Multiple Draw Buffers
|
|
|
|
Blend functions that require the second color input, <Rs1, Gs1, Bs1,
|
|
As1> (SRC1_COLOR_EXT, SRC1_ALPHA_EXT, ONE_MINUS_SRC1_COLOR_EXT, or
|
|
ONE_MINUS_SRC1_ALPHA_EXT) may consume hardware resources that could
|
|
otherwise be used for rendering to multiple draw buffers. Therefore,
|
|
the number of draw buffers that can be attached to a frame buffer
|
|
may be lower when using dual-source blending.
|
|
|
|
The maximum number of draw buffers that may be attached to a
|
|
single frame buffer when using dual-source blending functions is
|
|
implementation dependent and can be queried by calling GetIntegerv
|
|
with the symbolic constant MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT. When
|
|
using dual-source blending, MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT should be
|
|
used in place of MAX_DRAW_BUFFERS_EXT to determine the maximum number
|
|
of draw buffers that may be attached to a single frame buffer. The
|
|
value of MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT must be at least 1. If
|
|
the value of MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT is 1, then dual-source
|
|
blending and multiple draw buffers cannot be used simultaneously.
|
|
|
|
If either blend function is set to one of the second source factors
|
|
(SRC1_COLOR_EXT, SRC1_ALPHA_EXT, ONE_MINUS_SRC1_COLOR_EXT, or
|
|
ONE_MINUS_SRC1_ALPHA_EXT) for any draw buffer and any draw buffers
|
|
equal to or greater than the value of MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT
|
|
have values other than NONE, the error INVALID_OPERATION is generated
|
|
by drawing commands.
|
|
|
|
15.1.5.Y Generation of Second Color Source for Blending
|
|
|
|
Rendering using any of the blend functions that consume the second
|
|
input color (SRC1_COLOR_EXT, ONE_MINUS_SRC1_COLOR_EXT, SRC1_ALPHA_EXT
|
|
or ONE_MINUS_SRC1_ALPHA_EXT) using a shader that does not output
|
|
a second source color will produce undefined results. To produce
|
|
input for the second source color, a shader must be used that outputs
|
|
a second source color.
|
|
|
|
When using a GLSL version 300 es or higher fragment shader with
|
|
dual-source blending functions, the color output varyings are bound
|
|
to the first (index 0) and second (index 1) inputs of a draw buffer
|
|
using BindFragDataLocationIndexedEXT as described in the "Shader
|
|
Outputs" subsection of Section 3.12.2 or by layout qualifiers for
|
|
location=/n/ and index=/m/. Data written to the first of these outputs
|
|
becomes the first source color input to the blender (corresponding
|
|
to SRC_COLOR and SRC_ALPHA). Data written to the second of these
|
|
outputs generates the second source color input to the blender
|
|
(corresponding to SRC1_COLOR_EXT and SRC1_ALPHA_EXT).
|
|
|
|
Alternatively if the GLSL version 100 fragment shader is used (where
|
|
user-defined color outputs are unsupported, hence a user-defined
|
|
color output is not available for BindFragDataLocationIndexEXT), the
|
|
gl_FragColor and gl_SecondaryFragColorEXT fragment outputs correspond
|
|
to the first and second source color respectively. Similarly the
|
|
gl_FragData and gl_SecondaryFragDataEXT fragment output arrays
|
|
correspond to the first and second source color respectively of each
|
|
color buffer output.
|
|
|
|
If the second color input to the blender is not written in the
|
|
shader, or if no output is bound to the second input of a blender,
|
|
the result of the blending operation is not defined.
|
|
|
|
Other shading languages may define similar methods for producing
|
|
the first and second color inputs to blending equations."
|
|
|
|
Additions to the OpenGL ES Shading Language 1.00 Specification
|
|
|
|
Including the following line in a shader can be used to control the
|
|
language features described in this extension:
|
|
|
|
#extension GL_EXT_blend_func_extended : <behavior>
|
|
|
|
where <behavior> is as specified in section 3.4.
|
|
|
|
A new preprocessor #define is added to the OpenGL ES Shading Language:
|
|
|
|
#define GL_EXT_blend_func_extended 1
|
|
|
|
Modify paragraphs in section 7.2 "Fragment Shader Special Variables" as follows:
|
|
|
|
First paragraph, second sentence:
|
|
|
|
"Fragment shaders output values to the OpenGL ES pipeline using
|
|
the built-in variables gl_FragColor, gl_SecondaryFragColorEXT,
|
|
gl_FragData, and gl_SecondaryFragDataEXT, unless the discard keyword
|
|
is executed."
|
|
|
|
Second paragraph, first sentence:
|
|
|
|
"It is not a requirement for the fragment shader to write to
|
|
either gl_FragColor, gl_SecondaryFragColorEXT, gl_FragData, or
|
|
gl_SecondaryFragDataEXT."
|
|
|
|
Add after the fourth paragraph:
|
|
|
|
"Writing to gl_SecondaryFragColorEXT specifies a second fragment color
|
|
that will be used by the subsequent fixed functionality pipeline for
|
|
dual source blending. If subsequent fixed functionality consumes the
|
|
second fragment color and an execution of a fragment shader does
|
|
not write a value to gl_SecondaryFragColorEXT then the secondary
|
|
fragment color consumed is undefined."
|
|
|
|
Add after the fifth paragraph:
|
|
|
|
"The variable gl_SecondaryFragDataEXT is an array. Writing to
|
|
gl_SecondaryFragDataEXT[n] specifies the secondary fragment data that
|
|
will be used by the subsequent fixed functionality pipeline for data n
|
|
for dual source blending. If subsequent fixed functionality consumes
|
|
secondary fragment data and an execution of a fragment shader does
|
|
not write a value to it, then the secondary fragment data consumed
|
|
is undefined."
|
|
|
|
Modify the sixth paragraph to read:
|
|
|
|
"If a shader statically assigns a value to gl_FragColor or
|
|
gl_SecondaryFragColorEXT, it may not assign a value to any
|
|
element of gl_FragData or gl_SecondaryFragDataEXT. If a shader
|
|
statically writes a value to any element of gl_FragData or
|
|
gl_SecondaryFragDataEXT, it may not assign a value to gl_FragColor
|
|
or gl_SecondaryFragColorEXT. That is, a shader may assign values to
|
|
either the set of gl_FragColor and gl_SecondaryFragColorEXT or the
|
|
set of gl_FragData and gl_SecondaryFragDataEXT, but not both."
|
|
|
|
Modify the eighth paragraph to read:
|
|
|
|
"If a shader executes the discard keyword, the fragment is discarded,
|
|
and the values of gl_FragColor, gl_SecondaryFragColorEXT, gl_FragData,
|
|
and gl_SecondaryFragDataEXT become irrelevant."
|
|
|
|
Add these built-in variable to the list "accessible from a fragment shader":
|
|
|
|
mediump vec4 gl_SecondaryFragColorEXT;
|
|
mediump vec4 gl_SecondaryFragDataEXT[gl_MaxDualSourceDrawBuffersEXT];
|
|
|
|
Add to section 7.4 "Built-In Constants" the following constant:
|
|
|
|
const mediump int gl_MaxDualSourceDrawBuffersEXT = 1;
|
|
|
|
Additions to the OpenGL ES Shading Language 3.00 and 3.10 Specification
|
|
|
|
Including the following line in a shader can be used to control the
|
|
language features described in this extension:
|
|
|
|
#extension GL_EXT_blend_func_extended : <behavior>
|
|
|
|
where <behavior> is as specified in section 3.4.
|
|
|
|
A new preprocessor #define is added to the OpenGL ES Shading Language:
|
|
|
|
#define GL_EXT_blend_func_extended 1
|
|
|
|
Modify section 4.4.2 "Output Layout Qualifiers":
|
|
|
|
Change the second paragraph to read:
|
|
|
|
"Fragment shaders allow output layout qualifiers only on the interface
|
|
qualifier out. The layout qualifier identifier for fragment shader
|
|
outputs is:
|
|
|
|
layout-qualifier-id
|
|
location = integer-constant
|
|
index = integer-constant
|
|
|
|
Each of these qualifiers may appear at most once. If index is
|
|
specified, location must also be specified. If index is not
|
|
specified, the value 0 is used."
|
|
|
|
Add an additional example to the end of the fourth paragraph's example:
|
|
|
|
"And,
|
|
|
|
layout(location = 3, index = 1) out vec4 factor;
|
|
|
|
will establish that the fragment shader output factor is copied out
|
|
to fragment color 3 as the second (index one) input to the blend
|
|
equation."
|
|
|
|
Change the first sentence of the second to last paragraph to read:
|
|
|
|
"If there is more than one fragment output, the location must
|
|
be specified for all outputs unless the EXT_blend_func_extended
|
|
extension is enabled in which case more than one unassigned fragment
|
|
output locations are allowed though they must be assigned to unique
|
|
locations assigned with glBindFragDataLocationIndexedEXT prior to
|
|
linking."
|
|
|
|
Add to section 7.4 "Built-In Constants" the following constant:
|
|
|
|
const mediump int gl_MaxDualSourceDrawBuffersEXT = 1;
|
|
|
|
Dependencies on OpenGL ES 3.0
|
|
|
|
If OpenGL ES 3.0 or higher is not supported (meaning OpenGL ES 2.0
|
|
support only), remove all references to the functions:
|
|
|
|
BindFragDataLocationIndexedEXT
|
|
GetFragDataIndexEXT
|
|
BindFragDataLocationEXT
|
|
GetProgramResourceLocationIndexEXT
|
|
|
|
Also ignore the additions to chapters 7 and 14 and the paragraph in
|
|
section 15.1.5.Y related to GLSL version 300 es or higher.
|
|
|
|
When OpenGL ES 3.0 or higher, the "Additions to the OpenGL ES
|
|
Shading Language 1.00 Specification" applies to the version 100
|
|
shading language, but not later versions.
|
|
|
|
Dependencies on OpenGL ES 3.1
|
|
|
|
If OpenGL ES 3.1 or higher is not supported (meaning OpenGL ES 3.0
|
|
or earlier), remove all references to the function
|
|
|
|
GetProgramResourceLocationIndexEXT
|
|
|
|
because program resource queries are added by ES 3.1.
|
|
|
|
Also ignore the additions to chapter 7.
|
|
|
|
Dependencies on EXT_draw_buffers or NV_draw_buffers
|
|
|
|
Using dual-source blending functions may consume additional outputs
|
|
from hardware shading units and therefore can reduce the number
|
|
of draw buffers that may be attached to a single frame buffer when
|
|
dual-source blending functions are enabled. In this case, the value
|
|
of MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT may be less than the value of
|
|
MAX_DRAW_BUFFERS_EXT. If EXT_draw_buffers or NV_draw_buffers is not
|
|
supported then the value of MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT must
|
|
be 1. Furthermore, the discussion in the subsection entitled "Dual
|
|
Source Blending and Multiple Draw Buffers" may be discarded.
|
|
|
|
Dependencies on EXT_draw_buffers_indexed
|
|
|
|
If EXT_draw_buffers_indexed is not supported, all references to
|
|
BlendFunciEXT and BlendFuncSeparateiEXT should be removed. In this
|
|
case, the blend functions for all attached draw buffers will be the
|
|
same.
|
|
|
|
Errors
|
|
|
|
The error INVALID_OPERATION is generated by Begin or any
|
|
procedure that implicitly calls Begin if any draw buffer has a
|
|
blend function requiring the second color input (SRC1_COLOR_EXT,
|
|
ONE_MINUS_SRC1_COLOR_EXT, SRC1_ALPHA_EXT or ONE_MINUS_SRC1_ALPHA_EXT),
|
|
and a framebuffer is bound that has more than the value of
|
|
MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT-1 active color attachments.
|
|
|
|
New State
|
|
|
|
None
|
|
|
|
While no changes to table 20.12 (Pixel Operations) are strictly
|
|
necessary, new enumerations are supported for the BLEND_SRC_RGB,
|
|
BLEND_SRC_ALPHA, BLEND_DST_RGB, and BLEND_DST_ALPHA state to support
|
|
SRC1_COLOR_EXT, SRC1_ALPHA_EXT, ONE_MINUS_SRC1_COLOR_EXT, and
|
|
ONE_MINUS_SRC1_ALPHA_EXT (and for ES 2.0, SRC_ALPHA_SATURATE_EXT).
|
|
|
|
New Implementation Dependent State
|
|
|
|
Get Value Type Get Command Minimum Value Description Sec.
|
|
--------- ---- ----------- ------------- ------------------- ------
|
|
MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT Z+ GetIntegerv 1 Maximum number of 15.1.5
|
|
active draw buffers
|
|
when using dual-source
|
|
blending
|
|
|
|
Example Use Cases
|
|
|
|
There are several potential uses for this functionality. A first
|
|
example is in the implementation of sub-pixel accurate font rendering
|
|
algorithms. Given a known layout of pixel elements (red, green
|
|
and blue components), coverage may be calculated independently for
|
|
each element and passed to the blender in the second source color
|
|
as a per-channel opacity. To use this mode, use the following blend
|
|
functions:
|
|
|
|
glBlendFunc(GL_SRC1_COLOR_EXT, GL_ONE_MINUS_SRC1_COLOR_EXT);
|
|
|
|
As a second example, consider a partially reflective colored glass
|
|
window. It will attenuate light passing through it, and reflect
|
|
some of the light that strikes it. Using an appropriate combination
|
|
of functions, this effect may be simulated in a single pass using
|
|
only fixed-function blending hardware. In this case, the following
|
|
blend functions may be used:
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_SRC1_COLOR_EXT);
|
|
|
|
Issues
|
|
|
|
0. What should this extension be named?
|
|
|
|
RESOLVED: EXT_blend_func_extended, matching the name of
|
|
ARB_blend_func_extended upon which this extension is based but
|
|
providing a multi-vendor extension for ES implementations.
|
|
|
|
1. Is this extension compatible with the ARB_blend_func_extended
|
|
version?
|
|
|
|
RESOLVED: Yes. This extension is 100% functionally identical to
|
|
ARB_blend_func_extended but for the ES 2.x and 3.x APIs.
|
|
|
|
The token values are _EXT suffixed but have the same values as
|
|
the ARB_blend_func_extended tokens.
|
|
|
|
Philosophically if this extension is going for 100% parity and
|
|
functionality with ARB_blend_func_extended, it should simply add
|
|
all the stuff in ARB_blend_func_extended...
|
|
|
|
2. Should the next commands be EXT suffixed?
|
|
|
|
RESOLVED: Yes. This is not an OES extension.
|
|
|
|
This means source code coming from a desktop environment should
|
|
call eglGetProcAddress on function names with the EXT suffix.
|
|
However because extension functions are called through function
|
|
pointers, this is only a minor change isolated to function pointer
|
|
initialization.
|
|
|
|
2. Should this extension allow ES 2.0 contexts to use
|
|
GL_SRC_ALPHA_SATURATE for the destination blend function?
|
|
|
|
RESOLVED: Yes, the ARB_blend_func_extended extension adds support
|
|
for using GL_SRC_ALPHA_SATURATE as the destination factor as "bonus"
|
|
functionality.
|
|
|
|
ES 3.x already allows GL_SRC_ALPHA_SATURATE for the destination
|
|
factor so this additional functionality is new only to ES 2.0 contexts
|
|
supporting this extension.
|
|
|
|
We expect no GPU hardware capable of dual-source blending to not
|
|
also support GL_SRC_ALPHA_SATURATE as the destination factor.
|
|
|
|
3. Should this extension provide the glBindFragDataLocation and
|
|
glBindFragDataLocationIndexed functionality?
|
|
|
|
RESOLVED: Yes. With EXT suffixes.
|
|
|
|
4. Should this really be OES_blend_func_extended?
|
|
|
|
RESOLVED: Go with EXT is for expediency.
|
|
|
|
Additionally this extension supports functionality such
|
|
GL_SRC_ALPHA_SATURATE that all desktop GPU hardware is assumed to
|
|
have. ES-only vendors might not want this in an OES extension.
|
|
|
|
The same could be said for the glBindFragDataLocation* functionality.
|
|
|
|
5. Does this extension need an interaction with
|
|
OES_blend_equation_separate?
|
|
|
|
RESOLVED: No, that's an ES 1.1 extension. ES 2.0 and on all support
|
|
separate blend functions.
|
|
|
|
6. Are there any OpenGL ES Shading Language interactions?
|
|
|
|
RESOLVED: Yes, to use this extension, a #extension line will be needed
|
|
in the shader requesting the EXT_blend_func_extended functionality.
|
|
Example:
|
|
|
|
#extension GL_EXT_blend_func_extended : require
|
|
|
|
The ARB_blend_func_extended functionality does NOT require a special
|
|
#extension line to use its functionality because the ARB version
|
|
relies on existing GLSL functionality that allows for multiple
|
|
fragment outputs as part of supporting multiple render targets.
|
|
In the ARB version, then glBindFragDataLocationIndexed can bind
|
|
these unassigned locations to different source output colors.
|
|
But GLSL OpenGL ES 3.00 and 3.10 both explicitly preclude more than
|
|
one fragment shader output with an unassigned location. Hence a
|
|
#extension is needed to relax this error condition. And then this
|
|
extension's glBindFragDataLocationIndexedEXT must be used to assign
|
|
locations as necessary.
|
|
|
|
7. Can the indexed location be assigned explicitly in the shader?
|
|
|
|
RESOLVED: Yes, for ES 3.x shaders where the GLSL ES 3.x supports
|
|
layout qualifiers. ES 2.0 does not support the layout qualifier or
|
|
user-defined fragment outputs.
|
|
|
|
8. Should both the layout qualifier mechanism and the
|
|
glBindFragDataLocationIndexed-style API for specifying the index of
|
|
a user-defined fragment shader output be supported?
|
|
|
|
RESOLVED: Yes, both should be supported. This makes it easier
|
|
for existing applications to port to ES 3.0 as both mechanisms are
|
|
available.
|
|
|
|
FYI: The "layout(location=0,index=1)" type syntax for dual-source
|
|
blending was introduced to OpenGL in GLSL 3.30 and 4.00 in
|
|
conjunction with OpenGL 3.3 and 4.0 respectively. The original
|
|
ARB_blend_func_extended was written with respect to OpenGL 3.2 and
|
|
intended to support dual-source blending without the need to extend
|
|
the GLSL language by instead supporting assignment if the fragment
|
|
output index via glBindFragDataLocationIndexed.
|
|
|
|
9. How to support OpenGL ES 2.0 where user-defined fragment shader
|
|
outputs are not supported?
|
|
|
|
RESOLVED: Introduce new gl_SecondaryFragColorEXT and
|
|
gl_SecondaryFragDataEXT built-in variables for specifying the second
|
|
source color.
|
|
|
|
These built-ins are only available in the ES 1.00 shader language
|
|
version.
|
|
|
|
It is important to provide an ES 2.0 mechanism because WebGL 1.0 is
|
|
based on ES 2.0. Chrome's internal command buffer mechanism is also
|
|
based around ES 2.0 and Skia intends to use this extension.
|
|
|
|
This includes adding a gl_MaxDualSourceDrawBuffersEXT
|
|
implementation-dependent constant.
|
|
|
|
10. Does the version 100 syntax (gl_SecondaryFragColorEXT,
|
|
gl_SecondaryFragDataEXT) work in an ES 3.0 context?
|
|
|
|
RESOLVED: Yes. For compatibility reasons, an ES 3.0 context
|
|
advertising EXT_blend_func_extended must support the built-ins for
|
|
the fragment shader secondary color outputs.
|
|
|
|
11. How many elements should be in the gl_SecondaryFragDataEXT array?
|
|
|
|
RESOLVED: The gl_SecondaryFragDataEXT array should have as
|
|
many elements as the GLSL built-in implementation constant
|
|
gl_MaxDualSourceDrawBuffersEXT which should be the value of the
|
|
context's GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT implementation-dependent
|
|
constant.
|
|
|
|
This means the number of elements in gl_SecondaryFragDataEXT is
|
|
different than the number of gl_FragData elements.
|
|
|
|
12. What precision should the gl_SecondaryFragColorEXT and
|
|
gl_SecondaryFragDataEXT be?
|
|
|
|
RESOLVED: mediump. This is consistent with gl_FragColor and
|
|
gl_FragData.
|
|
|
|
13. Should gl_MaxDualSourceDrawBuffersEXT be exposed in both ES 2.0
|
|
(where it sizes the gl_SecondaryFragDataEXT array) and also 3.x
|
|
contexts (where there is no fixed-function array)?
|
|
|
|
RESOLVED: Implementation-wise, it is easiest to expose this
|
|
implementation-dependent constant for all ES contexts.
|
|
|
|
As a practical matter, we don't expect any implementations will
|
|
advertise any value other than 1 for this constant.
|
|
|
|
Note: There is no implementation-dependent GLSL constant comparable
|
|
to gl_MaxDualSourceDrawBuffersEXT in ARB_blend_func_extended
|
|
(or OpenGL 3.3/4.0 introducing the ARB_blend_func_extended
|
|
functionality).
|
|
|
|
14. Any more issues?
|
|
|
|
RESOLVED: See the issues in the ARB_blend_func_extended
|
|
specification. This extension resolves those issues to match the
|
|
ARB extension version.
|
|
|
|
Revision History
|
|
|
|
Rev. Date Author Changes
|
|
---- -------- --------- -----------------------------------------
|
|
1 05/22/15 mjk Initial revision.
|
|
2 07/06/15 mjk Proper ES 2.0 interactions; complete.
|
|
3 07/08/15 mjk Feedback from Brian
|
|
4 07/08/15 mjk Feedback from Daniel
|
|
5 07/29/15 mjk ES 3.x contexts (as well as 2.0) expose
|
|
gl_MaxDualSourceDrawBuffersEXT
|