TB's ShaderMan
version 0.55
Coded by Y.Ume/Tabo, 2006/01/31
【概要】
RenderManシェーディング言語(サブセット版)をサポートしたシェーダです.
RenderManのsurfaceシェーダをコンパイルして読み込む事で、様々なシェーディングアルゴリズムのレンダリング機能をサポートします. またChannelモードではLW標準のパラメータを操作するチャンネルシェーダとして実行する事も可能です.
シェーディングに特化したVMとバイトコードを出力するコンパイラにより、実用的な速度で複雑なサーフェスシェーダを書く事ができます.
【動作環境】
Lightwave7.x for Intel(Win32)版
Lightwave8.x for Intel(Win32)版
(但し8.0.1, 7.5bでしか動作確認はしていません)
【構成】
TB_ShaderMan.p | プラグイン本体 |
lwslc.exe | シェーダコンパイラ |
lwpp.exe | プリプロセッサ(lwslc.exeから呼ばれる) |
【インストール方法】
TB_ShaderMan.pをLWのプラグインとして登録し、lwslc,lwpp.exe(コンパイラ&プリプロセッサ)を適当なフォルダにインストールし、必要であればpathを通す事でインストール完了です、pathを通さない場合でもプリプロセッサはコンパイラから呼び出されるのでコンパイラから見える場所にインストールする必要があります.
【基本的な使い方】
シェーダプログラム(.sl)を記述し、コマンドライン上でlwslc.exeにてコンパイルして生成された.slwファイルをLW上のサーフェスプラグインに読み込ませる事でシェーダがレンダリングされます.
【TB_ShaderMan機能パネル(共通部分)の説明】
<Basicタブ>
Shader Type:
ShaderManのシェーダ実行モードを指定します.
[Full Shader (type1)]
一般的なRenderMan準拠のレンダラと同様、全てのシェーディングをシェーダ内で計算し、実行結果をCi, Oiに格納します、影の色はOiの値により決定されます(シェーダで透明度を変更する場合はChange Transparencyオプションもチェックします)
[Full Shader (type2)]
Full Shader(type1)とほぼ同じですが、Ci, Oiの結果はサーフェスの外見のみに反映され、影の色を決定する際には_Cs, _Kt, _c_tranのパラメータが使用されます、またそれ以外のチャンネルについてもChannel Shaderとほぼ同様シェーダでの変更をLWに書き出す為、シェーダから_Kr, _c_specを操作する事でコースティクスに影響を与える事もできます.
[Channel Shader]
Channel ShaderとしてLWの表面設定の各パラメータを変更します、シェーディングアルゴリズムはLW組み込みのものが使用されます.
Shader Alpha:
シェーダの不透明度を指定します、100%で完全に不透明になります、ここにテクスチャを貼る事で複数のShaderMan Shaderのシェーディング結果をレイヤー状に重ねる事が可能になります.'Full Shader'モードで合成する場合は必ず一番下にShader Alpha:=100%のFull Shader設定されたシェーダが必要になります
※厳密にはreplacement_color,replacement_percentage(詳細はLWSDK参照)を用いて独自シェーディングを行うシェーダであればShaderManシェーダで無くとも構いません.またFull/Channelの両モードとも、シェーダに渡されるLWのサーフェスパラメータは下のレイヤのシェーディング結果に上書きされる事に注意して下さい.
Change Transparecy:
シェーディング結果が透明度(Full Shader(type1)のOi, Full Shader(type2), Channel Shaderの_Ktに影響するかどうかを指定します、基本的にOs!=Oiもしくは_Ktをシェーダ内で変更する場合に指定します.
※透明体でこのスイッチをチェックしない場合、シェーディング結果の透明度への影響が無視される可能性があります(LW側が勝手に判断します)
<Advancedタブ>
VM Stack Size:
実行時のVMのスタックサイズを指定します、通常はデフォルト設定で十分な値ですが、非常に複雑なシェーダを実行する場合、スタックが足りなくなる可能性があり、その場合に設定を変更します. 最低値は1024になります.
<Imageタブ>
Image ID:
Image Source:
シェーダ内で参照する画像ファイルを指定します、ここで指定された画像はパラメータに貼るテクスチャと異なり、シェーダ内の計算により任意の座標のピクセル値が取得可能です.実際の画像のピクセル値を取得するにはシェーダ内でimage()関数により、ここで設定されているidを指定する事で参照します. なお画像ファイルは予めLW側の画像読み込み機能等でレイアウトにロードされている必要があります.
【仕様】
シェーダに渡されるst(テクスチャ)座標はLW上でカラーチャンネルに指定した最初の画像マップの投影座標が設定されます、設定が参照されるだけなのでテクスチャ自体は空でも構いません.
シェーダ実行時の"current"空間は"world"になります、また"shader"空間は"object"スペースと同義です.
Shaderの全てのトップレベル引数はテクスチャの指定やエンベロープ、エクスプレッションをアサインする事が可能です.コンパイラシンボルとしてソースファイル内にSHADERMANマクロシンボルが定義されます.
Shaderのトップレベル引数としてソースコード内に指定したデフォルト引数の座標系に対し、LW上のパネルではvector, normal, point型の場合その引数に設定されている座標系で編集が行われ、VM側にはその座標系から"current"に変換された座標が渡されます.それに対しcolor型の場合には引数に指定した色空間からRGBに変換されてLWのパネル上にセットされVM側にはRGB値が渡されます.
【RenderMan SLとの相違点】
【データ型】
float, color, point, vector, normal
【演算子と優先順位】
基本的に演算子の優先順位と結合規則はC言語に準じます.
演算子 備考 優先順位 - 単項符号 1 ! 論理否定 2 ^, . 外積, 内積演算子 3 *, / 乗算, 除算演算子 4 +, - 加算, 減算演算子 5 <, >, <=, >= 比較演算子1 6 ==, != 比較演算子2 7 &&, || 論理演算子 8 ? : 条件式(3項演算子) 9 =, +=, -=, *=, /= 代入演算子 10
【制御構造】
for, while, if [else], illuminance
【実装関数】
sin(n), cos(n), tan(n), asin(n), acos(n), atan(a[,b]), exp(n), log(a[,b])
abs(n), sqrt(n), mod(a,b), pow(a,b), invertsqrt(n)
sign(n), floor(n), ceil(n), round(n), radians(n), degrees(n)
clamp(,v,min,max), mix(x,y,a), step(min,v), smoothstep(min,max,v)
spline([basis],v,f1,f2[,f3...]), min(a,b[,c...]), max(a,b[,c...])
setxcomp(v,n), setycomp(v,n), setzcomp(v,n), xcomp(v), ycomp(v), zcomp(v)
setcomp(c,i,n), comp(c,i), normalize(v), length(v), distance(p1,p2)
ptlined(q,p1,p2), rotate(q,angle,p1,p2), faceforward(v,I[,Ng])transform([from,]to,p), ntransform([from,]to,n), vtransform([from,]to,v), ctransform([from,]to,c)
reflect(I,N), refract(I,N,eta), fresnel(I,N,eta,Kr,Kt[,Vr,Vt])
ambient(), diffuse(N), specular(N,V,roughness), phong(N,V,size), trace(P,dir), specularbrdf(L,N,V,roghness)
noise(P[,n]), cellnoise(P[,n]), random()lightsource(s,v)
【拡張関数】
float raycast(point p; vector dir)
任意の点からのレイキャストにより交点が存在するかを調べます、レイトレースよりも高速に実行され、戻り値には交点までの距離が返ります.また交点がない場合には1e+16以上の値が返ります.
float raytrace(point p; vector dir; output color cc)
任意の点からのレイトレースを実行します、trace()関数と同様ですが、戻り値には交点までの距離が返ります.また交点がない場合には1e+16以上の値が返ります.
float raytrace(point p; vector dir; float mode; output color cc)
基本的に上記のraytraceと同様、任意の点からのレイトレースを実行しますが、こちらはLW上の表面設定の環境に設定した環境マップ等の設定を反映した結果になります、modeが0の場合は反射の設定が、1の場合は屈折の設定が使用されます.
またLWのシーン設定の反射・屈折レイトレースオプションを反映します.
void raytrace(point p; vector dir; float blur, float sample_level, float mode; output color cc)
LWの反射・屈折オプション設定に加え、マルチサンプリングによる反射・屈折のぼけを表現します. 基本的には自前でモンテカルロサンプリングを行うのと同じですが、再帰時にマルチサンプルが再帰的に呼ばれないようプラグイン内部での効率化が図られています.
実際のサンプリング数はsample_levelに設定された値の2乗となり、blurの値は0.0〜1.0についてLW標準の演算結果と同様になるよう設定されています.
※このタイプのraytrace()呼び出しは戻り値がvoidになっている点に注意して下さい.color indirectdiffuse(point P; normal N)
LW上のラジオシティの計算結果を返します、ラジオシティが設定されていない場合color 0が返ります.
color caustic(point P; normal N)
LW上のコースティクスの計算結果を返します、コースティクスが設定されていない場合color 0が返ります.
color fullambient()
LWの通常シェーディングと同様のambient計算を行います、LW上でラジオシティが設定されていない場合には通常の環境光の設定が、ラジオシティが設定されている場合はその結果が返ります.またコースティクスが設定されている場合その値も加算されます.
これによりRenderManの通常のシェーダのambient()呼び出しを本関数に置き換える事でLWのGIに対応させる事ができます.
float raylevel()
現在のレイトレース反復回数を返します、視点から直接レイが来る場合0となります.void stvalue(point P; output float s; output float t)
Pで表される座標におけるst値を計算します、st値の計算はグローバル変数s,tの計算と同様の方式で算出され、主にs,tに沿ったパターンを作成する際の微分値の計算に使用します.
※対象がLWのUVマッピング座標の場合にはs, tは現在のシェーディング座標の属するポリゴンにマッピングされたUV座標系で評価されます、またVIPER上では本関数は正常に機能しません.float pointilluminance(point P; output vector L; output color Cl; [output color Cl0])
現在のilluminanceループで参照されている光源について座標Pでのilluminanceを得ます、illuminanceループ内でのみ有効で、戻り値は照明の影響がある場合は1.0を、そうでない場合には0.0を返します. 戻り値が0.0の場合であっても平行・点・スポット光源についてはL及びCl0は有効ですが、面・線光源おいてL, Cl0は無効です(通常のilluminance文と同等の制約を受けます).float ispreview()
現在シェーダがLW上のPreviewで動作しているかどうかを返します、Previewで実行されている場合は1を、それ以外は0を返します.void initrandom()
現在の乱数系列をシェーダが呼び出し時の初期値にリセットします、一つのシェーダ内で複数のモンテカルロシミュレーションアルゴリズムを使用する場合に、アルゴリズムの最初に本関数を実行する事で、それぞれのアルゴリズムの結果を独立して組み合わせる事が可能です.※本プラグインのrandom()関数はオリジナルのRenderManのものとは異なり、シェーディングスポットのピクセル座標系において常に同じ系列を返し、乱数の生成順序はレイトレース実行などによるシェーダの再帰呼び出しなどに影響されないよう設計されています. これは一部のシェーダでモンテカルロシミュレーションを実行する場合、隣接するフレーム間でのサンプリングの食い違いよるちらつきを軽減する為です(シェーダが適応化サンプリングアルゴリズムを採用している場合はこの限りではありません).
void pushrandom()
現在の乱数シードを保存します. 後述のpoprandom()関数と組み合わせて使用します.void poprandom()
pushrandom()関数により保存された乱数シードを復帰します.color image(float id; float s; float t; [float sample_size; [output float alpha]])
プラグインのimageタブのidで指定されたテクスチャのuv座標(0.0〜1.0)におけるピクセル値を取得します、sample_sizeはテクスチャuv座標(0.0〜1.0)におけるサンプリングサイズで、sample_size>0.0の場合はテクスチャのリサンプルを行います(無指定の場合は暗黙に0.0(リサンプル無し)が指定されます)alphaには指定されたテクスチャにアルファチャンネルが存在する場合はその値が、存在しない場合は1.0が返ります.
float array(float n; float n0; [float n1...])
color array(float n; color n0; [color n1...])
point array(float n; point n0; [point n1...])
vector array(float n; vector n0; [vector n1...])
normal array(float n; normal n0; [normal n1...])
配列を持たない本プラグインで主にシェーダの移植などで配列の挙動をエミュレートする為の関数です、引数の並びはspline()関数とほぼ同じですが、nの値は0インデックスの整数インデックスが使用されます.
【拡張関数(試験実装)】
float rayhittest(point P; vector dir; output point Ph; vector Nh)
Pからdir方向にレイトレースを実行し検出された交点の情報(Ph,Nh)を返します、戻り値には交点までの距離が返ります. また交点がない場合には1e+16以上の値が返り、Ph, Nhは不定となります.
※本関数は交点のジオメトリ情報を取得する関数ですが、内部的にLWのrayShade()を呼び出しています. ShaderManプラグインでは本関数実行中はシェーダの計算を行わない事で再帰呼び出しの対策を行っていますが、LWのrayShade関数は計算の打ち切りを行わない為、検出された交点において他のサーフェスシェーダがrayShadeを実行している場合、再帰呼び出しによる速度低下が発生する可能性があります. また本関数実行中はShaderManのシェーダは実行されない為、交点のサーフェスでShaderManにより法線を変動させている場合、取得される法線情報はこの影響を受けない値になります.float isshadowray()
Shaderが影の計算について実行されている場合は1を、それ以外は0を返します(制限あり、詳細は後述)
※本関数は試験的な実装で、本来LWの機能としてこの情報が取得可能な筈ですが、LWのバグにより正常に所得できません、この為これに相当する処理を全て自前で行っていますが、前述の理由から全てのシャドウレイについて状態が取得できる訳では無く、現状はShaderManシェーダが別のShaderManシェーダに影を落としている場合だけ、その影の計算について本関数は機能します.
ShaderMan以外の他のシェーダやLW標準のサーフェスに対し影を落とす場合のシャドウレイの計算時は本関数は0を返します.
【グローバル変数】
シェーダ内では以下のRenderManシェーダで定義されるパラメータが参照できます.
またRenderMan互換モードではCi, Oi値を設定する事でシェーディング結果を出力できます.
変数名
|
概要
|
変更可否
|
備考
|
color Ci | Color出力 |
○
|
|
color Oi | Opacity出力 |
○
|
|
vectorN | 法線 |
×
|
RenderManの挙動をエミュレートする為、LW上のShaderプラグインに渡されるパラメータとは異なる |
color Cs | Color入力 |
×
|
|
color Os | Opacity入力 |
×
|
|
point P | シェーディング座標 |
×
|
|
vector Ng | ジオメトリ法線 |
×
|
RenderManの挙動をエミュレートする為、LW上のShaderプラグインに渡されるパラメータとは異なる |
float s | テクスチャ座標s値 |
×
|
LW上のcolorチャンネルに指定した最初のテクスチャのマップ座標(平面・円柱・球状・立方体・フロント・UV)の値が使用される VIPER上では正常に機能しません. |
float t | テクスチャ座標t値 |
×
|
LW上のcolorチャンネルに指定した最初のテクスチャのマップ座標(平面・円柱・球状・立方体・フロント・UV)の値が使用される VIPER上では正常に機能しません. |
float u | ジオメトリUV座標 |
×
|
|
float v | ジオメトリUV座標 |
×
|
|
point E | 視点座標 |
×
|
|
vector I | 視線ベクトル |
×
|
|
float time | カレントフレームの時刻 |
×
|
|
float du | U方向微分値 |
×
|
互換性の為のダミー(:=0) |
float dv | V方向微分値 |
×
|
互換性の為のダミー(:=0) |
vector dPdu | U方向接ベクトル |
×
|
互換性の為のダミー(:=0) |
vector dPdv | V方向接ベクトル |
×
|
互換性の為のダミー(:=0) |
color Cl | 光源色 |
×
|
illuminanceループ内でのみ有効 |
vector L | 光源ベクトル |
×
|
illuminanceループ内でのみ有効 |
color Cl0 | 影の影響を受けない光源色 |
×
|
illuminanceループ内でのみ有効、面・線光源では無効、RenderMan非互換(独自拡張機能) |
float Ai | シェーダの不透明度 (Compose Alphaオプションの値) |
○
|
RenderMan非互換(独自拡張機能) |
point Pref | オブジェクト変形前のPの座標 |
×
|
RenderMan非互換(独自拡張機能) |
vector Nref | オブジェクト変形前のN(バンプ等の影響は含まない)のスムージング法線 |
×
|
VIPER上では正常に機能しません. RenderMan非互換(独自拡張機能) |
vector Ngref | オブジェクト変形前のNgのジオメトリ法線 |
×
|
VIPER上では正常に機能しません. RenderMan非互換(独自拡張機能) |
※Pref,NrefはRenderManに準じ"current"座標に変換されています、この為オブジェクト座標などでパターンを生成する場合には該当座標系に変換して使用して下さい.
【グローバル変数(for LW拡張機能)】
シェーダ内から以下の変数名にてLW上で設定されているパラメータの値を参照できます(LW SDKの内容に対応)
またChannelモードでは実際に以下の変数にシェーダから計算結果を設定する事でLWのパラメータを変更できます.
変数名
|
概要
|
変更可否(※1)
|
備考
|
color _Cs | カラー |
○
|
|
float _Kd | 拡散反射率 |
○
|
|
float _Ks | 鏡面反射率 |
○
|
|
float _roughness | 鏡面反射の荒さの値(glossinessの逆数) |
○
|
※2参照 |
float _Kl | 自己照明度 |
○
|
|
float _Kr | 反射率(Rellection) |
○
|
|
float _Kt | 透明度(Transparency) |
○
|
|
float _eta | 屈折率 |
○
|
|
float _Ktl | 半透明度 |
○
|
|
float _c_spec | ハイライトカラー値 |
○
|
|
float _c_rtan | フィルタカラー値 |
○
|
|
float _refl_blur | 反射ブラー値 |
○
|
|
float _tran_blur | 屈折ブラー値 |
○
|
|
float _diff_sharp | Diffuse Sharpnessの値 |
○
|
|
float _add_tran |
Additive Transparencyの値 |
○
|
|
vector _N | 面の法線ベクトル |
○
|
|
vector _N0 | 面のスムージング後のベクトル(バンプ等の影響は含まない) |
×
|
VIPER上では正常に機能しません. |
vector _Ng | 面のジオメトリ法線ベクトル |
×
|
|
vector _Ns | 面の全スムージングベクトル(バンプ等の影響は含まない) |
×
|
幾何的にオブジェクト全域で連続となる外向きのベクトルを与える, VIPER上では正常に機能しません. |
float _spot | シェーディングスポットのレンダリングピクセルにおけるサイズ |
×
|
LWのシェーダに渡されるspot値をアンチエイリアスレベルに応じてスケーリングした値、主にバンプマップの計算に使用する. |
float _sx | シェーディングスポットのレンダリング画像上のx位置(実際のPixel座標) |
×
|
|
float _sy | シェーディングスポットのレンダリング画像上のy位置(実際のPixel座標) |
×
|
|
float _bump_height | 面のバンプに適用されているテクスチャの値(LWテクスチャパネルのグラディエント種Bumpの入力値) |
○
|
※3参照 |
color _Crep | replacement colorの値 |
○
|
Channel Shaderのみ変更は有効、Full Shader(type2)では無効 |
float _Krep | replacement percentageの値 |
○
|
Channel Shaderのみ変更は有効、Full Shader(type2)では無効 |
※1) Full Shader(type2)及びChannel Shaderモード時のみ変更は有効です、但しサーフェスの外観についてはFull(Type2)の場合Ciの値が使用されます.
※2) roughness-glossinessの対応関係をLWの値と完全に一致させるには、それぞれ以下の式により変換可能です.
glossiness := (log(1.0/roughness, 2.0)-2.0)/10.0
roughness := 1.0/pow(2.0, 10.0*glossiness+2.0)
※3) 本プラグインの適用前にLWで適用されているバンプの値(グラディエントのBump入力に使われる値)を表します、本パラメータを出力してもLW自体のレンダリング結果には影響しませんが、シェーダプラグインを複数使用する場合に本プラグインでバンプマッピングを実行している場合、この値を適切に設定する事でこれ以降のプラグインに正確な情報を渡す事が可能になります.
【ライト変数】
シェーダのilluminanceループ内ではlightsource()呼び出しにより、現在評価されている光源について以下の情報を参照できます.
変数名
|
概要
|
float __nondifuse | 光源フラグ, LW上でno diffuseが設定されていれば1、それ以外は0 |
float __nonspecular | 光源フラグ, LW上でno specularが設定されていれば1、それ以外は0 |
float __lighttype |
光源の種類 |
【サポートされる座標空間】
point, normal, vector型
"current" | カレント座標系:="world" (デフォルト) |
"object" | オブジェクト座標系 |
"world" | ワールド座標系 |
"shader" | シェーダ座標系:="object" |
"camera" | カメラ座標系 |
"screen" | スクリーン座標系 |
"raster" | ラスター座標系 |
"NDC" | 正規化ディスプレイ座標系 |
"reference" | リファレンス座標系(参照ジオメトリの座標系) ボーン等の変形前のオブジェクト座標系に相当, RenderMan非互換(独自拡張機能) VIPER上では正常に機能しません. |
※1) "screen", "raster", "NDC"の非直交座標系への変換は他の直交座標系からの変換を想定しており、非可逆変換である事に注意して下さい.
※2) "reference"座標空間自体オブジェクトの変形前後の情報を参照し、Tangent Spaceを介してオブジェクトのポリゴン上に座標系が貼り付いているように変形します.
これにより変形後のオブジェクトについて各シェーディングスポットにおいて座標だけで無くベクトルなどの位置関係まで含めた任意の座標を変形に追従させる事が可能です.
なお各シェーディングスポットでの"reference"空間はそのシェーディングスポットの座標を基準とした直交座標空間内の座標系となっています..
また"reference"座標空間はスムージング法線をポリゴン単位で補間する事により計算されている為、サーフェスのスムージング境界では不連続になります.
color型
"rgb" | rgb色空間 (デフォルト) |
"hsv" | hsv色空間 |
"hsl" | hsl色空間 |
"xyz", "XYZ" | CIE XYZ色空間 |
"xyY" | CIE xyY色空間 |
"YIQ" | YIQ色空間 |
【プラグマ】
プリプロセッサの#pragmaキーワードを使用する事でプラグインのデフォルトオプションやトップレベル引数の設定をシェーダソース上で指定できます.
#pragma option shadertype [full | full1 | full2 | channel]
プラグインオプションの'Shader Type'の設定を指定します、'full'と'full1'の指定は同一です、無指定の場合はfullが指定されます.#pragma option transparent [on | off]
プラグインオプションの'Change Transparency'の設定を指定します、無指定の場合はoffが指定されます.#pragma option stacksize 数値
プラグインオプションの'VM Stack Size'の値を指定します、無指定の場合は規定のサイズが使用されます.#pragma label 変数名 "ラベル"
シェーダのトップレベル引数についてプラグインの表示パネルでのラベルを指定します、無指定の場合は変数名が使用されます.
【使い方のヒントなど】
【備考:LWのシェーダプラグインの種類と他のシェーダープラグインの組み合わせについて】
レンダリングプロセスに限定するとLightwaveは以下の手順でサーフェスのレンダリングを行っています.
1) サーフェスのパラメータとテクスチャから各チャンネル(color,diffuseなど、LWのパネル上の設定に対応)を決定
2) サーフェスのチャンネル情報をシェーダプラグインに渡す
3) 全てのシェーダプラグインを通した結果を元に光源情報やレイトレース情報と組み合わせて陰影を付ける.
4) 結果をレンダリング画像のピクセル色とする
またここで3)のプロセスでの最終出力(表示されるピクセル色)については2)のシェーダプラグインで予め計算した値で上書きする事を指定できます.
結果としてLightwave上で動作するシェーダプラグインには大別すると以下の2種類に分けられます.
- LWのチャンネル(colorやdiffuseなど)の操作し3)のシェーディング(照明計算)自体はLWのアルゴリズムを使用するもの(以下チャンネルシェーダと呼称)
- LWのシェーディング結果を独自の計算結果で置き換えるもの(以下フルシェーダと呼称)
前者のチャンネルシェーダについては複数重ね合わせても機能しますし、場合によっては重ね合わせる事で複雑なサーフェスを表現する事を意図して作成されています. これに対しフルシェーダの場合にはサーフェス上で前者のシェーダが適用された後の一番最後のスロットに基本的には1種類だけ適用できます.
基本的にプロシージャルテクスチャの拡張機能としてのシェーダはチャンネルシェーダに、LWの標準では存在しない照明効果や影の影響などを表現するタイプのシェーダはフルシェーダに分類されるケースが多いです(簡単な確認方法としてシェーダが適用されたサーフェスのレンダリング結果にLWのシェーディングノイズ除去機能を適用した場合、ノイズ除去機能が動作する場合はチャンネルシェーダ、機能しない場合はフルシェーダが適用されています)
本プラグインの場合シェーダのモードで'Channel Shader'の場合にはチャンネルシェーダとして、'Full Shader'の場合にはフルシェーダとして機能します、なお'Full Shader'モードであっても'Shader Alpha'パラメータを使用する事で複数のShaderManシェーダをレイヤー状に重ね合わせる事は可能です.
またこれら2種以外の種類のシェーダとしてはレンダリング時にサーフェスの情報を集めて、その時点では何も行わずピクセルフィルタ等でシェーダから収集した情報を元にエフェクトをかけるものもあり、これは収集される情報にもよりますが、シェーダの適用数は余り意識する必要はありませんが、最適な情報を収集させる為にチャンネルシェーダの後、フルシェーダの前に適用するのが良いと思われます.
なおフルシェーダの実現形態には主に以下の2通りの方法があります.
- サーフェスプラグインのreplacement_percentageを100%に設定しreplacement_colorにシェーディング結果を格納するもの(LW7以降のインターフェイス、本シェーダでもこの方式を使用)
- サーフェスプラグインのcolorにシェーディング結果を格納し、拡散・鏡面反射を0%として自己発光度を100%とするもの(LW6以前対応のものに多い、GI・透明体との相性は余り良くない)
またLW標準で付属するシェーダプラグインの場合
チャンネルシェーダ:
Fast/Real Fresnel, Edge_Transparency, Interference, Thin Film, Z Shaderなど
フルシェーダ:
BESM, BRDF, Super Cel Shader, Halftoneなど
※チャンネルシェーダ, フルシェーダの呼称は説明の為に用いたもので一般的な呼称とは異なる場合があります.
【備考2:Full Shaderタイプのシェーディング方式について】
※このセクションはSDKの詳しい知識があるユーザー向けに書かれています.
Full Shader(type1,type2共に)指定時、本プラグインではシェーダの出力Ci, Oiの値を元にLWShaderAccess構造体のreplacement_colorメンバの値をCiにOiによる背後のオブジェクトの影響を加味した値を設定、replacement_percentageメンバの値を1.0に設定しています. また'Change Transparency'オプションが指定されている場合にはOiの値を影の色に反映させる為(RenderMan互換)LWShaderAccess構造体のcolorメンバをOiを反転した値を設定、transparencyとcolorFLメンバに1.0をセットしています、またそれ以外のパラメータについては変更していません.
またFull Shader(type2)指定時はOiの影に対する影響の計算は行われない為、影の色についてはLWのチャンネルに設定した値、もしくはシェーダ内で設定した値が使用されています. これを利用する事でisshadowray()が使用不可能な環境での影の色の指定や反射・屈折によりコースティクスを投げかけるサーフェスをサポートする事が可能になります.
【その他・制限事項等】
1) 多角形ポリゴンと線・面光源の制限事項
LWのUVマップ座標をシェーダのテクスチャ座標s,tとして渡す場合サポートされるのは3or4角ポリゴンのみで、それ以上の多角形についてはサポートしていません、その他の投影方式についてはこの制限はありません.
面・線光源に対するilluminance文の呼び出しは実際に影になっていない、もしくは半影のレイについてのみ評価され、影になっている部分についてはilluminance文の内容は呼び出されません、その他の光源では影の場合にもCl=0としてilluminanceループが呼び出されます、また面・線光源での影の色の設定はサポートされません.
2) LW標準レンダリング機能との相性上の制限事項
サーフェス(質感設定)のプレビューはModeler上では動作しません、またSurface BakerでのShader結果の焼き込みには対応していません.
'Full Shader'モードで使用した場合LW本体のシェーディングノイズ除去機能やレンダリング画像のサーフェスパラメータのチャンネル単位の参照機能は機能しません(理由は前述のシェーダプラグインの分類に関する記述を参照) またそれに伴いレンダリング結果の一部のチャンネルのみを参照してエフェクトを加えるようなPixel/Image Filterはそのチャンネルを参照できません.
ライト設定の影の色については反映されません.
LWの仕様上、VIPERでのプレビュー時にはシェーダプラグインに一部の情報が正確に渡されない為、レンダリング時と結果が異なる・意図した通りにレンダリングされない可能性があります. 具体的にはには"reference"座標系や参照法線、_N0変数、st座標が制限される為、VIPERを想定したシェーダを作成する場合、変形まで含めたパターン生成を行う場合の参照情報はPrefのみの使用に限定されます. バンプについては"object"座標での処理でも"それ程"問題は発生しません(オブジェクトの変形前後で微小面積が大きく異なる場合には問題になります)LWのサーフェスエディタでのプレビュー/本番レンダリング時には問題ありません.
3) シェーディング言語上の制限事項
illuminanceループのネストはサポートしていませんが(RenderMan仕様に準ずる)ネストが存在した場合にもコンパイル時エラーとしては検出されない為、注意が必要です(最悪無限ループになります)
isshadowray()はilluminance文/pointilluminance()関数によるShaderManシェーダから呼び出された影の計算の場合についてのみ正確な値を返します. またシャドウレイ計算中に再度のilluminance文/pointilluminance()関数が呼び出された場合無効となり、この場合照明は照らされていないものとして扱われます.
RenderManのキャスト演算は変数宣言との文法的な曖昧さを伴い、また本プラグイン内部では全て3次元ベクトルとして処理している為サポートしていません、構文解析上の問題ともなるのでキャスト演算は無視されるのでは無くエラーとなります. この為既存のシェーダを移植する場合にはキャスト演算子を削除する必要があります、またベクトル型のスカラ型への明示的なキャストは一旦float型の変数に代入する事で可能です(但しこの表記法はRenderMan非互換となります)
RenderManにおける参照ジオメトリに該当するPref,Nref,Ngref変数はvaryingなシェーダ引数ではなく、Global変数として定義されている為、シェーダ引数として該当変数を記述してしまうと定義が上書きされてしまう為注意が必要です.
4) Full Shader(type1)での屈折を含む透明体の表現に関する制限事項とFull Shader(type2)について
Full Shader(type1)モードでは反射・屈折により他のサーフェスにコースティクスを投げかけるサーフェスは通常ではサポートされていません. また通常RenderMan互換のレンダラでガラスなどの屈折を持った透明体を表現する場合、通常のレイについてはCiに屈折のトレース結果を格納しOiを1(不透明)に設定し、シャドウレイの場合に色付きの影を表現する透明度(を反転した値)をOiに設定しますが、本プラグインにおいてはシャドウレイを判別するisshadowray()関数の使用に制限がある事から、この手法が制限される場合があります.
これらコースティクス及び通常サーフェスでの影の表現の問題を解決する場合、Full Shader(type2)を使用します. Full Shader(type1)の場合には本プラグインは'Change Transparency'オプションが指定されている場合RenderManと同様Oiの値を影の色の値としますが、Full Shader(type2)が指定された場合には、Oiの値はサーフェスの直接の見え方のみに影響し、影の色については_Ci, _Kt, _c_specの値により制御されます.
コースティクスの場合、LWの仕様ではコースティクスの計算時にはサーフェスのカスタムシェーディングの値は無視され、サーフェス色, 鏡面反射率, 透明度, 屈折インデックス, ハイライト色, 屈折インデックスが使用されます. 通常Full Shader(type1)では透明度はOiの値が使用される為、コースティクスを発生するサーフェスが正確に表現できませんが、Full Shader(type2)では _Ci, _Kr, _Kt, _eta, _c_spec, _c_tranに適切な値を設定する事でシェーダ内でコースティクスを投げかけるサーフェスの設定を行う事が可能です.
また前述のisshadowray()が使えない場合のFull Shader(type2)による透明体表現の場合にこのオプションを設定し、_Ci, _Kt, _c_specを適切に設定する事で影の色をコントロールする事も可能です(但しコースティクスの場合と同様影に対するOiの設定は無視されます)
この手法の詳細についてはサンプルシェーダ及び備考2を参照して下さい.
5) SSS/ボリュームシェーダを記述する際の制限事項
LWの制約上、あるIDを持つポリゴン上の点からrayCast,rayShade(raycast,rayhittestで使用)などのレイトレース関数を実行する場合、シェーディングされるポリゴンにレイが衝突した場合衝突は検出されません(再入を避ける為LW本体がそういう方式になっています).
この為SSSシェーダやボリュームシェーダでレイトレース関数を用いてサンプリングポイントを見積もる場合、同一ポリゴンを検出する可能性がある場合には内向きのポリゴン(透明度:=100%)を別途作成し(両面ポリゴンは不可)これをマージしないで(マージすると同一ポリゴンと判断される為)配置する必要があります.
またサブパッチの場合は同一オブジェクト内に存在する同一座標の頂点はフリーズ後にマージされてしまう為、内向きポリゴンをレイヤー分けして別オブジェクトにする等の工夫が必要になります.
【再配布・要望・著作権等】
作者の面倒にならない範囲であれば営利であろうが非営利であろうが、再配布であろうが好きなように扱って下さって構いません.
バグレポートは歓迎しますが、ユーザーインターフェイスの改善等は、元々自分用ツールである為、必要と判断しなければ実行するつもりはありません.
【開発履歴】
v0.40[beta] | 公開 |
v0.42[beta] | コンパイラ: 変数宣言のブロックスコープをサポート 変数宣言スコープルールをよりRenderMan系コンパイラのものに準拠するよう修正 output指定されていない関数引数への代入をエラーとした(動作上は問題無いが互換性の為) faceforwardのデフォルト引数のバグ修正 lightsource呼び出しの追加("__nondiffuse", "__nonspecular"パラメータのみ) VM&プラグイン: ※旧バージョンでコンパイルしたシェーダファイルは再コンパイルが必要です. |
v0.43[beta] |
コンパイラ: VM&プラグイン: その他: ※旧バージョンでコンパイルしたシェーダファイルは再コンパイルが必要です. |
v0.45[beta] |
コンパイラ: VM&プラグイン: |
v0.48 |
正式リリース版 コンパイラ: VM&プラグイン: ※旧バージョンでコンパイルしたシェーダファイルは再コンパイルが必要です. |
v0.50 |
コンパイラ: |
v0.55 |
コンパイラ: VM&プラグイン: ※旧バージョンでコンパイルしたシェーダファイルは再コンパイルが必要です. |
Yu Umebayashi / Tabo
メールアドレス収集ロボット対策の為メールアドレスはHP上に記載しておりません、
ソフト内のドキュメントには記載しておりますので、御用の方はそちらまでお願いします