Blender V4.3
COM_SMAAOperation.cc File Reference
#include "BLI_math_vector.h"
#include "BLI_math_vector.hh"
#include "BLI_smaa_textures.h"
#include "BLI_span.hh"
#include "BLI_task.hh"
#include "IMB_colormanagement.hh"
#include "COM_MemoryBuffer.h"
#include "COM_SMAAOperation.h"

Go to the source code of this file.

Namespaces

namespace  blender
 
namespace  blender::compositor
 

Macros

#define SMAA_CUSTOM_SL
 
#define SMAA_AREATEX_SELECT(sample)   sample.xy()
 
#define SMAA_SEARCHTEX_SELECT(sample)   sample.x
 
#define SMAATexture2D(tex)   const MemoryBuffer *tex
 
#define SMAATexturePass2D(tex)   tex
 
#define SMAASampleLevelZero(tex, coord)   tex->texture_bilinear_extend(coord)
 
#define SMAASampleLevelZeroPoint(tex, coord)   tex->texture_bilinear_extend(coord)
 
#define SMAASampleLevelZeroOffset(tex, coord, offset, size)    tex->texture_bilinear_extend(coord + float2(offset) / float2(size))
 
#define SMAASample(tex, coord)   tex->texture_bilinear_extend(coord)
 
#define SMAASamplePoint(tex, coord)   tex->texture_nearest_extend(coord)
 
#define SMAASamplePointOffset(tex, coord, offset, size)    tex->texture_nearest_extend(coord + float2(offset) / float2(size))
 
#define SMAASampleOffset(tex, coord, offset, size)    tex->texture_bilinear_extend(coord + float2(offset) / float2(size))
 
#define SMAA_FLATTEN
 
#define SMAA_BRANCH
 
#define lerp(a, b, t)   math::interpolate(a, b, t)
 
#define saturate(a)   math::clamp(a, 0.0f, 1.0f)
 
#define mad(a, b, c)   (a * b + c)
 
#define SMAA_THRESHOLD   0.1f
 
#define SMAA_DEPTH_THRESHOLD   (0.1f * SMAA_THRESHOLD)
 
#define SMAA_MAX_SEARCH_STEPS   16
 
#define SMAA_MAX_SEARCH_STEPS_DIAG   8
 
#define SMAA_CORNER_ROUNDING   25
 
#define SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR   2.0f
 
#define SMAA_PREDICATION   0
 
#define SMAA_PREDICATION_THRESHOLD   0.01f
 
#define SMAA_PREDICATION_SCALE   2.0f
 
#define SMAA_PREDICATION_STRENGTH   0.4f
 
#define SMAA_REPROJECTION   0
 
#define SMAA_REPROJECTION_WEIGHT_SCALE   30.0f
 
#define SMAA_INCLUDE_VS   1
 
#define SMAA_INCLUDE_PS   1
 
#define SMAA_DECODE_VELOCITY(sample)   sample.rg
 
#define SMAA_AREATEX_MAX_DISTANCE   16
 
#define SMAA_AREATEX_MAX_DISTANCE_DIAG   20
 
#define SMAA_AREATEX_PIXEL_SIZE   (1.0f / float2(160.0f, 560.0f))
 
#define SMAA_AREATEX_SUBTEX_SIZE   (1.0f / 7.0f)
 
#define SMAA_SEARCHTEX_SIZE   float2(66.0f, 33.0f)
 
#define SMAA_SEARCHTEX_PACKED_SIZE   float2(64.0f, 16.0f)
 
#define SMAA_CORNER_ROUNDING_NORM   (float(SMAA_CORNER_ROUNDING) / 100.0f)
 

Functions

static void blender::compositor::SMAAMovc (float2 cond, float2 &variable, float2 value)
 
static void blender::compositor::SMAAMovc (float4 cond, float4 &variable, float4 value)
 
static void blender::compositor::SMAAEdgeDetectionVS (float2 texcoord, int2 size, float4 offset[3])
 
static void blender::compositor::SMAABlendingWeightCalculationVS (float2 texcoord, int2 size, float2 &pixcoord, float4 offset[3])
 
static void blender::compositor::SMAANeighborhoodBlendingVS (float2 texcoord, int2 size, float4 &offset)
 
static float2 blender::compositor::SMAALumaEdgeDetectionPS (float2 texcoord, float4 offset[3], SMAATexture2D(colorTex), float edge_threshold, float3 luminance_coefficients, float local_contrast_adaptation_factor)
 
static float2 blender::compositor::SMAADecodeDiagBilinearAccess (float2 e)
 
static float4 blender::compositor::SMAADecodeDiagBilinearAccess (float4 e)
 
static float2 blender::compositor::SMAASearchDiag1 (SMAATexture2D(edgesTex), float2 texcoord, float2 dir, int2 size, float2 &e)
 
static float2 blender::compositor::SMAASearchDiag2 (SMAATexture2D(edgesTex), float2 texcoord, float2 dir, int2 size, float2 &e)
 
static float2 blender::compositor::SMAAAreaDiag (SMAATexture2D(areaTex), float2 dist, float2 e, float offset)
 
static float2 blender::compositor::SMAACalculateDiagWeights (SMAATexture2D(edgesTex), SMAATexture2D(areaTex), float2 texcoord, float2 e, float4 subsampleIndices, int2 size)
 
static float blender::compositor::SMAASearchLength (SMAATexture2D(searchTex), float2 e, float offset)
 
static float blender::compositor::SMAASearchXLeft (SMAATexture2D(edgesTex), SMAATexture2D(searchTex), float2 texcoord, float end, int2 size)
 
static float blender::compositor::SMAASearchXRight (SMAATexture2D(edgesTex), SMAATexture2D(searchTex), float2 texcoord, float end, int2 size)
 
static float blender::compositor::SMAASearchYUp (SMAATexture2D(edgesTex), SMAATexture2D(searchTex), float2 texcoord, float end, int2 size)
 
static float blender::compositor::SMAASearchYDown (SMAATexture2D(edgesTex), SMAATexture2D(searchTex), float2 texcoord, float end, int2 size)
 
static float2 blender::compositor::SMAAArea (SMAATexture2D(areaTex), float2 dist, float e1, float e2, float offset)
 
static void blender::compositor::SMAADetectHorizontalCornerPattern (SMAATexture2D(edgesTex), float2 &weights, float4 texcoord, float2 d, int2 size, int corner_rounding)
 
static void blender::compositor::SMAADetectVerticalCornerPattern (SMAATexture2D(edgesTex), float2 &weights, float4 texcoord, float2 d, int2 size, int corner_rounding)
 
static float4 blender::compositor::SMAABlendingWeightCalculationPS (float2 texcoord, float2 pixcoord, float4 offset[3], MemoryBuffer *edgesTex, MemoryBuffer *areaTex, MemoryBuffer *searchTex, float4 subsampleIndices, int2 size, int corner_rounding)
 
static float4 blender::compositor::SMAANeighborhoodBlendingPS (float2 texcoord, float4 offset, SMAATexture2D(colorTex), SMAATexture2D(blendTex), int2 size)
 

Macro Definition Documentation

◆ lerp

◆ mad

◆ saturate

◆ SMAA_AREATEX_MAX_DISTANCE

#define SMAA_AREATEX_MAX_DISTANCE   16

Definition at line 532 of file COM_SMAAOperation.cc.

Referenced by blender::compositor::SMAAArea().

◆ SMAA_AREATEX_MAX_DISTANCE_DIAG

#define SMAA_AREATEX_MAX_DISTANCE_DIAG   20

Definition at line 533 of file COM_SMAAOperation.cc.

Referenced by blender::compositor::SMAAAreaDiag().

◆ SMAA_AREATEX_PIXEL_SIZE

#define SMAA_AREATEX_PIXEL_SIZE   (1.0f / float2(160.0f, 560.0f))

◆ SMAA_AREATEX_SELECT

#define SMAA_AREATEX_SELECT ( sample)    sample.xy()

◆ SMAA_AREATEX_SUBTEX_SIZE

#define SMAA_AREATEX_SUBTEX_SIZE   (1.0f / 7.0f)

◆ SMAA_BRANCH

◆ SMAA_CORNER_ROUNDING

#define SMAA_CORNER_ROUNDING   25

SMAA_CORNER_ROUNDING specifies how much sharp corners will be rounded.

Range: [0, 100]

Define SMAA_DISABLE_CORNER_DETECTION to disable corner processing.

Definition at line 407 of file COM_SMAAOperation.cc.

◆ SMAA_CORNER_ROUNDING_NORM

#define SMAA_CORNER_ROUNDING_NORM   (float(SMAA_CORNER_ROUNDING) / 100.0f)

Definition at line 538 of file COM_SMAAOperation.cc.

◆ SMAA_CUSTOM_SL

#define SMAA_CUSTOM_SL
             _______  ___  ___       ___           ___
            /       ||   \/   |     /   \         /   \
           |   (---- |  \  /  |    /  ^  \       /  ^  \
            \   \    |  |\/|  |   /  /_\  \     /  /_\  \
         ----)   |   |  |  |  |  /  _____  \   /  _____  \
        |_______/    |__|  |__| /__/     \__\ /__/     \__\

                          E N H A N C E D
  S U B P I X E L   M O R P H O L O G I C A L   A N T I A L I A S I N G

                    http://www.iryoku.com/smaa/

Hi, welcome aboard!

Here you'll find instructions to get the shader up and running as fast as possible.

IMPORTANTE NOTICE: when updating, remember to update both this file and the precomputed textures! They may change from version to version.

The shader has three passes, chained together as follows:

                      |input|------------------�
                         v                     |
               [ SMAA*EdgeDetection ]          |
                         v                     |
                     |edgesTex|                |
                         v                     |
         [ SMAABlendingWeightCalculation ]     |
                         v                     |
                     |blendTex|                |
                         v                     |
           [ SMAANeighborhoodBlending ] <------�
                         v
                      |output|

Note that each [pass] has its own vertex and pixel shader. Remember to use over-sized triangles instead of quads to avoid over-shading along the diagonal.

You've three edge detection methods to choose from: luma, color or depth. They represent different quality/performance and anti-aliasing/sharpness tradeoffs, so our recommendation is for you to choose the one that best suits your particular scenario:

  • Depth edge detection is usually the fastest but it may miss some edges.
  • Luma edge detection is usually more expensive than depth edge detection, but catches visible edges that depth edge detection can miss.
  • Color edge detection is usually the most expensive one but catches chroma-only edges.

For quick-starters: just use luma edge detection.

The general advice is to not rush the integration process and ensure each step is done correctly (don't try to integrate SMAA T2x with predicated edge detection from the start!). Ok then, let's go!

  1. The first step is to create two RGBA temporal render targets for holding |edgesTex| and |blendTex|.

    In DX10 or DX11, you can use a RG render target for the edges texture. In the case of NVIDIA GPUs, using RG render targets seems to actually be slower.

    On the Xbox 360, you can use the same render target for resolving both |edgesTex| and |blendTex|, as they aren't needed simultaneously.

  2. Both temporal render targets |edgesTex| and |blendTex| must be cleared each frame. Do not forget to clear the alpha channel!
  3. The next step is loading the two supporting precalculated textures, 'areaTex' and 'searchTex'. You'll find them in the 'Textures' folder as C++ headers, and also as regular DDS files. They'll be needed for the 'SMAABlendingWeightCalculation' pass.

    If you use the C++ headers, be sure to load them in the format specified inside of them.

    You can also compress 'areaTex' and 'searchTex' using BC5 and BC4 respectively, if you have that option in your content processor pipeline. When compressing then, you get a non-perceptible quality decrease, and a marginal performance increase.

  4. All samplers must be set to linear filtering and clamp.

    After you get the technique working, remember that 64-bit inputs have half-rate linear filtering on GCN.

    If SMAA is applied to 64-bit color buffers, switching to point filtering when accessing them will increase the performance. Search for 'SMAASamplePoint' to see which textures may benefit from point filtering, and where (which is basically the color input in the edge detection and resolve passes).

  5. All texture reads and buffer writes must be non-sRGB, with the exception of the input read and the output write in 'SMAANeighborhoodBlending' (and only in this pass!). If sRGB reads in this last pass are not possible, the technique will work anyway, but will perform anti-aliasing in gamma space.

    IMPORTANT: for best results the input read for the color/luma edge detection should NOT be sRGB.

  6. Before including SMAA.h you'll have to setup the render target metrics, the target and any optional configuration defines. Optionally you can use a preset.

    You have the following targets available: SMAA_HLSL_3 SMAA_HLSL_4 SMAA_HLSL_4_1 SMAA_GLSL_3 * SMAA_GLSL_4 *

    • (See SMAA_INCLUDE_VS and SMAA_INCLUDE_PS below).

    And four presets: SMAA_PRESET_LOW (%60 of the quality) SMAA_PRESET_MEDIUM (%80 of the quality) SMAA_PRESET_HIGH (%95 of the quality) SMAA_PRESET_ULTRA (%99 of the quality)

    For example: define SMAA_RT_METRICS float4(1.0 / 1280.0, 1.0 / 720.0, 1280.0, 720.0) define SMAA_HLSL_4 define SMAA_PRESET_HIGH #include "SMAA.h"

    Note that SMAA_RT_METRICS doesn't need to be a macro, it can be a uniform variable. The code is designed to minimize the impact of not using a constant value, but it is still better to hard-code it.

    Depending on how you encoded 'areaTex' and 'searchTex', you may have to add (and customize) the following defines before including SMAA.h: define SMAA_AREATEX_SELECT(sample) sample.rg define SMAA_SEARCHTEX_SELECT(sample) sample.r

    If your engine is already using porting macros, you can define SMAA_CUSTOM_SL, and define the porting functions by yourself.

  7. Then, you'll have to setup the passes as indicated in the scheme above. You can take a look into SMAA.fx, to see how we did it for our demo. Checkout the function wrappers, you may want to copy-paste them!
  8. It's recommended to validate the produced |edgesTex| and |blendTex|. You can use a screenshot from your engine to compare the |edgesTex| and |blendTex| produced inside of the engine with the results obtained with the reference demo.
  9. After you get the last pass to work, it's time to optimize. You'll have to initialize a stencil buffer in the first pass (discard is already in the code), then mask execution by using it the second pass. The last pass should be executed in all pixels.

After this point you can choose to enable predicated thresholding, temporal supersampling and motion blur integration:

a) If you want to use predicated thresholding, take a look into SMAA_PREDICATION; you'll need to pass an extra texture in the edge detection pass.

b) If you want to enable temporal supersampling (SMAA T2x):

  1. The first step is to render using sub-pixel jitters. I won't go into detail, but it's as simple as moving each vertex position in the vertex shader, you can check how we do it in our DX10 demo.
  2. Then, you must setup the temporal resolve. You may want to take a look into SMAAResolve for resolving 2x modes. After you get it working, you'll probably see ghosting everywhere. But fear not, you can enable the CryENGINE temporal reprojection by setting the SMAA_REPROJECTION macro. Check out SMAA_DECODE_VELOCITY if your velocity buffer is encoded.
  3. The next step is to apply SMAA to each sub-pixel jittered frame, just as done for 1x.
  4. At this point you should already have something usable, but for best results the proper area textures must be set depending on current jitter. For this, the parameter 'subsampleIndices' of 'SMAABlendingWeightCalculationPS' must be set as follows, for our T2x mode:

    @SUBSAMPLE_INDICES

    | S# | Camera Jitter | subsampleIndices | +-—+---------------—+------------------—+ | 0 | ( 0.25, -0.25) | float4(1, 1, 1, 0) | | 1 | (-0.25, 0.25) | float4(2, 2, 2, 0) |

    These jitter positions assume a bottom-to-top y axis. S# stands for the sample number.

More information about temporal supersampling here: http://iryoku.com/aacourse/downloads/13-Anti-Aliasing-Methods-in-CryENGINE-3.pdf

c) If you want to enable spatial multisampling (SMAA S2x):

  1. The scene must be rendered using MSAA 2x. The MSAA 2x buffer must be created with:

    • DX10: see below (*)
    • DX10.1: D3D10_STANDARD_MULTISAMPLE_PATTERN or
    • DX11: D3D11_STANDARD_MULTISAMPLE_PATTERN

    This allows to ensure that the subsample order matches the table in @SUBSAMPLE_INDICES.

    (*) In the case of DX10, we refer the reader to:

    • SMAA::detectMSAAOrder and
    • SMAA::msaaReorder

    These functions allow matching the standard multisample patterns by detecting the subsample order for a specific GPU, and reordering them appropriately.

  2. A shader must be run to output each subsample into a separate buffer (DX10 is required). You can use SMAASeparate for this purpose, or just do it in an existing pass (for example, in the tone mapping pass, which has the advantage of feeding tone mapped subsamples to SMAA, which will yield better results).
  3. The full SMAA 1x pipeline must be run for each separated buffer, storing the results in the final buffer. The second run should alpha blend with the existing final buffer using a blending factor of 0.5. 'subsampleIndices' must be adjusted as in the SMAA T2x case (see point b).

d) If you want to enable temporal supersampling on top of SMAA S2x (which actually is SMAA 4x):

  1. SMAA 4x consists on temporally jittering SMAA S2x, so the first step is to calculate SMAA S2x for current frame. In this case, 'subsampleIndices' must be set as follows:

    | F# | S# | Camera Jitter | Net Jitter | subsampleIndices | +-—+-—+-----------------—+----------------—+-------------------—+ | 0 | 0 | ( 0.125, 0.125) | ( 0.375, -0.125) | float4(5, 3, 1, 3) | | 0 | 1 | ( 0.125, 0.125) | (-0.125, 0.375) | float4(4, 6, 2, 3) | +-—+-—+-----------------—+----------------—+-------------------—+ | 1 | 2 | (-0.125, -0.125) | ( 0.125, -0.375) | float4(3, 5, 1, 4) | | 1 | 3 | (-0.125, -0.125) | (-0.375, 0.125) | float4(6, 4, 2, 4) |

    These jitter positions assume a bottom-to-top y axis. F# stands for the frame number. S# stands for the sample number.

  2. After calculating SMAA S2x for current frame (with the new subsample indices), previous frame must be reprojected as in SMAA T2x mode (see point b).

e) If motion blur is used, you may want to do the edge detection pass together with motion blur. This has two advantages:

  1. Pixels under heavy motion can be omitted from the edge detection process. For these pixels we can just store "no edge", as motion blur will take care of them.
  2. The center pixel tap is reused.

Note that in this case depth testing should be used instead of stenciling, as we have to write all the pixels in the motion blur pass.

That's it!

Definition at line 290 of file COM_SMAAOperation.cc.

◆ SMAA_DECODE_VELOCITY

#define SMAA_DECODE_VELOCITY ( sample)    sample.rg

◆ SMAA_DEPTH_THRESHOLD

#define SMAA_DEPTH_THRESHOLD   (0.1f * SMAA_THRESHOLD)

SMAA_DEPTH_THRESHOLD specifies the threshold for depth edge detection.

Range: depends on the depth range of the scene.

Definition at line 366 of file COM_SMAAOperation.cc.

◆ SMAA_FLATTEN

#define SMAA_FLATTEN

Definition at line 305 of file COM_SMAAOperation.cc.

◆ SMAA_INCLUDE_PS

#define SMAA_INCLUDE_PS   1

Definition at line 507 of file COM_SMAAOperation.cc.

◆ SMAA_INCLUDE_VS

#define SMAA_INCLUDE_VS   1

On some compilers, discard cannot be used in vertex shaders. Thus, they need to be compiled separately.

Definition at line 504 of file COM_SMAAOperation.cc.

◆ SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR

#define SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR   2.0f

If there is an neighbor edge that has SMAA_LOCAL_CONTRAST_FACTOR times bigger contrast than current edge, current edge will be discarded.

This allows to eliminate spurious crossing edges, and is based on the fact that, if there is too much contrast in a direction, that will hide perceptually contrast in the other neighbors.

Definition at line 419 of file COM_SMAAOperation.cc.

◆ SMAA_MAX_SEARCH_STEPS

#define SMAA_MAX_SEARCH_STEPS   16

SMAA_MAX_SEARCH_STEPS specifies the maximum steps performed in the horizontal/vertical pattern searches, at each side of the pixel.

In number of pixels, it's actually the double. So the maximum line length perfectly handled by, for example 16, is 64 (by perfectly, we meant that longer lines won't look as good, but still anti-aliased).

Range: [0, 112]

Definition at line 380 of file COM_SMAAOperation.cc.

Referenced by blender::compositor::SMAAOperation::get_area_of_interest(), and blender::compositor::SMAABlendingWeightCalculationVS().

◆ SMAA_MAX_SEARCH_STEPS_DIAG

#define SMAA_MAX_SEARCH_STEPS_DIAG   8

SMAA_MAX_SEARCH_STEPS_DIAG specifies the maximum steps performed in the diagonal pattern searches, at each side of the pixel. In this case we jump one pixel at time, instead of two.

Range: [0, 20]

On high-end machines it is cheap (between a 0.8x and 0.9x slower for 16 steps), but it can have a significant impact on older machines.

Define SMAA_DISABLE_DIAG_DETECTION to disable diagonal processing.

Definition at line 396 of file COM_SMAAOperation.cc.

Referenced by blender::compositor::SMAAOperation::get_area_of_interest(), blender::compositor::SMAASearchDiag1(), and blender::compositor::SMAASearchDiag2().

◆ SMAA_PREDICATION

#define SMAA_PREDICATION   0

Predicated thresholding allows to better preserve texture details and to improve performance, by decreasing the number of detected edges using an additional buffer like the light accumulation buffer, object ids or even the depth buffer (the depth buffer usage may be limited to indoor or short range scenes).

It locally decreases the luma or color threshold if an edge is found in an additional buffer (so the global threshold can be higher).

This method was developed by Playstation EDGE MLAA team, and used in Killzone 3, by using the light accumulation buffer. More information here: http://iryoku.com/aacourse/downloads/06-MLAA-on-PS3.pptx

Definition at line 437 of file COM_SMAAOperation.cc.

◆ SMAA_PREDICATION_SCALE

#define SMAA_PREDICATION_SCALE   2.0f

How much to scale the global threshold used for luma or color edge detection when using predication.

Range: [1, 5]

Definition at line 457 of file COM_SMAAOperation.cc.

◆ SMAA_PREDICATION_STRENGTH

#define SMAA_PREDICATION_STRENGTH   0.4f

How much to locally decrease the threshold.

Range: [0, 1]

Definition at line 466 of file COM_SMAAOperation.cc.

◆ SMAA_PREDICATION_THRESHOLD

#define SMAA_PREDICATION_THRESHOLD   0.01f

Threshold to be used in the additional predication buffer.

Range: depends on the input, so you'll have to find the magic number that works for you.

Definition at line 447 of file COM_SMAAOperation.cc.

◆ SMAA_REPROJECTION

#define SMAA_REPROJECTION   0

Temporal reprojection allows to remove ghosting artifacts when using temporal supersampling. We use the CryEngine 3 method which also introduces velocity weighting. This feature is of extreme importance for totally removing ghosting. More information here: http://iryoku.com/aacourse/downloads/13-Anti-Aliasing-Methods-in-CryENGINE-3.pdf

Note that you'll need to setup a velocity buffer for enabling reprojection. For static geometry, saving the previous depth buffer is a viable alternative.

Definition at line 481 of file COM_SMAAOperation.cc.

◆ SMAA_REPROJECTION_WEIGHT_SCALE

#define SMAA_REPROJECTION_WEIGHT_SCALE   30.0f

SMAA_REPROJECTION_WEIGHT_SCALE controls the velocity weighting. It allows to remove ghosting trails behind the moving object, which are not removed by just using reprojection. Using low values will exhibit ghosting, while using high values will disable temporal supersampling under motion.

Behind the scenes, velocity weighting removes temporal supersampling when the velocity of the subsamples differs (meaning they are different objects).

Range: [0, 80]

Definition at line 496 of file COM_SMAAOperation.cc.

◆ SMAA_SEARCHTEX_PACKED_SIZE

#define SMAA_SEARCHTEX_PACKED_SIZE   float2(64.0f, 16.0f)

Definition at line 537 of file COM_SMAAOperation.cc.

Referenced by blender::compositor::SMAASearchLength().

◆ SMAA_SEARCHTEX_SELECT

#define SMAA_SEARCHTEX_SELECT ( sample)    sample.x

Definition at line 292 of file COM_SMAAOperation.cc.

Referenced by blender::compositor::SMAASearchLength().

◆ SMAA_SEARCHTEX_SIZE

#define SMAA_SEARCHTEX_SIZE   float2(66.0f, 33.0f)

Definition at line 536 of file COM_SMAAOperation.cc.

Referenced by blender::compositor::SMAASearchLength().

◆ SMAA_THRESHOLD

#define SMAA_THRESHOLD   0.1f

Note that if you use one of these presets, the following configuration macros will be ignored if set in the "Configurable Defines" section. SMAA_THRESHOLD specifies the threshold or sensitivity to edges. Lowering this value you will be able to detect more edges at the expense of performance.

Range: [0, 0.5] 0.1 is a reasonable value, and allows to catch most visible edges. 0.05 is a rather overkill value, that allows to catch 'em all.

If temporal supersampling is used, 0.2 could be a reasonable value, as low contrast edges are properly filtered by just 2x.

Definition at line 357 of file COM_SMAAOperation.cc.

◆ SMAASample

#define SMAASample ( tex,
coord )   tex->texture_bilinear_extend(coord)

◆ SMAASampleLevelZero

◆ SMAASampleLevelZeroOffset

◆ SMAASampleLevelZeroPoint

#define SMAASampleLevelZeroPoint ( tex,
coord )   tex->texture_bilinear_extend(coord)

Definition at line 296 of file COM_SMAAOperation.cc.

◆ SMAASampleOffset

#define SMAASampleOffset ( tex,
coord,
offset,
size )    tex->texture_bilinear_extend(coord + float2(offset) / float2(size))

Definition at line 303 of file COM_SMAAOperation.cc.

◆ SMAASamplePoint

#define SMAASamplePoint ( tex,
coord )   tex->texture_nearest_extend(coord)

◆ SMAASamplePointOffset

#define SMAASamplePointOffset ( tex,
coord,
offset,
size )    tex->texture_nearest_extend(coord + float2(offset) / float2(size))

Definition at line 301 of file COM_SMAAOperation.cc.

Referenced by blender::compositor::SMAACalculateDiagWeights().

◆ SMAATexture2D

#define SMAATexture2D ( tex)    const MemoryBuffer *tex

Definition at line 293 of file COM_SMAAOperation.cc.

◆ SMAATexturePass2D