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を記入し保存します。
1 2 3 4 5 6 7 | 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を追加してみましょう。
1 2 3 4 5 6 7 8 | 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 コードについて説明します。
1 2 3 4 5 6 7 8 | 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にしました。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | #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
以上です。 読んでくれてありがとうございます。
コメント
コメントフォーム