Logical Operation: Difference between revisions
Pipeline page link. |
Ghostcore07 (talk | contribs) No edit summary |
||
(6 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
{{pipeline float}} | {{pipeline float}} | ||
A '''Logical Operation''' is a | A '''Logical Operation''' is a [[Per-Sample Processing]] operation applied between the [[Fragment]]'s color values and color values in the [[Framebuffer]] being rendered to that correspond to that particular fragment color. Logical operations are boolean operations performed on the bit pattern that represents the colors. | ||
__TOC__ | |||
{{ | == Activation == | ||
To activate logical operations, {{enum|GL_COLOR_LOGIC_OP}} must be enabled. Whenever logical operations are enabled, all [[Blending]] operations are disabled. | |||
Because logical operations are bitwise boolean operations, there are some times when such operations are not appropriate. These are defined by attributes of the image attached to the framebuffer that [[Framebuffer Draw Buffer|corresponds to that fragment color]]. When logical operations are enabled, logical operations will only take place for a specific color buffer if all of the following are true: | |||
* The framebuffer image uses an integer [[Image Format]] ([[Normalized Integer|normalized]] or not). | |||
* [[Framebuffer Colorspace|sRGB rendering is disabled]], or if it is enabled, the framebuffer image's image format is not [[SRGB Image Format|in the sRGB colorspace]]. | |||
If either of these conditions fail, then that particular color buffer will not have logical operations performed on it. Other buffers in the rendering operation may still pass these tests, and they will have logical operations performed on them. | |||
== Operations == | |||
There are a number of different logical operations available. Note that, unlike [[Blending]], OpenGL logical operations cannot perform separate operations for different fragment colors. All fragment colors (except for those which can't use logic ops, as above) will use the same operation. | |||
The particular operation to use is set by the following function: | |||
{{funcdef|void {{apifunc|glLogicOp}}(GLenum {{param|opcode}});}} | |||
The {{param|opcode}} defines which operation to use (the default value is {{enum|GL_COPY}}. The available logic ops, and their result, is listed in the following table. Logic ops are performed individually per-component. | |||
The component value for the fragment color is called '''S'''; the component value from the framebuffer image is called '''D'''. "&" is a [https://en.wikipedia.org/wiki/Bitwise_operation#AND bitwise and], "|" is a [https://en.wikipedia.org/wiki/Bitwise_operation#OR bitwise or], "^" is the [https://en.wikipedia.org/wiki/Bitwise_operation#XOR bitwise xor], and ~ is the [https://en.wikipedia.org/wiki/Bitwise_operation#NOT bitwise negation]. | |||
{| | |||
|- | |||
! '''Opcode''' | |||
! '''Resulting Operation''' | |||
|- | |||
| {{enum|GL_CLEAR}} | |||
| 0 | |||
|- | |||
| {{enum|GL_SET}} | |||
| 1 | |||
|- | |||
| {{enum|GL_COPY}} | |||
| '''S''' | |||
|- | |||
| {{enum|GL_COPY_INVERTED}} | |||
| ~'''S''' | |||
|- | |||
| {{enum|GL_NOOP}} | |||
| '''D''' | |||
|- | |||
| {{enum|GL_INVERT}} | |||
| ~'''D''' | |||
|- | |||
| {{enum|GL_AND}} | |||
| '''S''' & '''D''' | |||
|- | |||
| {{enum|GL_NAND}} | |||
| ~('''S''' & '''D''') | |||
|- | |||
| {{enum|GL_OR}} | |||
| '''S''' <nowiki>|</nowiki> '''D''' | |||
|- | |||
| {{enum|GL_NOR}} | |||
| ~('''S''' <nowiki>|</nowiki> '''D''') | |||
|- | |||
| {{enum|GL_XOR}} | |||
| '''S''' ^ '''D''' | |||
|- | |||
| {{enum|GL_EQUIV}} | |||
| ~('''S''' ^ '''D''') | |||
|- | |||
| {{enum|GL_AND_REVERSE}} | |||
| '''S''' & ~'''D''' | |||
|- | |||
| {{enum|GL_AND_INVERTED}} | |||
| ~'''S''' & '''D''' | |||
|- | |||
| {{enum|GL_OR_REVERSE}} | |||
| '''S''' <nowiki>|</nowiki> ~'''D''' | |||
|- | |||
| {{enum|GL_OR_INVERTED}} | |||
| ~'''S''' <nowiki>|</nowiki> '''D''' | |||
|} | |||
[[Category:Sample Writing]] | [[Category:Sample Writing]] |
Latest revision as of 19:20, 19 November 2022
A Logical Operation is a Per-Sample Processing operation applied between the Fragment's color values and color values in the Framebuffer being rendered to that correspond to that particular fragment color. Logical operations are boolean operations performed on the bit pattern that represents the colors.
Activation
To activate logical operations, GL_COLOR_LOGIC_OP must be enabled. Whenever logical operations are enabled, all Blending operations are disabled.
Because logical operations are bitwise boolean operations, there are some times when such operations are not appropriate. These are defined by attributes of the image attached to the framebuffer that corresponds to that fragment color. When logical operations are enabled, logical operations will only take place for a specific color buffer if all of the following are true:
- The framebuffer image uses an integer Image Format (normalized or not).
- sRGB rendering is disabled, or if it is enabled, the framebuffer image's image format is not in the sRGB colorspace.
If either of these conditions fail, then that particular color buffer will not have logical operations performed on it. Other buffers in the rendering operation may still pass these tests, and they will have logical operations performed on them.
Operations
There are a number of different logical operations available. Note that, unlike Blending, OpenGL logical operations cannot perform separate operations for different fragment colors. All fragment colors (except for those which can't use logic ops, as above) will use the same operation.
The particular operation to use is set by the following function:
The opcode defines which operation to use (the default value is GL_COPY. The available logic ops, and their result, is listed in the following table. Logic ops are performed individually per-component.
The component value for the fragment color is called S; the component value from the framebuffer image is called D. "&" is a bitwise and, "|" is a bitwise or, "^" is the bitwise xor, and ~ is the bitwise negation.
Opcode | Resulting Operation |
---|---|
GL_CLEAR | 0 |
GL_SET | 1 |
GL_COPY | S |
GL_COPY_INVERTED | ~S |
GL_NOOP | D |
GL_INVERT | ~D |
GL_AND | S & D |
GL_NAND | ~(S & D) |
GL_OR | S | D |
GL_NOR | ~(S | D) |
GL_XOR | S ^ D |
GL_EQUIV | ~(S ^ D) |
GL_AND_REVERSE | S & ~D |
GL_AND_INVERTED | ~S & D |
GL_OR_REVERSE | S | ~D |
GL_OR_INVERTED | ~S | D |