Define (シェーダ)

Define (シェーダ)


詳細

プロパティ ページのコントロールの基礎になるすべてのパラメータを含むシェーダ定義を定義します。 ここで、パラメータの数、各パラメータのタイプ、デフォルト、値の制限などを定義します。

このコールバックはシェーダが初めて初期化されるときに発生します。 定義が初期化されると、シェーダ定義はシステム内に設定されるので、再定義する必要はありません。


適用対象

カスタム シェーダ


構文

public class <plugin-item_name>

{

	public bool Define( Context in_context )

	{

		...

	}

}
CStatus <plugin-item_name>_Define( CRef& in_context ) 

{ 

	... 

}
function <plugin-item_name>_Define( in_context ) 

{ 

	... 

}
def <plugin-item_name>_Define( in_context ):

	...
Function <plugin-item_name>_Define( in_context )

	...

End Function
sub <plugin-item_name>_Define 

{ 

	my $in_context = shift; 

}

<plugin-item-name> は、プラグイン名、PluginRegistrar.RegisterShader の呼び出しで指定されている名前、メジャーおよびマイナー バージョン番号で構成される特別な文字列です。この名前に含まれるスペースはアンダースコアに置き換えられます。 たとえば、名前が MyPlugin、シェーダ クラス名が My Shader、バージョン番号が 1.0 のシェーダ定義をプラグインに登録する場合、コールバック関数の名前の先頭は MyPlugin_My_Shader_1_0 になります。


パラメータ

パラメータ Language タイプ 説明
in_context スクリプティングおよび C# コンテキスト Context.GetAttribute("Definition")は ShaderDef を返します。
C++ CRef& Context::GetAttribute("Definition")は ShaderDef へのリファレンスを返します。


コンテキスト属性

Attribute 取得/設定 詳細
Definition ShaderDef を返すかまたは設定する 登録/クエリを行うシェーダ定義。
Errors String または CString を返す パーサは解析エラーを出力できます。
Warnings String または CString を戻す パーサは解析に関する警告を出力できます。


SICALLBACK UtShaderPlugin_ColorShare_1_0_Define( CRef& in_ctxt  )

{

	XSI::Context ctxt(in_ctxt);

	XSI::ShaderDef shaderDef = ctxt.GetAttribute( L"Definition" );



	// Check if the user attribute is there

	{

		CValue valDune = shaderDef.GetAttributes().GetAttribute( L"{F2EF07FE-1B57-4245-BF08-F5556212BFDF}" );

		assert( !valDune.IsEmpty() );

	}



	// Define PassThrough ports

	definePassThroughPorts( shaderDef, XSI::siColorParameterType );



	// Fill Meta shader section

	{	

		shaderDef.AddType( L"texture" );



		MetaShaderRendererDef rendererDef = shaderDef.AddRendererDef( L"Mental Ray");

		assert( rendererDef.IsValid() );

		rendererDef.PutSymbolName( L"sib_color_passthrough" );

		rendererDef.PutCodePath( L"{LIBS}/sibase.{EXT}" );

		rendererDef.GetRendererOptions().SetAttribute( L"version", CValue((LONG)1) );

	}



	return CStatus::OK;

}





// Helper function

void definePassThroughPorts( ShaderDef& in_ShaderDef, XSI::siShaderParameterType in_eParamType )

{

	XSI::Application app;

	XSI::Factory fact=app.GetFactory();



	XSI::ShaderParamDefOptions optDefault= fact.CreateShaderParamDefOptions();

	optDefault.SetTexturable(true);



	ShaderParamDefOptions opt= fact.CreateShaderParamDefOptions();

	opt.SetTexturable(true);



	// Add input + 8 channels + output

	if( in_eParamType==XSI::siColorParameterType )

	{

		XSI::CValueArray valArray;

		valArray.Add( 0.5f );

		valArray.Add( 0.5f );

		valArray.Add( 0.5f );

		valArray.Add( 1.0f );

		optDefault.SetDefaultValue( valArray );

	}

	

	XSI::ShaderParamDef pdef;

	pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"input", in_eParamType, optDefault );

	pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"channel1", in_eParamType, opt );

	pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"channel2", in_eParamType, opt );

	pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"channel3", in_eParamType, opt );

	pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"channel4", in_eParamType, opt );

	pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"channel5", in_eParamType, opt );

	pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"channel6", in_eParamType, opt );

	pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"channel7", in_eParamType, opt );

	pdef = in_ShaderDef.GetInputParamDefs().AddParamDef( L"channel8", in_eParamType, opt );

	pdef = in_ShaderDef.GetOutputParamDefs().AddParamDef( L"out_result", in_eParamType );

	

	// Get the ShaderDefs Layouts

	XSI::PPGLayout layoutPPG = in_ShaderDef.GetPPGLayout();

	XSI::PPGLayout layoutRT = in_ShaderDef.GetRenderTreeLayout();



	// Define the PPG Layout.. only input should be visible

	layoutPPG.AddItem( L"name", L"Name" );

	layoutPPG.AddItem( L"input", L"Input" );



	// Define the RT Layout.. input alone, then all the channels in a group

	{

		layoutRT.AddItem( L"input", L"Input" );

		layoutRT.AddGroup( L"Channels", false );

			layoutRT.AddItem( L"channel1", L"Channel 1" );

			layoutRT.AddItem( L"channel2", L"Channel 2" );

			layoutRT.AddItem( L"channel3", L"Channel 3" );

			layoutRT.AddItem( L"channel4", L"Channel 4" );

			layoutRT.AddItem( L"channel5", L"Channel 5" );

			layoutRT.AddItem( L"channel6", L"Channel 6" );

			layoutRT.AddItem( L"channel7", L"Channel 7" );

			layoutRT.AddItem( L"channel8", L"Channel 8" );

		layoutRT.EndGroup();

	}

}


関連項目