リンクをクリップボードにコピー
コピー完了
macOS 14 / Apple Silicon (M4 Pro), Xcode 16.3
After Effects 2025(Apple Siliconネイティブ)
プラグイン:SmartFX(PreRender/SmartRender, ROI対応, SequenceDataで中間結果キャッシュ)
目標:エッジ保持の絵画風(Kuwahara)。パラメータ:Radius / Sectors / Anisotropy / Softness / Mix
見た目が“筆致”ではなく全体が潰れたブラーになる
構造テンソル(Scharr/Sobel→テンソル平滑)で異方性を取り、Nセクタの平均・分散を計算→最小分散セクタを中心にsoftnessでブレンド、mixで元画像と合成、というオーソドックスな実装をしております
ところが、OpenMP導入・SmartFX最適化・パラメータや計算順序の調整を進める中で、輪郭保持が弱く、面全体が平滑化した“ただのブラー”っぽい絵になってしまいました。
上記を直している途中から、AEを起動し、本エフェクトを適応するとに**「Version mismatch: Code 1.0 / PiPL 0.2」**ダイアログが出るようになり、以降どうやっても消せなくなりました泣
DeRezで**インストール済みバンドルの .rsrc**を確認すると、
eVER=0x00010000(=1.0), ePVR=2,0, eGLO=0x0320, eGL2=0x0400 に揃っています。
それでもAEが**「PiPL 0.2」**を訴えてきます。
**PiPL.r(Rez)**は以下の値で固定:
AE_Effect_Version { 65536 } /* 1.0 */
AE_Effect_Global_OutFlags { 800 } /* 0x0320: DEEP_COLOR_AWARE | PIX_INDEPENDENT | USE_OUTPUT_EXTENT */
AE_Effect_Global_OutFlags_2 { 1024 } /* 0x0400: SUPPORTS_SMART_RENDER */
AE_Effect_Match_Name { "com.salis.ae.kuwaharafilter" } /* →検証のため v1001/v1003 に一時変更も試行 */
AE_PiPL_Version { 2, 0 }GlobalSetup() 側も一致:
out_data->my_version = PF_VERSION(1,0,0,0,0);
out_flags = 0x0320; out_flags2 = 0x0400;
エクスポート:extern "C" DllExport PF_Err EffectMain(...)。nm -gjU で_EffectMainと_PluginDataEntryFunction2の輸出確認済み。
codesign --deep --force 済み。
AEのキャッシュ(Plugin Loading Cache / Caches/After Effects/25.*)削除 → 再起動を複数回。
MatchName を一時的にユニーク化(.v1001/.v1003)し“新規エフェクト扱い”で読ませる→それでも PiPL 0.2 エラーが出ます。
過去にやってしまった 「Mach-O本体に Rez -o してPiPLを書いてしまう」誤操作は把握しており、その後
xattr -d com.apple.ResourceFork Contents/MacOS/SalisKuwaharaFilter でMach-Oのリソースフォークを除去→.rsrc一本化。
重複配置の掃除:mdfindで他所の.pluginを削除。
Additional Plug-ins Folder 設定の影響も疑い、オフ&該当先の掃除。
実際にAEが開いたパスの特定:lsof -p $(pgrep AE) + grep KuwaharaFilter.plugin でモニタ(※/Applications配下のみを参照している時でも発生)。
→ ここまでやっても、**起動時に「Code 1.0 / PiPL 0.2」**が出ます。
DeRezで見えている値(1.0/2.0)とAEのダイアログが一致しません。
パラメータは全て PF_ADD_FLOAT_SLIDERX(Percentではない)。取得時は 0–100 → 0–1 正規化。
8/16/32fのI/O正規化(8: 255, 16: 32768, 32f: 0–1)とクランプは実施。
SmartFX経路:PreRenderで result_rect/max_result_rect, SmartRenderで checkout_layer_pixels / checkout_output。ROI尊重。
SequenceDataで構造テンソルのキャッシュを持ち、半径・サイズが変わった時のみ再計算。
OpenMP:スキャンライン分割の素直な並列。パラメータ変更時に安全に再計算が走るようにしています。
テスト設定(例):Radius=8〜16, Sectors=4〜8, Anisotropy=0.5〜0.8, Softness=0.3〜0.6, Mix=100%
適当なフッテージを読み込み
タイムラインに配置したフッテージに本エフェクト適用
上記パラメータ帯でプレビュー(初期の値のままで大丈夫です。)
起動直後、「Effect ‘Salis Kuwahara Filter’ version mismatch. Code 1.0, PiPL 0.2」のダイアログが出ます。
# PiPL(.rsrc)確認 DeRez .../SalisKuwaharaFilter.rsrc -useDF -only PiPL => eVER=0x00010000, eGLO=0x0320, eGL2=0x0400, ePVR=2,0 # Mach-OのPiPLは削除済み(ResourceFork除去) DeRez .../Contents/MacOS/SalisKuwaharaFilter -useDF -only PiPL => (no PiPL in Mach-O) # エクスポート nm -gjU .../Contents/MacOS/SalisKuwaharaFilter | grep -E 'EffectMain|PluginDataEntryFunction2' => _EffectMain / _PluginDataEntryFunction2
PiPLの参照優先度とキャッシュ
AEはどの順序で PiPL を解決しますか?(Mach-OのRF → .rsrc → 何らかの内部キャッシュ…など)
MatchName を変えても古いPiPL(0.2)を参照してしまう要因はあり得ますか?
.rsrc と Mach-O RF が両方ある状況での既知の落とし穴は?(今回はRFを削除済み)
SmartFX + Kuwahara で“ブラーに寄る”原因はなんでしょうか、、、
ROI/padding 周り(境界条件)や rowbytes、16bpcのスケール(32768/32767)起因で分散が過少評価→平滑側に倒れる、等でしょうか
セクタ選択(最小分散)と softness のブレンドの安定化ノウハウ(ε追加、分散正規化など)があれば。
実運用のベストプラクティス
PiPLは**.rsrcだけ**に持たせる、で正しいでしょうか?(Mach-O RFは常に空であるべき?)
SmartFXのSequenceDataの寿命管理(キャッシュの無効化タイミング)や OpenMP の注意点(MFRとの相性)について、一般的な推奨があれば教えてください。。。
GitHub: https://github.com/op5no29/SalisKuwaharaFilter-AE/blob/main/KuwaharaCore/Process.cpp
(AEAdapter/EffectMain.cpp, AEAdapter/PiPL.r, KuwaharaCore/Process.cpp が中核)
KuwaharaFilterの実装に当たって参考にした記事
https://blog.maximeheckel.com/posts/on-crafting-painterly-shaders/
皆さまの知見をぜひお借りしたいです。どうぞよろしくお願いいたします。
リンクをクリップボードにコピー
コピー完了
“Code 1.0 / PiPL 0.2”のエラーが治らないのです、、、;;助けてください、、、
新しいアドビコミュニティで、さらに多くのインスピレーション、イベント、リソースを見つけましょう
今すぐ検索