« C4D C.O.F.F.E.E.クラスの様な…構造体 | トップページ | C4D ChannelShader…02 »

C4D ChannelShader

全くの初めてなので、どうなるんだ…
オブジェクトの色を与える…

C.O.F.F.E.E.SDKのChannelShaderフレームワークを…

/*
ChannelShaderPlugin
testChannelPlugin
*/


var pluginID = 1000007;

//testChannelPlugin ===============================================================
class testChannelPlugin : ChannelPlugin
{
  public:
  testChannelPlugin();

  GetName();
  GetID();

  GetInfo(settings);

  InitSettings(settings);
  InitRender(settings);

  Message(settings , message);
  EditData(settings);

  Output(settings , render , p , n , d , t , texflag , vd);
};

// ローカル変数等を初期化
testChannelPlugin::testChannelPlugin(){super();}

// シェーダーの名前を戻す。
testChannelPlugin::GetName(){return "testCHShader";}

// http://www.plugincafe.comから取得した、このプラグインの為のplugin idを戻す
//テストID:1000001-1000010

testChannelPlugin::GetID(){return pluginID;}

// CHANNEL_DIRECTBUMPとCHANNEL_RAYTRACINGのコンビネーションを戻す
testChannelPlugin::GetInfo(settings){return;}

// シェーダーセッティングを初期化
testChannelPlugin::InitSettings(settings){return;}

// rdとしてOutput()機能に渡される何かを戻す
testChannelPlugin::InitRender(settings){return;}

//ハンドルC4Dメッセージ
testChannelPlugin::Message(type , data){return;}

// ユーザがシェーダーをダブルクリックする時に呼ばれる
// ダイアログなどを表示する

testChannelPlugin::EditData(settings){return;}

//指定されたポイントで色を戻す
testChannelPlugin::Output(settings , rd , p , n , d , t , texflag , vd){return;}



//main ============================================================================
main()
{
  //C4Dへシャーダーの登録
  Register(testChannelPlugin);
}

これをC4DのPluginフォルダへ入れると、テストID:1000007で認識されます。

出現する場所は、マテリアルのカラーチャンネルなどのテクスチャポップアップの中に…

Channelshader_01

なるほど…
チャンネルシェーダー…
オブジェクトの表面そのものの色なんだね…
自分はてっきり、カメラから見えるオブジェクトの色を決定できるのかと…
自分が思っていたのは、面の法線を考慮し、ライトの位置や距離で色を算出したり、とか…
反射/屈折のベクトルの算出とか…
マテリアルそのものを新しく作れるのかと…
ただ2Dのマップを作るだけのような… そんな感じだね…

かなり以前、StudioMOMO C4D板で、「フォログラムシートを表現するには?」の質問に…
話がもつれて、「そんなんだったら、シェーダーを新しく作れば良い!」と言う、売り言葉に買い言葉のようなのを見たような…
当時は、「C.O.F.F.E.E.をマスターすれば、そんな素晴らしい事もできるのか…」なんて思いましたが…
光の反射/屈折/回折/干渉とか…
光の周波数別での屈折角の違いで起こる虹のような現象…
SDKを少し見ましたが、ChannelShaderでは無理なような… C++の話だったのだろうか?

ちょっとガッカリしたけど、ここで直ぐには止めません…
少しだけ… ほんの少し…

まずは、ChannelPluginクラスのメンバ関数から…

GetName()は、ダイアログの場合も、メニュープラグインの場合もあるので問題ないですね。
ただ、グループシェーダの時は名前をスラッシュで区切るらしい…
"testMaps/Map1","testMaps/Map2"見たいに…
1個づつプラグインIDが必要になると思うが…

GetID()も、メニュープラグインの場合と同じく、MAXONからIDを取得して…
同じなので問題ないですね。

GetInfo()は、「CHANNEL_DIRECTBUMPとCHANNEL_RAYTRACINGのコンビネーションを戻す」?
ダイレクトバンプ?レイトレーシング?
SDKの内容が、少し把握できない…
シェーダーがバンプカラーの変わりに、バンプベクトルを返すのであれば、CHANNEL_DIRECTBUMPを設定。

独自の光線を計算する為に、シェーダーがレイトレーサを必要とするならば、CHANNEL_RAYTRACING

レイトレーサーとか、ベクトルとか書いてありますが… フォログラムのような物もできると言う事だろうか?
書いてある内容が、理解できていない…

保留します。

InitSettings()は、シェーダーセッティングを初期化…
このシェーダーの為の変数等を初期化するのか?
それとも、シェーダー自体を初期化するのか?

デフォルト値で、例えばWoodShader、木製の色、粒状性などの為にシェーダーのBaseContainerを満たす。
このルーチンが除外されるならば、どの値も記憶されない。
成功が戻る。
マテリアルが作成されるか、アップデートされるたびに、InitSettings()は呼ばれる。

チンプンカンプンだ…
訳自体が合っているのか…?

InitRender()は、rdとしてOutput()機能に渡される何かを戻す…?

後でCalcSurfaceに必要なすべてのデータによって、独自のクラスを割り当てる。
クラスは戻る。
このルーチンは各シェーダーインスタンスの為にレンダリングの前で呼ばれる。
典型的な使用は、Sin,Cos,Noiseのような三角関数を前もって計算することであるであろう。

本当にチンプンカンプンだ…

Message()は、ハンドルC4Dメッセージ?

他のpluginsがどのようなメッセージでもシェーダーに送信することを可能にする。
メッセージidは、message.GetId()を使って検索されることができる。
例えばあなたは、それがコマンドMSG_CHANGECOLORを受け取るたびに、それが、その色を循環させるという方法であなたのシェーダーのプログラムを作ることができた…

イベントメッセージだろうか?

EditData()は、ユーザがシェーダーをダブルクリックする時に呼ばれ、ダイアログなどを表示する。

典型的なシェーダーデータが使う編集は、セッティングデータを変更するモーダルダイアログをオープンすることである。
このルーチンが除外されるなら、シェーダーは編集されることができない。
あなたがマテリアルエディタの中のマテリアルをダブルクリックする時に、EditDataは呼ばれる。
シェーダーに変化が起こされて以来、戻りTRUEはCinema 4Dに、プレビューアイコン&RTTMマップを再するように命じる。
戻りFALSEはCinema 4Dに、ユーザがキャンセルしたと言う。

Output()は、指定されたポイントで色を戻す

引数が沢山あってpとかnとか…

ポイントpのチャンネルカラーを計算して返す。
クラッシュの恐れがあるので、どのOSコールも許されない。

InitSettings()をオーバーロードしたなら、セッティングBaseContainerを計算で使うことができる。

InitRender()をオーバーロードしたなら、レンダリング設定構造を使うことができる。
pはテクスチャタグの投影法で投影されたポイント

nはpの法線。

dはMIP/SATマッピングのためのスポットサイズ(半径)である。
サンプリングされる必要があるpまわりのエリアのために、d.xとd.yは半径を定義する。
この値を無視するならば、あなたのシェーダーは作業するけれど、アニメーションの間すさまじいエイリアシングを生産する。

tは現在の時間。

texflagは以下のフラグの1つのコンビネーションであるかもしれない:
TEX_TILE : テクスチャーはタイルを貼られて、シェーダーはタイル張りを計算することができる
TEX_MIRROR: テクスチャーはシームレスに映されていて、TEX_TILEが設定されるならば権利をもっているだけである。
TEX_ALPHA : シェーダーのαチャネルは計算されていることとする。
TEX_BUMP : バンプチャネルは計算されている。出力が今衝突されたベクトルを戻さなければならない前に、CHANNEL_DIRECTBUMPが設定されたならば。

vdはVolumeData構造である。 (下に説明される。) 重要である: vdはNULL(!)であるかもしれない。 - シェーダーのための2Dプレビューが計算されている時に、これはそのケースである。 (例えばマテリアルエディタの中または実時間テクスチャマッピングのために。) あなたはこの場合に、目的をプレビューするために‘最良適合データ’を戻すか、デフォルト色を戻すことができる;あなたがこの構造にアクセスしているならば、あなたがvd!=NULLをチェックするのを確かめなさい!
どのチャネルの中で、シェーダーが使われるかを見つけ出すには:
COFFEEにおいて、ただ、settings->GetId()を使いなさい。
CHANNEL_COLOR, CHANNEL_LUMINANCE…チャンネル値は呼ばれる。
チャネル値は、シェーダーが中で(未知)pluginチャネルをもっていることを意味しているそれらのタイプ(例えば-1)のどれでもないかもしれない。

わからない所が多々ありますが…

理解できませんでしたが、こんな状態で、話を進められるのだろうか…

|

« C4D C.O.F.F.E.E.クラスの様な…構造体 | トップページ | C4D ChannelShader…02 »