Skip to main content
Participant
September 24, 2026
Question

SmartFX: complete Full-resolution upstream input during reduced preview, including negative-origin text and continuously rasterized AI

  • September 24, 2026
  • 5 replies
  • 35 views

We are developing a native SmartFX effect on macOS/Apple silicon, tested in AE 26.5x89. We need to analyze the current frame's upstream alpha at a consistent resolution while rendering Full/Half/Quarter previews. This is not a request for a historical frame or time-remapping support.

The effect derives content bounds and occupied cells from alpha. Reduced input can lose a faint detail and change the occupied-cell set, which then changes the timing of other visible cells. We can reproduce that in AE with a synthetic 32×8 PNG: two opaque 4×4 corner patches and one alpha=4/255 pixel. At Quarter, the faint feature disappears while the opaque patches remain. Input dimensions or a conservative bounding rectangle alone cannot supply the missing occupancy information.

Ordinary SmartFX checkout supplies the complete required extent in our text test, but PF_RenderRequest has no documented per-checkout resolution override. Our isolated diagnostic also tried this acquisition chain:

1. PFInterfaceSuite1.AEGP_GetNewEffectForEffect.
2. LayerRenderOptionsSuite2.AEGP_NewFromUpstreamOfEffect.
3. SetTime to the same native current time, SetDownsampleFactor(1,1), and SetWorldType matching the requested native depth.
4. RenderSuite5.AEGP_RenderAndCheckoutLayerFrame, then GetRenderedRegion and GetReceiptWorld; WorldSuite3.FillOutPFEffectWorld supplies pixel access.
5. Check in the frame and dispose the options and effect reference.

This worked for bounded raster fixtures. For negative-origin editable text at Full resolution, however, the observed regions and visible-pixel counts (alpha greater than 1/255) were:

Input route | Region | Visible pixels
Ordinary SmartFX | [-178,27,343,100] | 21,436
Auxiliary layer render | [0,27,343,100] | 13,598

The auxiliary result loses 7,838 visible pixels and remains clipped during Half requests. A direct continuously rasterized Illustrator fixture also showed a coverage discrepancy. These were serial diagnostic renders; we have not qualified the chain for MFR.

The supplied SDK 26.5 declarations were previously compared with 25.6: LayerRenderOptionsSuite2, RenderSuite5, PFInterfaceSuite1 and the relevant SmartFX request/callback structures were unchanged. Layer render options initialize the ROI to nominal layer bounds and expose no ROI setter. The item-render ROI setter takes a different handle type.

Could you clarify:

1. Is there a supported way for a SmartFX effect to obtain complete upstream RGBA, or equivalent bounds/occupancy information, at Full resolution during reduced previews, including expanded and negative-origin content?
2. Is the auxiliary clipping expected? Is there a supported ROI/coordinate correction, newer interface or known fix for text and CR Illustrator?
3. Which selectors and threading rules apply to the entire acquisition chain, including PFInterface handle acquisition during Smart Render and MFR? How should its dependencies be declared to the host?

We need to preserve upstream effects and normal one-layer use without changing the project during rendering. Guidance on a supported route would let us build a focused reproduction against that route.

    5 replies

    Participant
    September 25, 2026

    Hi Shachar, thanks for taking the time to help me with this.

    The low-alpha issue is about cell timing, not RGB values in fully transparent pixels. My effect divides the current upstream image into cells. At Full resolution, a pixel with alpha 4/255 makes one cell occupied. At Quarter resolution, that pixel disappears from the SmartFX checkout. The occupied-cell list then changes, which also changes the animation timing of other, fully visible cells.

    I need the same current-frame upstream alpha information when AE requests Full or Quarter, including effects before mine on the same layer. I am not trying to retrieve an earlier frame.

    I tried AEGP_NewFromUpstreamOfEffect with a Full-resolution render. For negative-origin editable text, ordinary SmartFX checkout at Full sees 21,436 visible pixels, but that auxiliary render sees only 13,598; it clips the negative-origin part.

    Is there a supported way to obtain the complete Full-resolution result immediately before my effect during a Quarter-resolution SmartFX render? If not, can you confirm that this is a limitation of the API, so I can make an informed design decision?

    Thanks again.

    Participant
    September 25, 2026

    Thanks a lot, Shachar, for taking the time to help. I think I failed to explain what the effect actually does, which made the technical question confusing.

    The effect receives the rendered RGBA image of its own layer and divides that image into a grid of rectangular cells. Each cell carries the pixels from its original part of the image and is animated independently.

    Before creating the animation schedule, the effect checks which grid cells contain at least one nonzero-alpha pixel. Only those occupied cells participate in the timing order. This means that if reduced-resolution sampling makes a faint feature disappear, one cell can be removed from the timing order and the timing of the other, fully opaque cells can change.

    I do not need the low-resolution output to contain every Full-resolution detail. I only need a separate Full-resolution image for this cell analysis. The actual preview can still be rendered at Half or Quarter resolution.

    During Smart Render, on the same layer that contains the effect, I tried:

    1. AEGP_NewFromUpstreamOfEffect
    2. AEGP_SetDownsampleFactor(1,1)
    3. AEGP_RenderAndCheckoutLayerFrame

    In a simple PNG test, I placed the native Fill effect immediately before my effect. Changing Fill from red to blue also changes the Full-resolution image returned by this auxiliary render. At Full, that image matches the ordinary SmartFX input. It also remains Full resolution when the main render is at Half.

    So this particular route does include the preceding Fill effect in my test. I have not yet proved the same thing for masks.

    The remaining problem is the image extent. For the same editable-text frame at Full:

    1. Normal SmartFX gives the region [-178,27,343,100].
    2. The auxiliary upstream render gives [0,27,343,100].
    3. The auxiliary image therefore loses the visible text at negative X coordinates.

    By “complete,” I mean the same upstream pixels and extent that normal SmartFX supplies immediately before the effect. I am not asking AE to recover pixels removed by a mask.

    The alpha example is also about nonzero alpha, not RGB beneath zero alpha. My 8bpc test image contains one pixel with alpha 4/255. With the effect disabled, that pixel is present in the Full export and absent in the Quarter export. That sampling difference is understandable. The problem is that analyzing the Quarter image removes one occupied cell and changes the animation timing of the opaque cells.

    So my precise questions are:

    1. Can the AEGP_NewFromUpstreamOfEffect route return the same complete extent as normal SmartFX, including negative-origin text?
    2. If so, how should that extent or ROI be requested?
    3. Is this render-and-checkout chain supported from Smart Render and under MFR?
    4. Should previous masks also be present in this upstream-of-effect image?

    Thanks again for your patience. Your replies are helping me determine whether I am using the API incorrectly or have reached a limitation of this rendering route.

    Community Expert
    September 24, 2026
    1. the only way to obtain full res images during downsampled render calls is exactly the way you did it. however, it will not return the result of upstream effects, but rather in source layer’s buffer. you can receive the source image at full res and uncropped at most. what else are you hoping to get? the source image can get cropped/expanded/offset by masks and effect on the same layer, but as mentioned, you can’t get the rendered image to inculde these processes using AEGP_RenderAndCheckoutLayerFrame, and the smart render layer chekcout which can, won’t give you any resolution other than the currently rendered downsample settings.

      as for the text layers getting cropped, when out of sight, that is actually the expected behavior. text layers are passed post transform as any “collapsed transformation” layer is. so when the text is out of the comp’s bounds, it’s not hidden, it just doesn’t exist, as if it were out of bounds in some internal comp. did i understant the situation correctly? if not, please elaborate.
       
    2. the aux layer (a layer selection param, if i understanf the setup correctly?) behaves in the same way is the input layer when checked via AEGP_RenderAndCheckoutLayerFrame. so you should expect the same behaviour as when checking the effect’s main input. is that not what you’re getting?
       
    3. mfr participance is declared in the effect’s outflags on global setup. after that, the effect just gets called to render at random times for random frames (i.e. not sequentially). there is no pre-process besides the pre-render call. from the plugin’s perspective, mfr and non-mfr renders look the same.

      the one difference is the sequence data handling, which may differ when telling AE an MFR plugin needs separate sequence data chunks for each rendering thread. but that is done separately of the render calls.
    Participant
    September 24, 2026

    Thanks — yes, that distinction is exactly what we are trying to establish.

    This is not a layer-selection parameter or another source layer. From inside KERFOOFLE on the same text layer, we obtain its PF_EffectWorld then create LayerRenderOptions with AEGP_NewFromUpstreamOfEffect(effectRef), specifically to request the render immediately before KERFOOFLE itself. The documentation says EffectsToRender is set to the effect index, so I understood that route to include preceding effects on the same layer.

    At Full, ordinary SmartFX checkout sees [-178,27,343,100] and all 21,436 visible pixels. The same-time AEGP_NewFromUpstreamOfEffect / 1×1 auxiliary request sees [0,27,343,100] and 13,598 pixels. So it is the auxiliary request — not ordinary SmartFX — that drops the negative-origin text. I agree text passed post-transform could explain why the auxiliary layer renderer clips it, but need to know whether that is expected for an upstream-of-effect request too, and whether there is any supported way to preserve the expanded pixels.

    The goal is full-resolution current upstream result needed for alpha-derived topology. If the AEGP route cannot include upstream effects, and SmartFX cannot set its requested downsample, then I agree there is no supported route. Can you confirm that this is the intended contract? That would mean a SmartFX effect cannot maintain alpha-derived cells/timing consistently between Full and Quarter when faint upstream alpha disappears at Quarter.

    Community Expert
    September 25, 2026

    i confess i do not fully understand your pipline…

    if i understand it correctly, you wish to:
    1. regardless of the current render’s downsample settings, always get full res images.
    2. the gotten images should include all effects and masks applied to the layers.
    3. the gotten images should be uncropped.
    4. preserve some low alpha pixles… (i’m not sure what you mean in regards to downsampling)

    if all of that is correct, then where is where these issues stand:
    1. you can get full res images at any time using AEGP_RenderAndCheckoutLayerFrame.
    2. you can not get previous effects and masks using AEGP_RenderAndCheckoutLayerFrame. it always getches the layer’s source image. furthermore, wanting uncropped images but still masked is kind of contradictory...
    3. you can get uncropped images, but collapsed layers (such as text) behave differently. they always behave as if they are the current comp size, and any content outside the bounds simply does not exist. effects and masks are applied to such layers post transform.
    4. downsampling shouldn’t affect low alpha pixels… the only thing i can think of is how the rgb values of completely transparent pixels is handled. is that what you’re after? the rgb values of 0 alpha pixels? becuase you can tell AE you want these values preserved, and AE will do it’s best to preserve the rgb values for you.