AnyPortrait > スクリプト > コマンドバッファ
Unityの「コマンドバッファ(Command Buffer)」をAnyPortraitのキャラクターを対象に使用するための関数です。
次の関数は、「apPortrait」ではなく「apCustomCommandBuffer」クラスに属しています。
コードの作成方法は、ページ下部のサンプルコードやコマンドバッファの使用例を説明する次のページを参照してください。
- 「Command Buffer」の作成
また、Unityのコマンドバッファの詳細な説明は、下記のUnityの公式マニュアルで確認できます。
- ビルトインレンダーパイプラインのコマンドバッファによる拡張
- スクリプタブルレンダーパイプラインにおけるレンダリングコマンドのスケジューリングと実行
- CommandBuffer API
- CameraEvent API
apPortrait を対象とするコマンドバッファクラスを生成します。
Camera camera : レンダリングを実行するカメラ
apPortrait portrait : レンダリングとなるapPortrait
string commandBufferName : カメラに登録されるコマンドバッファの名前
コマンドバッファを登録済みのカメラから削除します。
カメラ、apPortrait キャラクター、またはコマンドバッファクラスのいずれかが存在しなくなる場合は、この関数を必ず実行してください。
カメラにレンダリングをどの時点で行うかを設定します。
Built-in レンダリングパイプラインを使用する場合に呼び出す必要がある関数です。
UnityEngine.Rendering.CameraEvent cameraEvent : レンダリング時点のenum変数
カメラにレンダリングをどの時点で行うかを設定します。
「Scriptable Render Pipeline (SRP)」を使用する場合に呼び出す必要がある関数です。
この関数は、SRP を正式にサポートする Unity 2019.1 以降でのみサポートされます。
apCustomCommandBuffer.SRPRenderEvent srpRenderEvent : SRPでのレンダリング時点
コマンドバッファを使用してキャラクターをレンダリングするとき、別の「マテリアル」が適用されることを指定します。
引数として入力されたマテリアルのプロパティが複製されレンダリングに使用されるようにスケジュールされていますが、「_MainTex」と「_Color」は複製されません。
置き換えられるマテリアルのシェーダは、「カスタムシェーダ」としてのルールが守られなければなりません。
この関数が呼び出された後、「DrawAllMeshesWithAlternativeMaterials」関数を使用して描画要求を行う必要があります。
Dictionary型の変数でマテリアルを指定すると、キャラクターが持つ複数の画像ごとに異なるマテリアルが適用されてレンダリングされることがあります。
Material alternativeMaterial : コマンドバッファによるレンダリング時に置き換えられるマテリアル
Dictionary<string, Material> imageNameToAlterMaterialMap : イメージ名に応じて異なるマテリアルが置き換えられるように指定されたマッピング変数
Material unmatchedMaterial : 代替対象のマテリアルが見つからない場合に共通に適用されるマテリアル
コマンドバッファの内容を初期化します。
カメラでキャラクターをレンダリングした結果を「レンダーテクスチャ」に保存するように設定します。
RenderTexture renderTexture : レンダリング結果が保存されるテクスチャ
設定されたレンダリング先の色または深さの値を初期化します。
Built-in レンダリングパイプラインで呼び出すことができる関数です。
bool clearDepth : 深さ値を初期化するかどうか
bool clearColor : カラー値を初期化するかどうか
Color backgroundColor : clearColorがtrueの場合、初期化される色
float depth : clearDepthがtrueの場合、初期化される深さ値(デフォルトは1.0f)
設定されたレンダリング先の色または深さの値を初期化します。
Scriptable Render Pipeline(SRP)から呼び出すことができる関数です。
この関数は、SRP を正式にサポートする Unity 2019.1 以降でのみサポートされます。
UnityEngine.Rendering.RTClearFlags clearFlags : 初期化される値の種類を指定する Flag 変数
Color backgroundColor : 初期化される色
float depth : 初期化される深さ値(デフォルトは1.0f)
uint stencil : 初期化されるステンシル値(デフォルトは0)
レンダリング時に「View Matrix」としてどの値が適用されるかをコマンドバッファに割り当てます。
引数を指定しない場合は、ターゲットのカメラの「View Matrix」と同じ値がレンダリングに使用されます。
この関数は「Unity 2019.1」以降のバージョンでのみサポートされており、そのバージョンでは必ずこの関数を呼び出す必要があります。
Matrix4x4 customViewMatrix : カメラの設定とは異なる方法で適用される「View Matrix」
レンダリング時に「Projection Matrix」としてどの値が適用されるかをコマンドバッファに割り当てます。
引数を指定しない場合は、ターゲットのカメラの「Projection Matrix」と同じ値がレンダリングに使用されます。
この関数は「Unity 2019.1」以降のバージョンでのみサポートされており、そのバージョンでは必ずこの関数を呼び出す必要があります。
Matrix4x4 customProjectionMatrix : カメラの設定とは異なる方法で適用される「Projection Matrix」
apOptTransform のメッシュをレンダリングすることを指定します。
「apPortrait.GetOptTransform」関数が役に立ちます。
材料または「World Matrix」を任意に変更してレンダリングできます。
apOptTransform optTransform : レンダリングされるメッシュを持つ apOptTransform
Material material : レンダリングされる代替マテリアル
Matrix4x4 localToWorldMatrix : ユーザーが任意に指定する「World Matrix」
現在の画面に表示されているapPortraitのすべてのメッシュがレンダリングされることを指定します。
bool sortOrder : レンダリング順序を再計算するかどうか
bool excludeClippedChildMeshes : コマンドバッファと互換性のないクリッピングされたメッシュをレンダリングから除外するかどうか
Material material : レンダリングされる代替マテリアル
現在画面に表示されているapPortraitのすべてのメッシュがレンダリングされるように指定する「DrawAllMeshes」関数と同じ役割を果たしますが、「CreateAlternativeMaterials」関数から登録された代替マテリアルが使用されます。
bool sortOrder : レンダリング順序を再計算するかどうか
bool excludeClippedChildMeshes : コマンドバッファと互換性のないクリッピングされたメッシュをレンダリングから除外するかどうか
Unity のコマンドバッファオブジェクトを返します。
UnityEngine.Rendering.CommandBuffer : コマンドバッファオブジェクト
using UnityEngine;
using AnyPortrait;
public class CmdBufferExample : MonoBehaviour
{
// ターゲットオブジェクト
public apPortrait portrait;
public Camera targetCamera;
// カスタムコマンドバッファ
private apCustomCommandBuffer _commandBuffer = null;
void Start()
{
if (_commandBuffer == null)
{
portrait.Initialize();
_commandBuffer = new apCustomCommandBuffer(targetCamera, portrait, "Custom Command Buffer");
_commandBuffer.AddToCamera(UnityEngine.Rendering.CameraEvent.AfterForwardAlpha);
}
}
void OnDestroy()
{
if (_commandBuffer != null)
{
_commandBuffer.Destory();
_commandBuffer = null;
}
}
void LateUpdate()
{
if (_commandBuffer != null)
{
_commandBuffer.ClearCommands();
_commandBuffer.SetViewMatrix();
_commandBuffer.SetProjectionMatrix();
_commandBuffer.DrawAllMeshes(true, true);
}
}
}