AE效果器(Effect)開發

效果器基礎(Effect Basics)


入口函數(ENTRY POINT)


PF_Err main(
    PF_Cmd cmd,
    PF_InData *in_data,
    PF_OutData *out_data,
    PF_ParamDef *params[],
    PF_LayerDef *output,
    void *extra)

入口函數的名稱在PiPL resource文件中定義,這裏是main,默認例程中是EntryPointFunc

在每次調用之前,AE會傳送PF_InData和參數數組PF_ParamDef[]給入口函數。插件在回調過程返回之前,AE會檢查PF_OutData有沒有變化,如果有的話,通過PF_LayerDef來渲染該效果。

參數 用途
cmd AE通過設置command selector來指導插件的行爲
in_data 包含了應用的狀態和插件被告知要要處理的數據。同時提供了大量接口和圖像處理函數指針
out_data 通過設置in_data的值返回給AE相關信息
params in_data中給出的時間>current_time時插件的參數數組。params[0]代表效果器應用的圖片(PF_EffectWorld)。這些值僅僅在一些特定的選擇器期間有效(參看selectors descriptions)。
output 輸出圖像,由產檢渲染並返回給AE。僅僅在某些特定的選擇器期間有效
extra extra參數隨着發送的指令或者(PF_Cmd_EVENT的情況)事件類型(event type)而改變。主要用來事件管理(event management)和參數監視(parameter supervision

指令選擇器(Command Selectors)


AE通過指令告訴效果器(effect)該做什麼。一些選擇器要求有返回,大多數的是可選的,儘管這樣添加進它們卻是有原因的…

每發送一個選擇器命令,效果器接收到來自AE的PF_InData中的信息,PF_ParamDef[]中的輸入和參數數組,和訪問回調函數和封裝函數(suite)的權限。然後通過PF_OutData返回信息給AE,並且渲染輸出到PF_LayerDef(又稱PF_EffectWorld)。在這些事件期間,一些特別的時間信息通過extra接收。

調用序列(Calling Sequence)


只有最開式的一些指令選擇器是可以預知的,其它的調用序列通過用戶來指派。

當插件被初始化時,首先會接收PF_Cmd_GLOBAL_SETUP指令,然後是PF_Cmd_PARAM_SETUP。每次用戶添加一個效果器到一個圖層是,就會發出一個PF_Cmd_SEQUENCE_SETUP指令。

對於每一個由基礎的非SmartFX效果器渲染的幀來說,AE都會發送一個PF_Cmd_FRAME_SETUP指令,然後是PF_Cmd_RENDER,最後是PF_Cmd_FRAME_SETDOWN。所有的效果器插件都必須迴應PF_Cmd_RENDER指令。

對於SmartFXPF_Cmd_SMART_PRE_RENDER都可能在一個PF_Cmd_SMART_RENDER被髮送前發送任意次。

PF_Cmd_SEQUECE_SETDOWN在用戶移除效果器或者關掉當前項目,退出插件的時候被髮送。PF_Cmd_SEQUENCE_RESETUP在項目加載或者當前圖層改變時被髮送。PF_Cmd_SEQUENCE_FLATTEN在AE項目被寫入磁盤時被髮送。

當用戶從Effect Controls Window(ECW)中選擇About時PF_Cmd_ABOUT`被髮送…

當AE關閉,或者最後一個效果器的實例被移除時PF_Cmd_GLOBAL_SETDOWN被髮送。不要用該信息來判斷插件是否從存儲器中移除,而應該使用系統特定的入口函數。

選擇器(selector 作用
全局選擇器:所有的插件都必須迴應這些指令
PF_Cmd_ABOUT 顯示一個描述插件的對話框。如果填充信息out_data>return_msg,AE將會在一個模態對話框顯示該信息。在該對話框中包含你的插件版本信息。Mac系統上,當前的資源文件會在該命令期間配置到效果器模型上。
PF_Cmd_GLOBAL_SETUP 設置任意需要的標誌位和PF_OutData字段(包括Out_data>my_version)來描述你的插件的行爲
PF_Cmd_GLOBAL)SETUDOWN 釋放所有的全局數據(在你需要釋放的時候被觸發)
PF_Cmd_PARAM_SETUP 通過PF_ADD_PARMA來描述和註冊你的參數。同時註冊用戶自定義的接口元素。設置PF_OutData>參數的數目以匹配參數數目
序列選擇器:控制序列的數據操作
PF_Cmd_SEQUENCE_SETUP 釋放並初始化任意特定的序列數據。當效果器首次使用時觸發。PF_InData在此時得到初始化
PF_Cmd_SEQUENCE_RESETUP 重新創建序列數據。在合成前,當序列數據從磁盤被讀取或者效果被複制時觸發,AE會在複製前校徽序列數據。在複製期間,PF_Cmd_SEQUENCE_RESETUP同時發送給新舊序列。在PF_Cmd_SEQUENCE_RESETUP命令之間不會有PF_Cmd_SEQUENCE_FLATTEN命令
PF_Cmd_SEQUENCE_FLATTEN 當存儲和複製序列時觸發。扁平化包含指針或者句柄的序列以便能夠寫入磁盤。這過程江河項目文件一起保存。釋放未扁平化的數據並設置out_data>sequence_data指向新的扁平化數據。必須要正確的按照字節順序亞平數據以便存儲。
PF_Cmd_SEQUENCE_SETDOWN 釋放所有的序列數據
幀選擇器:傳遞給每一個待插件渲染的幀
PF_Cmd_FRAME_SETUP 釋放任意的特定幀數據。考慮到一些特定幀配置的數據,在每幀數據被渲染的時候被立即發送。

注意


PF_Cmd_USER_CHANGED_PARAMPF_Cmd_UPDATE_PARAMS_UI之間有着很細微的區別。effect需要用戶真正的改變了一個參數值(PF_Cmd_USER_CHANGED_PARAM)還是僅僅在時間軸上擦除(PF_Cmd_UPDATE_PARAMS_UI)。

PF_InData


AE通過PF_InData傳遞系統、項目、圖層和音頻信息。這個結構體在每個指令發送給插件之前更新。注意只有在一些特定的PF_Cmds下字段纔是合法的。PF_InData非常大,你不用記住每個成員的作用。有些字段偶爾纔會用到。

PF_OutData


你的插件通過PF_OutData傳遞更改給AE。需要注意的是改變這些字段的合法時間。

PF_OutFlags


這些標誌位傳遞了容量和狀態信息給AE。之前的版本中他們是也被用來發送一些基本信息,比如刷新UI,發送錯誤信息。後來這些功能被function suite(函數套?)取代了,所有新的message function都將是這種格式。然而,容量標誌爲仍然包含在PiPL文件中。當你做出了一個更改時,需要同時更新PiPL和源文件。在一個AE活動期間,這些標誌位都可能改變。

PF_OutFlags2


我們在AE 5.0中加入了第二套outflags,部分原因是爲了將來擴展空間,部分是爲了阻止我們重定義現有標誌位作用的壞習慣。至於PF_OutFlags,這些標誌位中的許多都可能在一個AE活動期間改變。別忘了在做出更改的時候同時更新PiPL和源文件。

Parameters


Parameters是隨時間變化的數據流,包括有源圖像,滑塊,角度,點,顏色,路徑等等任意用戶可操作的數據類型。他們都是作爲一個PF_ParamDef類型的數組傳遞的,儘管這些數組中的值僅僅在一些特定的選擇器下有效。

AE effect API最棒的一個方面是它的參數插值和管理方面。快門角度在四分之一的29.97fps幀速下應該變化多少?這不是你應該關心的,把它留給AE來處理吧。

PF_Cmd_PARAMS_SETUP期間描述你插件的參數,使用PF_ADD_PARAM()。你最多可以使用非常大數量的參數,或者在使用時留給用戶去篩選。理智的選擇。

爲了比避免不必要的問題在使用AEFX_CLR_STRUCT(在AE_Macros.h中定義)註冊PF_ParamDef前應先清理它們。

PF_ParamDef


AE通過每個命令選擇器傳遞給effect一個PF_ParamDef類型的數組,該數組描述了插件當前時間的各項參數。這個參數數組中的值僅僅在某些命令中有效(詳見selector description)。

Param ZERO


PF_ParamDef的第一個參數,params[0]表示輸入圖像(一個PF_EffectWorld數據結構),即effect作用對象。

Parameter UI Flags


這些標誌位用來控制一個參數的用戶接口。不要把UI標誌位和行爲標誌位弄混淆了,根據你的參數定義它們存在於不同的字段域中,如果濫用會造成不可預知的後果。

Parameter Flags


行爲標誌位和UI標誌位表述了不同特性的參數。PF_Cmd_PARAM_SETUP指令期間,在添加該參數前應該先設置好它們。能夠被設置的標誌位詳見文檔。

PF_ValueDisparityFlags


PF_ParamDefUnionPF_FloatSliderDefPF_FixedSliderDef中都有一個成員變量,PF_ValueDisparityFlags允許它們迴應用戶的像素值顯示設置(在info palette中設置)。如果設置好了這個,該參數的值將被顯示爲0-1,0-255,0-32768或者0.0-1.0,具體根據設置而變。你也可以設置第一位(PF_ValueDisparityFlag_PERCEN)來追加一個百分號到參數的顯示值上。

我們知道你可能永遠不會做這樣的事兒,但是如果你創建一個按百分比顯示的參數,不要誤導用戶在任何超出0-100之間操作。百分比表示100以內。

PF_EffectWorld/PF_LayerDef


AE使用PF_EffectWorld(又稱PF_LayerDef)來表示圖像。

Errors


main()函數總會必須返回一個PF_Err。插件必須把所有的錯誤傳遞給AE。除非你自己處理這些錯誤,不然你一定要把所有的錯誤(通過回調函數或者PICA suites)都傳遞給AE。注意返回的要是正確的錯誤代碼,並且要銷燬所有你已經釋放了的內存。

Rowbytes In PF_EffectWorlds


不要指望你能通過(width*sizeof(current_pixel_type)+4,或者其它任何方式,除了使用PF_EffectWorldrowbytes,得到下一條掃描線的位置。不要寫超出PF_EffectWorld標定的區域之外,這種行爲可能破壞不屬於你操作的圖像緩存區。

爲了測試你的effects是否符合PF_EffectWorld>rowbytes,在你的effect應用之後再應用Grow Boundseffect。輸出緩存將有比輸入更大的rowbytes(儘管它們擁有同樣的邏輯大小)。

Byte Alignment


不能保證PF_EffectWorld中的像素是16位對齊的。一個effect可能得到一個更大的PF_EffectWorld的子區域。

Deeper Color


除了8位單通道色彩,AE還支持16位和32位浮點單通道色彩。effect永遠不會接受帶有不同比特深度的輸入和輸出,並且也不接受超出它們規定能夠處理的更高比特深度的輸入輸出。

Effect Details(效果器細節)


AE function suites(使用AE函數套件)


Memory allocation(內存分配)


Image buffer management functions(圖像存儲管理函數)


Iteration suites(迭代套件)


Graphic utility suites(圖形工具套件)


Interaction callback functions(交互回調函數)


Pixel aspect ratio(像素寬高比)


Parameters and floating point values(參數和浮點值)


Parameter supervision(參數管理)


Global, sequence, and frame data(全局,序列和幀數據)


Arbitrary data parameters(任意數據參數)


Useful utility functions(有用的工具函數)


Motion blur(運動模糊)


Working with paths(使用路徑)


Accessing camera and light information(訪問相機和光照信息)


Color space conversion(色彩空間轉換)


Changing parameter orders, the nice way(改變參數順序)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章