效果器基礎(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
指令。
對於SmartFX
,PF_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_PARAM
和PF_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_ParamDefUnion
、PF_FloatSliderDef
和PF_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_EffectWorld
的rowbytes
,得到下一條掃描線的位置。不要寫超出PF_EffectWorld
標定的區域之外,這種行爲可能破壞不屬於你操作的圖像緩存區。
爲了測試你的effects是否符合PF_EffectWorld>rowbytes
,在你的effect應用之後再應用Grow Bounds
effect。輸出緩存將有比輸入更大的rowbytes
(儘管它們擁有同樣的邏輯大小)。
Byte Alignment
不能保證PF_EffectWorld
中的像素是16位對齊的。一個effect可能得到一個更大的PF_EffectWorld
的子區域。
Deeper Color
除了8位單通道色彩,AE還支持16位和32位浮點單通道色彩。effect永遠不會接受帶有不同比特深度的輸入和輸出,並且也不接受超出它們規定能夠處理的更高比特深度的輸入輸出。