Mental Ray Shader の作り方 -output shader編-
2012/6/13
お久しぶりです。 コニーです。
今回は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カテゴリに表示されていることが分かると思います。
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が追加されていることを分かると思います。
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; } [/c] <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行
イメージ処理を終了します。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
に直してください。
(今、テストしているmaya2012では直ってないです。maya2013で直っていればいいですね)
チェックを入れてレンダリングするとカラーが反転します。
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
以上です。 読んでくれてありがとうございます。
コメント
コメントフォーム