Contour Rendering

Contour を使ったシェーダー

mentalray において Contour を使用すると、きれいな輪郭線をレンダリングすることができます。
Ramp Shader などと組み合わせてトゥーンシェーダーとして利用すると良いでしょう。

注意

ここでは Mentalray を使用するので、 プラグインの Mayatomr.so が読み込まれている必要があります。
contour1.mel を実行して、
// Warning: line 25: Unrecognized node type 'mentalrayFramebuffer'
などという警告が出る場合は Window → Settings/Preferences → Plug-in Manager... から Mayatomr.so をロードしてください。

Contour を使ったシェーダーの例

オブジェクトをいくつか作成し、それらに Contour の設定をしたマテリアルをアサインするスクリプトです。
このスクリプトでは輪郭線のみをレンダリングしています。

  1. 以下の MEL スクリプトを contour1.mel という名前で作ります。
    global proc contour1()
    {
    	string $sname[] = `sphere`;
    	string $coname[] = `cone`;
    	move 0 0 3;
    	string $cyname[] = `cylinder`;
    	move 3 0 0;
    	string $plname[] = `nurbsPlane -ax 0 1 0 -w 10`;
    	move 0 -2 0;
    
    	string $shname = `shadingNode -asShader lambert`;
    	string $setname = `sets -renderable true -noSurfaceShader true -empty`;
    	connectAttr -f ($shname + ".outColor") ($setname + ".surfaceShader");
    
    	select -r $sname[0] $coname[0] $cyname[0] $plname[0];
    	sets -e -forceElement $setname;
    
    	setAttr ($setname + ".miContourEnable") 1;
    	setAttr ($setname + ".miContourColor") -type double3 1 0 0 ;
    	setAttr ($setname + ".miContourRelativeWidth") 1;
    	setAttr ($setname + ".miContourWidth") 0.5;
    
    	if(! `objExists miDefaultFramebuffer`)
    	{
    		createNode mentalrayFramebuffer -n miDefaultFramebuffer;
    	}
    	setAttr "miDefaultFramebuffer.contourEnable" 1;
    	setAttr "miDefaultFramebuffer.contourClearImage" 1;
    	setAttr "miDefaultFramebuffer.contourClearColor" -type double3 0 0 0 ;
    
    	setAttr "miDefaultFramebuffer.contourSamples" 1;
    	setAttr "miDefaultFramebuffer.contourFilter" 0;
    	setAttr "miDefaultFramebuffer.contourFilterSupport" 1.0;
    
    	if(! `objExists miDefaultOptions`)
    	{
    		createNode mentalrayOptions  -n miDefaultOptions;
    	}
    	setAttr "miDefaultOptions.contourInstance" 1;
    	setAttr "miDefaultOptions.contourInvNormal" 1;
    }
    
  2. Script EditorFile → Source Script によって contour1.mel を読み込みます。
  3. Script Editor のインプットウインドウで、contour1() を実行します。
    (contour1() 実行後の図)
    [contour1() 実行後の図]
  4. レンダリングを実行します。
    (Render View のレンダリング方法を mental ray にしておく必要があります)
    [レンダリング実行の図]

スクリプトの解説

global proc contour1()
contour1 というプロシージャの宣言です。
string $sname[] = `sphere`;
ここからマテリアルにアサインするために 4 種類のプリミティブを作成してゆきます。
まず、NURBS の球を作成します。
string $coname[] = `cone`;
NURBS の Cone を作成します。
move 0 0 3;
Cone を (0, 0, 3) の位置に移動します。
string $cyname[] = `cylinder`;
NURBS の Cylinder を作成します。
move 3 0 0;
Cylinder を (3, 0, 0) の位置に移動します。
string $plname[] = `nurbsPlane -ax 0 1 0 -w 10`;
NURBS の Plane を作成します。
move 0 -2 0;
Plane を (0, -2, 0) の位置に移動します。
string $shname = `shadingNode -asShader lambert`;
lambert マテリアルを作成します。
string $setname = `sets -renderable true -noSurfaceShader true -empty`;
オブジェクトをマテリアルにアサインするためのセットを作ります。
-renderable true
作られたセットはシェーディンググループになって、 renderPartition ノードにコネクトされます。
-noSurfaceShader true
デフォールトのマテリアルにコネクトしません。 上で作ったマテリアル $sname にコネクトするためです。
-empty
空のセットを作ります。 セレクトされているオブジェクトがあっても、 このセットに加えないようにします。 この後に実行する set コマンドでセットに加えたいオブジェクトをセレクトして、セットに加えています。
connectAttr -f ($shname + ".outColor") ($setname + ".surfaceShader");
マテリアル(lambert)の色情報を表す outColor アトリビュートを、 セットの surfaceShader アトリビュートにコネクトします。 これで、マテリアル $sname がレンダリング可能になります。
select -r $sname[0] $coname[0] $cyname[0] $plname[0];
作成しておいたプリミティブをセレクトします。
sets -e -forceElement $setname;
セレクトされたプリミティブを、lambert マテリアルにアサインします。
setAttr ($setname + ".miContourEnable") 1;
シェーディンググループの miContourEnable アトリビュートに 1 を設定します。
これによって、ここで作成した lambert マテリアルで Contour を使用したレンダリングが可能になります。
setAttr ($setname + ".miContourColor") -type double3 1 0 0 ;
Contour によって描かれる輪郭線の色を赤(1, 0, 0)にします。
setAttr ($setname + ".miContourRelativeWidth") 1;
Contour によって描かれる輪郭線の太さの値を絶対的な数値とします。
これによってレンダリング解像度が変わっても輪郭線の太さは miContourWidth によって決められた数値になります。
このアトリビュートを 0 にするとレンダリング解像度によって線の太さが変わります。
setAttr ($setname + ".miContourWidth") 0.5;
Contour によって描かれる輪郭線の太さを 0.5 にします。
if(! `objExists miDefaultFramebuffer`)
{
  createNode mentalrayFramebuffer -n miDefaultFramebuffer;
}
もし、miDefaultFramebuffer という名前のノードが存在しないときは mentalrayFramebuffer ノードを miDefaultFramebuffer という名前で作成します。
miDefaultFramebuffer によって Contour レンダリング時のさまざまなアトリビュートを設定します。
setAttr "miDefaultFramebuffer.contourEnable" 1;
レンダリング時の Contour Rendering を可能にします。
setAttr "miDefaultFramebuffer.contourClearImage" 1;
レンダリング時にオブジェクト表面のマテリアルをレンダリングしません。 輪郭線のみがレンダリングされます。
contourClearImage アトリビュートを 0 にするとオブジェクトもレンダリングされます。
setAttr "miDefaultFramebuffer.contourClearColor" -type double3 0 0 0 ;
レンダリング時のバックの色を黒(0, 0, 0)にします。
setAttr "miDefaultFramebuffer.contourSamples" 1;
レンダリング時のサンプリング数を 1 にします。
この値をあげるとレンダリングの精度が上がります。
setAttr "miDefaultFramebuffer.contourFilter" 0;
Box Filter によってフィルタリングを行います。
フィルタリングによって輪郭線をなめらかに(平滑化)することができます。
フィルタリングの種類は以下の通りです。
0
Box Filter
1
Triangle Filter
2
Gaussian Filter
setAttr "miDefaultFramebuffer.contourFilterSupport" 1.0;
フィルターの係数を 1.0 にします。
この値が大きい程、レンダリング結果にフィルターがかかります。
if(! `objExists miDefaultOptions`)
{
  createNode mentalrayOptions -n miDefaultOptions;
}
miDefaultOptions という名前のノードが存在しないときは mentalrayOptions ノードを miDefaultOptions という名前で作成します。
miDefaultOptions によって、どのような方法で輪郭線を描くかを決めることができます。
setAttr "miDefaultOptions.contourInstance" 1;
インスタンスの境界に輪郭線を描きます。
setAttr "miDefaultOptions.contourInvNormal" 1;
法線が逆向きになるところに輪郭線を描きます。

Tips (Contour の種類)

miDefaultOptions のアトリビュートには以下の種類があります。
これらのアトリビュートを 1 つ以上 1 に設定することによって、 様々な方法で輪郭線を描くことができます。

contourBackground
オブジェクトと何もないバックとの境界に輪郭線を描きます。
contourPriIdx
ポリゴンなどの境界に輪郭線を描きます。
テセレーションを確認することができます。
contourInstance
インスタンス同士の境界に輪郭線を描きます。
contourMaterial
違うマテリアルの境界に輪郭線を描きます。
contourLabel
違うラベルの境界に輪郭線を描きます。
contourNormalGeom
法線の向きが違うオブジェクト間に輪郭線を描きます。
contourInvNormal
法線の向きが逆向きのオブジェクト間に輪郭線を描きます。
具体的には、法線間の角度が 90 度以上になった場合に輪郭線が描かれます。

練習

練習課題

参考


Prev | Next
Home | Contents
Mail