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 文字列 または CString を戻す パーサは解析エラーを出力できます。
Warnings 文字列 または 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();
        }
}

関連項目