属性はシェーダ定義に定義するか、パラメータ定義ごとに定義できます。 たとえば、PPGLayout 属性の 1 つを、ヘルプ ファイルの場所を設定するなどの方法で、シェーダ定義に直接定義することができます。 シェーダ パラメータ定義では、属性はパラメータ データ タイプを指定したり、関連付けられたプロパティ ページで使用するプロパティ ルックアップまたはリファレンス ウィジットを設定したり、カスタム データ タイプのカラーを設定したりするために使用できます。
レンダラ オプションと同様に、属性は、ValueMap または ValueMap に格納されます。これは、名前と値のペアで構成される連想配列と類似しています。 ShaderDef.Attributes または ShaderDef::GetAttributes メンバを介してシェーダ定義の属性を含む値マップにアクセスします。
属性値は、パラメータ定義を追加する前に、ShaderParamDefOptions.SetAttribute または ShaderParamDefOptions::SetAttribute メソッドを使用して設定することもできます。ShaderParamDefOptions または ShaderParamDefOptions オブジェクトが、パラメータ属性やその他の設定を格納するためです。
実行するタスク |
ValueMap メンバ |
コメント |
|
---|---|---|---|
単一エントリの追加または変更 |
引数には名前と値を指定します。 指定した名前と一致するエントリがない場合は、新しいエントリが追加されます。それ以外の場合は、既存の値が上書きされます。 |
||
単一エントリの取得 |
指定した名前と一致するエントリの値を取得します。 |
||
単一エントリの削除 |
指定した名前と一致するエントリを削除します。 一致するエントリが見つからなくても、エラーは発生しません。 |
||
エントリのリストの繰り返し |
ValueMap インタフェースでは名前のリストに加えて値のリストにもアクセスできるため、名前を完全にスキップして値だけを繰り返すことも、または名前を繰り返し、各エントリをから ValueMap.Get または ValueMap::Get メンバを介して、一致する値にアクセスすることもできます。 |
ValueMap::GetAll 関数(C++ API)は、名前と値の出力配列を引数として取得します。 |
Python の例: ShaderDef 属性を設定、削除、繰り返し
Python および VBScript は safearray とうまく機能するため、ValueMap のエントリの繰り返しは非常に簡単です。
# Get the ValueMap from the shader definition and add a couple of entries oAttribs = oShaderDef.Attributes oAttribs.Set("user", "test") oAttribs.Set("a", 123456) # Get the safearray of names and use each name to find the matching value aAttribNames = oAttribs.Names Application.LogMessage("Before removal there are %d attributes" % len(aAttribNames)) for vKey in aAttribNames : Application.LogMessage("Attribute key,value: %s, %s" % (vKey, str(oAttribs.Get(vKey)))) # Remove one of the entries from the list oAttribs.Remove("user") aAttribValues = oAttribs.Values Application.LogMessage("After removal there are %d attribute(s) left" % len(aAttribValues)) # Results: # INFO : Before removal there are 2 attributes # INFO : Attribute key,value: a, 123456 # INFO : Attribute key,value: user, test # INFO : After removal there are 1 attribute(s) left
JScript の例: ShaderParamDef への書き込み可能イメージ タイプの設定
この例は、シェーダ パラメータ定義を書き込み可能イメージ データ タイプとして設定する方法です。
// When you set up the options for your shader parameter definition you could // set parameter attributes using the ShaderParamDefOptions object var oParamDefOpts = XSIFactory.CreateShaderParamDefOptions(); oParamDefOpts.SetAttribute(siWritableImageAttribute, true); oParamDefOpts.SetTexturable(true); oParamDefOpts.SetInspectable(false); // Alternatively, you could use the Attributes property to get the ValueMap and // set the siWritableImageAttribute directly on the ValueMap var oInParamDefs = oShaderDef.InputParamDefs; var oParamDef = oInParamDefs.AddParamDef("texture", siShaderDataTypeImage, oParamDefOpts); oParamDef.Attributes.Set(siWritableImageAttribute, true);