株式会社デジタル・フロンティア-Digital Frontier

Header

Main

  • TOP
  • DF TALK
  • Mental Ray Shader の作り方 -output shader編-

Mental Ray Shader の作り方 -output shader編-

2012/6/13

Tag: ,,

お久しぶりです。 コニーです。
今回はmentalray shader plugin について話したいと思います。
mentalray中にはいろんなshader typeがありますが、その中でoutput shaderを作ってみようと思います。

■ mentalray shader type


Material
Shadow
Volume
Displacement
Photon
Texture
Environment
Light
Lightmap
Lens
Output
Geometry
Contours

これから説明する流れ順は
1. .mi の作り方。
2. .dll の作り方。
3. mayaでcameraとoutput shader nodeをconnectする方法。
4. 参考サイト。
になります。



1. .mi の作り方。




1-1.  mayaで使うoutput shader のUIを作りたいと思います。

まずはnotepadを開き、以下codeを記入し保存します。

declare shader
        color "DF_TALK_OUT_invert"
	(
	)
        version 1
        apply output
end declare

保存する時は拡張子は .miにし、以下の場所に配置しましょう。

mayaインストールpath\mentalray\include

(私は、ファイル名前をdfTalkInvert.miにしました。)

mayaを起動しpluginを確認しましょう。 

Window -> Settings/Preferences -> Plugin-in Manager 

から Mayatomr.mllをチェックを入れましょう。

Window -> Rendering Editors -> mental ray -> Shader Manager 

から 先保存した.miファイルにチェックをいれましょう。

hypershaderから確認したらoutputカテゴリに表示されていることが分かると思います。

011


1-2 attributeを追加してみましょう。

declare shader
        color "DF_TALK_OUT_invert"
		(    
			boolean	"on"  #: default true
		)
        version 1
        apply output
end declare

() 中に boolean “on” #: default true を追加して.miファイルを更新しましょう。

mayaを再起動してからhypershaderで確認すると、
DF_TALK_OUT_invertノードにcheck boxが追加されていることを分かると思います。

012


1-3 コードについて説明します。

declare shader
        color "DF_TALK_OUT_invert"
		(    
			boolean	"on"  #: default true
		)
        version 1
        apply output
end declare

1行と8行 - shaderの宣言と、宣言の終わりです。
2行 - colorはreturn value 、”DF_TALK_OUT_invert” はノードの名前になります。
3~5行まで - () 中に attriubteを記入します。
6行 - version 1 は あとで説明する .dllとは version管理のために使います。
気をつけてほしいのは versionの数値はintで記入する必要があります。 floatは使わないでください。
7行 apply は hypershaderで表示されるカテゴリを意味します。 apply texture と記入すると
hypershaderの Textures カテゴリに表示されます。



2. .dllの作り方。


2-1 .dll作成について

以下はc++で書いたコードです。 コンパイルして.dllファイルを以下のpathへコピーしてください。

mayaインストールpath\mentalray\lib

 
(私は、ファイル名前をdfTalkInvert.dllにしました。)

#include <shader.h>

struct DF_TALK_OUT_invert
{
	miBoolean on;
};

extern "C" DLLEXPORT int DF_TALK_OUT_invert_version(void) {return(1);}

extern "C" DLLEXPORT miBoolean DF_TALK_OUT_invert(void *result, miState *state, struct DF_TALK_OUT_invert *attr)
{
	miBoolean on = *mi_eval_boolean(&attr->on);
	if(on != miTRUE)
		return miFALSE;
	
	miImg_image *fb = mi_output_image_open(state, miRC_IMAGE_RGBA);

	int x_res = state->camera->x_resolution;
	int y_res = state->camera->y_resolution;

	for (int y = 0 ; y < y_res ; y++ )
	{
		for (int x = 0 ; x < x_res ; x++)
		{
			miColor pixel;
			mi_img_get_color(fb, &pixel, x, y);
			pixel.r = 1.0 - pixel.r;
			pixel.g = 1.0 - pixel.g;
			pixel.b = 1.0 - pixel.b;
			mi_img_put_color(fb, &pixel, x, y);
		}
	}

	mi_output_image_close(state, miRC_IMAGE_RGBA);
	return miTRUE;

}
&#91;/c&#93;


<span style="color: #11bb11;">
2-2  コードについて説明します。
</span>

<span style="color: #ff6600;">1行</span style> 
<img src="https://dftalk.jp/cp-bin/wordpress/wp-content/uploads/2012/06/021.jpg" alt="021" />

mentalray shaderを書くためのheaderファイルをincludeします。

<span style="color: #ff6600;">3行~6行</span style> 
<img src="https://dftalk.jp/cp-bin/wordpress/wp-content/uploads/2012/06/022.jpg" alt="022" />
このstructは .miで記入した attributeからvalueを得るinterfaceになります。

<span style="color: #ff6600;">8行</span style> 
<img src="https://dftalk.jp/cp-bin/wordpress/wp-content/uploads/2012/06/023.jpg" alt="023" />
関数の名前は.miに記入したノードの名前に _version()を付ける必要があります。
return(1)には .miで記入したversionの数値と同じものを記入します。


<span style="color: #ff6600;">10行~11行と37行</span style> 
<img src="https://dftalk.jp/cp-bin/wordpress/wp-content/uploads/2012/06/0241.jpg" alt="0241" />
処理のメインになる関数です。.miで記入したノードの名前と同じ名前にします。

<span style="color: #ff6600;">12行~14行</span style> 
<img src="https://dftalk.jp/cp-bin/wordpress/wp-content/uploads/2012/06/025.jpg" alt="025" />
DF_TALK_OUT_invert のノードに on attributeにチェックが外されていると、処理はしません。

<span style="color: #ff6600;">16行</span style> 
<img src="https://dftalk.jp/cp-bin/wordpress/wp-content/uploads/2012/06/026.jpg" alt="026" />
レンダリングされたイメージをframebufferに保存します。

<span style="color: #ff6600;">18行~19行</span style> 
<img src="https://dftalk.jp/cp-bin/wordpress/wp-content/uploads/2012/06/027.jpg" alt="027" />

レンダリングサイズ xとyを得ます。

<span style="color: #ff6600;">21行~32行</span style> 
<img src="https://dftalk.jp/cp-bin/wordpress/wp-content/uploads/2012/06/028.jpg" alt="028" />

これはpixelごとにカラーを処理することになります。

mi_img_get_color(fb, &pixel, x, y); 現在xy座標のcolor情報を得る。
mi_img_put_color(fb, &pixel, x, y); 現在xy座標にcolor情報を設定する。

mi_img_get_color()とmi_img_put_color()間に
colorを処理したい方程式をいれます。
たとえば、カラーをgray scaleに変換したい場合は
[c]
//gray scaleの場合
pixel.r =  (pixel.r + pixel.g + pixel.b) / 3.0;
pixel.g =  (pixel.r + pixel.g + pixel.b) / 3.0;
pixel.b =  (pixel.r + pixel.g + pixel.b) / 3.0;

34行~35行 
029
イメージ処理を終了します。return 結果をTrueにします。



3. mayaでcameraとoutput shader nodeをconnectする方法。


cameraとoutput shaderをconnectionして見ましょう。

3-1.  connection。

レンダリングするcameraノードを選択します。(transformノードではありません)
mentalray -> Output shaders で Createを押します。
mentalrayOutputPassノードが作成されます。
Output Shader のチェックbuttonをクリックしてoutput shaderを選択します。

このままレンダリングするとmayaが落ちるか停止してしまいます。mayaのバグです。


3-2.  connection 修正。

connectionされている .message を .outValueに修正する必要があります。

outputShaderノード.message -> mentalrayOutputPassノード.outputShader

になっているconnectionを

outputShaderノード.outValue-> mentalrayOutputPassノード.outputShader

に直してください。
031
(今、テストしているmaya2012では直ってないです。maya2013で直っていればいいですね)

チェックを入れてレンダリングするとカラーが反転します。

032



4. 参考サイト

http://docs.autodesk.com/MENTALRAY/2012/JPN/mental%20ray%203.9%20Help/index.html
http://docs.autodesk.com/MENTALRAY/2012/JPN/mental%20ray%203.9%20Help/files/manual/node114.html#SECTION112
http://docs.autodesk.com/MENTALRAY/2012/JPN/mental%20ray%203.9%20Help/files/manual/node126.html#SECTION124

以上です。 読んでくれてありがとうございます。

Pocket

コメント

コメントはありません

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

*