レンダリングには、矩形、ライン、またはピクセルを単位とした 3 つの方法があります。 矩形単位での方法は、ほとんどのグラフィックス プログラマにとって最も自然でしょう。この方法には、出力ラスター バッファの矩形領域をレンダリングするコードを含んだ ufoProcessRenderRectangle ユーザ関数が使用されます。 ただし、ufoProcessRenderLine ユーザ関数または ufoProcessRenderPixel ユーザ関数が定義されている場合、デフォルトではマルチプロセッサ マシン用コードが Softimage コンポジッタによってパラレル化されます。 マルチプロセッサ マシン上で使用可能なプロセッサの数の関数として(ほぼ)線形にパフォーマンスが向上することを保証する最も簡単な方法は、後者 2 つの関数のどちらか 1 つを指定することです。
ufoProcessRenderLine 関数または ufoProcessRenderPixel 関数を指定する場合、関数をマルチプロセス セーフ(MP セーフ)にするかまたは自動マルチスレッドをオフにするように推奨します。 自動マルチスレッドを完全にオフにするには、UFO 定義関数の中で ufoSetMPSafe を一度だけ呼び出すか、MP アンセーフ パス全体に ufoSetMPSafe をレンダ パス ベースで呼び出します。
独自のマルチスレッドを処理する場合、アプリケーションのマルチスレッド ライブラリ、およびマルチスレッド用ユーティリティ関数のセットを使用することを推奨します。 ufoMPFork は、指定された関数引数を呼び出し側スレッドと並列して実行する、別途のスレッドを作成します。 ufoMPForkMyId は、0..n-1(n は並列実行されるスレッド数)の範囲にある整数を返します。ID が 0 のスレッドは、常にオリジナルの親スレッドになります。 ufoMPForkGetNumProcs は、並列実行されるスレッドの数を返します。
ここに挙げるのは ufoMPPotentialNumProcs です。この関数を使用すると、ufoMPFork の呼び出しにより作成される可能性のあるスレッドの最大数をクエリすることができます。 この潜在スレッドの最大数は、ホスト マシン上のプロセッサ数、使用スレッド数を制限するマルチプロセッシング ライセンス取得/アプリケーション コマンド ライン引数によって制限される可能性があります。
レンダリング方法によっては、入力と出力を複数回スキャンしなければならないものがあります。この場合、レンダリングを複数パスに分割することも可能です。 必要なパスの数を ufoProcessDefine または任意のユーザ関数で設定できます。その際、特定フレームにおいてレンダの第 1 パスの始まりの前に ufoProcessSetNumberRenderPasses を使用します。 ユーザ関数の内部に ufoProcessGetRenderPass を使用すると、現在のレンダ パスを問い合わせることができます。
また、ラインレンダリングを垂直方向に作用させ、複数パスメソッドを使用することもできます。ただし、そのためにはufoProcessSetRenderPassModeを使って特定パスを垂直スキャンする必要があります。
レンダリングが低速の場合、アプリケーションによって出力領域が小さな領域にスライスまたはタイルされることにより、ユーザ割り込み(たとえば、停止ボタンを押した場合など)のチェックが可能になります。 約 2 秒のバースト間隔でレンダリングが実行され、このバースト間隔でレンダリングを停止できるように、領域サイズが選択されます。 この領域サイズが、使用されているレンダリング アルゴリズムに適さない場合、ufoProcessSetTilingAllow を呼び出すことによってそうした不適合を防ぐことができます。
矩形レンダリングを完全に制御し、アプリケーションで自動的にレンダをスライスせずに、現在のレンダに対するユーザ割り込みをチェックしたい場合は、レンダリング コード内部で ufoProcessCheckAbort 関数を断続的に呼び出してください。 この関数が返した値が 1 の場合は、レンダをできる限り早く終了する必要があります。 この関数は表示目的に percentage_done 引数も取ります。 マルチスレッドを実行する場合、この関数を呼び出すには、レンダ関数の呼び出しに使用されたオリジナル スレッドを使用する必要があります。
編集時、同じフレームの後続レンダの入力ラスターが、直前のレンダ以降に変更されないことがよくあります。 これは、(一部の中間結果をキャッシュして、特定のパラメータを同一にするといったように)多くのレンダリング テクニックで利用できます。 入力ラスターの変更の有無を確認するには、入力ごとに ufoProcessIsInputDirty を ufoProcessResetRasterInDirty とともに呼び出します。
ufoProcessGetRenderMode は、レンダが単一フレームであるかそれともシーケンスであるか、またそれがインタラクティブ編集/プレビュー シーケンスの一部であるかそれとも完全にレンダリングされたシーケンスであるかを返します。 この関数は、編集/プレビューで用いられる加速メソッドを制御するフルレンダにおいて、パラメータを無視する場合に役立ちます。
現在のレンダ エフェクトの開始/終了フレーム リミットを返すには、ufoProcessGetMinEffectLimit 関数および ufoProcessGetMaxEffectLimit 関数を使用します。
ufoCheckInBackground 関数は、メイン アプリケーションが前景モード(インタラクティブ ユーザ インタフェースあり)または背景モード(ユーザ インタフェースなし)のどちらで実行されているかをチェックします。 これは、ライセンス取得の目的に役立つと考えられます。
ユーザ関数には 3 とおりがあり、指定されている場合はそれぞれフレームのシーケンス、フレーム、およびパスのレンダリング前後で呼び出されます。 これらは、よく使用されるデータのセットアップ、テンポラリ ラスターおよびメモリ バッファの割り当てや解放などに使用できます。 ufoProcessPreSequenceRender および ufoProcessPostSequenceRender は、レンダのシーケンスの端部で呼び出されます。 ufoProcessPreRender および ufoProcessPostRender は、フレームでのレンダリング前後で呼び出されます。 ufoProcessPreRenderPass および ufoProcessPostRenderPass は、フレームでのレンダリングの各パスの前後で呼び出されます。
また、ufoProcessCanAvoidRendering ユーザ関数を指定することができます。 このユーザ関数を使用すると、現在のパラメータ セットアップに影響がなければ UFO の処理が避けられるかどうかを判定できます。 このイベントでは、UFO の入力のどれか 1 つをその出力の代わりに使用することができます。 そのため、処理が避けられる場合、この関数が取るパラメータは、UFO の影響が及ばない入力インデックスに設定されます。 これは、かつて未使用の UFO 関数 ufoProcessHasNoEffect に代わるものです。
レンダ内部では、ユーザ関数および任意の事前/事後レンダ ユーザ関数のパラメータにアクセスして、それらのパラメータ値を取得できます。 ufoProcessGetParamValue/s を呼び出すと、パラメータの現在の値(1 つまたは複数)を取得できます。ufoProcessGetParamValueAtTime/s を呼び出すと、特定の時間におけるパラメータの値(1 つまたは複数)を取得できます(ufoProcessGetTime を使用すると、レンダリングの現在のフレーム時間を取得できます)。 これらの関数は倍精度浮動小数点値を返します。そのため、ufoBooleanParam 型、ufoEnumParam 型、および ufoIntegerParam 型のパラメータの場合、整数への変換が必要です。
パラメータが編集されたかどうかは、(一部のユーザ インタフェース イベントを介して)ufoProcessIsParamSet を呼び出すことによって判定できます。
ufoProcessParamsEdited 関数は、いずれかのパラメータをユーザが編集するたびに呼び出されます。 この関数によって、変更されたパラメータ用のパラメータ インデックスのリストが与えられます。 その場合、ユーザはさらにパラメータ値を変更することによって、編集に対処できます。 この関数は、たとえばいくつかの他のパラメータを設定する ufoEnumParam パラメータを介してプリセットを制御する場合や、単一値の代替表現である一連のパラメータがある場合に役立ちます。
レンダ ユーザ関数、エディタ ユーザ関数、および特定の事前/事後レンダ ユーザ関数内部では、読み出し/書き込み用のラスターにアクセスすることができます。
ufoProcessGetRasterIn は入力ラスターへのハンドルを返し、ufoProcessGetRasterOut は出力ラスターへのハンドルを返します。 ufoEditorGetRasterViewed は、編集時に表示されたラスターへのハンドルを返します。
ラスター ハンドルが与えられている場合は、ラスターと相互作用する一連の UFO ライブラリ関数が存在します(ufoRaster.hを参照)。 返されたすべてのラスター ハンドルをヌルに対してテストする必要があります。特定の状況下では(たとえば、処理前や未接続の UFO プロセス入力から取得する前には)、ラスターを使用できないことがあるためです。
現在サポートされているラスター タイプはすべて、ピクセル コンポーネント(RGB、アルファ、RGB-アルファ)同士がパック化されたピクセルの矩形配列です。 ラスター インタフェースは、ラスターのピクセル配列に関連付けられた任意のベース オフセット、幅、および高さを考慮します。
ufoRasterGetLimits、ufoRasterGetWidth、および ufoRasterGetHeight は、ラスターの矩形ジオメトリに関する情報を返します。
ufoRasterGetPixelType、ufoRasterGetPixelSize、および ufoRasterComponentSize は、ピクセル タイプに関する情報を返します。
ufoRasterGetPixelAddress(x,y) は、ポインタを(X、Y)のピクセルに返します。 ufoGetBufferAddress は、ラスターのバッファのベース アドレスを返します。このベース アドレスは、必ずしも(0、0)とは限りません。 ufoRasterGetBufferSize は、ラスターのバッファのフル サイズ(バイト数)を返します。
ufoRasterGetPixelCol、ufoRasterGetPixelColAlpha、および ufoRasterGetPixelAlpha は、ピクセルにおける正規化(0.0..1.0)コンポーネント値を返します。 ufoRasterSetPixelColll、ufoRasterSetPixelColAlpha、および ufoRasterSetPixelAlpha は、ピクセルにおける正規化(0.0..1.0)コンポーネント値を設定します。 これらの関数は、実際のタイプに関係なくすべてのタイプのラスターに作用し、必要に応じて妥当な変換を行います(ufoRaster.h および付録に詳述されています)。 これらの関数は、ラスター外部のピクセル座標に対してはチェックを実行しないため、特定の入力上の自動クランピングをオーバライドする UFO エフェクト(ufoProcessSetRasterInEdgeMode を参照)、または出力にレンダリングされるピクセルからオフセットされた座標において入力ピクセルを読み出すエフェクトを書く場合は、バウンド チェックを実行する必要があります。
ufoRasterCopy はラスター全体をコピーし、ufoRasterCopyPart はラスターの一部を個別にコピーして、必要に応じてピクセル変換を処理します。 ufoRasterAlloc は、指定されたピクセル タイプのテンポラリ ラスターを割り当てます。 ufoRasterAllocCopy および ufoRasterAllocCopyPart は、既存のラスター全体または一部のコピーを割り当て、オプションでオリジナル ラスターから新規のラスターにピクセル データをコピーします。 ufoRasterFree は、以前 UFO インタフェース ライブラリを介して割り当てられたラスターをすべて解放します。 これらの関数は、Softimage コンポジッタのメモリ マネージャを利用するため、ラスターの割り当ておよび解放に使用する必要があります。
一部のタイプのエフェクトは、現在のフレームにある出力ごとに現在のフレームに存在しないフレーム(1 つまたは複数)を入力から読み出す必要のある、インター フレームとして分類されます。 これに該当するのは、たとえばリタイミング エフェクトやモーション ブラー エフェクトです。
ufoProcessGetRasterInAtFrame は、指定されたフレームにある入力用のラスターを返します。 この関数に含まれるフィールド引数は、フィールドのレンダリング(ufoProcessFieldRendering を参照)時に使用されるものです。 一意のフレーム(およびフィールド)で ufoProcessGetRasterInAtFrame が呼び出されるたびに Softimage コンポジッタのメモリ マネージャによってメモリ内でラスターがロックされ、後にそのフレームで ufoProcessReleaseRasterInAtFrame が呼び出されるとロックが解除されます。 この関数を使用することは非常に重要です。この関数を使用すれば、メモリ マネージャからメモリのロックが解除されるので、メモリ内で同時にロックされたままのフレームが増えすぎずに済むためです。 ufoProcessReleaseRasterInAtFrame を呼び出さない限り、アクセスされたフレームで UFO プロセスがレンダリングを終えるまでは、そのフレームのラスターがすべてロックされたままになります。 現行バージョンにおいてテンポラリ アクセスが有効になるのは、入力がクリップに直接接続されている場合のみです。 テンポラリ アクセスが有効かどうかは、ufoProcessIsRasterInTemporal を使用してチェックすることができます。 ufoProcessGetRasterInTemporalLimits() 関数は、入力に対するアクセスに使用可能なフレーム リミットを返します。
編集時にエフェクトを対話型更新する場合、Softimage コンポジッタがレンダリング パフォーマンス加速の目的に使用する主要テクニックには、次の 2 つがあります。
スケーリングによるレンダリング。任意の低解像度でレンダリングを実行できます。 レンダ メソッドでは、どのジオメトリ パラメータに対するスケーリングも、レンダ スケール係数ごとに考慮する必要があります。 UFO ライブラリ関数 ufoProcessGetRenderScale は、X および Y スケール係数を取得します。 このテクニックでは、スピードを損なう代わりに可変量の精度が得られます。
クロッピングによるレンダリング。レンダリング対象領域全体のうちの矩形サブ領域が選択されます。 クロッピングは、クロップ プロセスまたは変換プロセスを使った結果として明示的に生成することも、Softimage コンポジッタの階層トラバーサル メソッドで用いられるレンダエコノマイズ テクニックを介して暗黙的に生成することも可能です。
レンダのフル解像度を得るために、ufoProcessGetFullRenderRectangle は、レンダ クロッピングやスケーリングを問わず、また低解像度マテリアルを使用するかどうかに関係なく、レンダリング対象プロセス階層内の最終ターゲット クリップの矩形フル解像度を返します。 これは、フル レンダ領域に対して相対的な位置または領域を基点とするエフェクト(たとえば、中心部を取り囲む渦巻や、中心部からの爆発など)に有用です。
デフォルトでは、入力のエッジ モードが ufoEdgeClamp に設定され、出力レンダ領域は自動的に入力リミットにクランピングされます。 ただし、入力の外部にあるピクセルを出力レンダ領域に取り込める UFO エフェクトの場合、ufoProcessSetRasterInEdgeMode を呼び出し、エッジ モードをufoEdgeNoClamp に設定して、レンダリング時に入力領域に対して独自のリミット チェックを実行する必要があります。 これを使用するエフェクトとしては、イメージを縮小するエフェクトや、大型のバックグラウンド上に小型のイメージを合成するエフェクトなどがあります。
レンダリングするプロセスの階層構造が幾分複雑な場合、Softimage コンポジッタはクロッピング テクニックを使用して、レンダリングに必要な領域を最小化します。 デフォルトでは、Softimage コンポジッタは入力ピクセルと出力ピクセルの間に 1 対 1 のマッピングが存在するものとみなします。 コンポジットやカラー スペース操作などのエフェクトは、出力内でピクセルをレンダリングする際、入力内で同じ位置にある各ピクセル値に関して計算を実行します。
境界矩形領域が入力に与えられている場合、プロセスの出力の定義済み領域は、プロセスが出力ラスター内に生成できるエフェクトを持つ境界矩形になります。 ジオメトリック変換などのエフェクト(スケール、回転、パースペクティブ、ワープなど)は、 それよりも大きな、または小さな出力領域、あるいはその入力上で定義された領域からのオフセットである出力領域を定義できます。 これを UFO プロセスで実行できる場合は、ufoProcessCalcDefinedRectangle ユーザ関数を指定する必要があります。 このユーザ関数は、すべてのプロセス パラメータがその現在の値で設定されてから、フレームがレンダリングされるまでの間に呼び出されます。 この関数の呼び出しによって、各入力の定義済み領域が指定され、すべての出力用に定義された領域が返されます。 この関数が指定されていない場合、出力の定義済み領域は、最初の入力の定義済み領域と同じものとみなされます。
プロセス入力に必要な領域は、プロセスが所定の出力領域内にエフェクトを生成するため、入力内に指定する最大の境界矩形です。 渦巻状などのエフェクト(対応する出力ピクセル周近のいくつかの入力ピクセルに関して計算を実行するエフェクト)の場合、必要とされる入力領域は、所定の必要出力領域に比べると、各方向に向かう渦巻状カーネルの 1/2 だけ大きなサイズになります。 ジオメトリック変換などのエフェクトの場合、必要とされる入力領域は、所定の必要出力領域の逆変換になります。
出力上の任意の矩形領域をレンダリングするために UFO プロセスが必要な場合、その UFO プロセスが入力上にあらかじめ必要とするレンダリング対象の矩形領域が、出力上の矩形領域よりも小さいまたは大きいか、あるいはその出力領域からのオフセットであるときは、ufoProcessCalcNeedRectangles ユーザ関数を指定する必要があります。 このユーザ関数は、すべてのプロセス パラメータがその現在の値で設定されてから、フレームがレンダリングされるまでの間に呼び出されます。 この関数の呼び出しによって出力の必要領域が指定され、すべての入力に必要な領域が返されます。 この関数が指定されていない場合、入力の必要領域は、出力の必要領域と同じであるとみなされます。
両方の領域計算ユーザ関数を使用した場合、与えられた矩形領域においてはどのレンダ スケーリングも考慮されません。また、返された矩形領域においても考慮する必要はありません。
レンダリング時にクロッピング(自動または手動)が存在するときに UFO プロセスを正常に動作させたい場合、これらの関数の要件を理解することは大切です。