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

Header

Main

◆移植オペ(上巻)◆

2011/1/11

Tag: ,,

皆様☆新年明けましておめでとうございます!
2011年もどうぞよろしくお願いします。

皆さんはどのようなお正月でしたでしょうか?
”医龍3”を再度見返してみた開発室のDr.ゴトーです。
元々は救命病棟24の進藤ファンだったのですが医龍にもがっつりハマってしまいました。朝田△!!
最近の医療モノはバチスタやらロスやら何かと術式が出てきますね。
実は私もオペ幾つか受けたことあるんですけど、そりゃあもうここでは到底お話出来ないXOネタなので
今回は別のオペ談をちょっと話そうかと。

現在Web上でMentalrayのシェーダーを探すとフリーで配布されているものも結構ありますよね。
「自分が使いたいのはまさにこのシェーダー!あった~!!」と思いきやMaya用のものしか無い!しかも32bitのみ・・・Orz
な~んて落ちだったりします。
じゃあSoftimageへ移植オペしちゃえ~!(ソース有りが前提)というのが今回のネタです。
実際にデザイナーより要望があった案件で少し古いネタではありますが、数回にわけてオペ記録を紹介しようかと思います。
※当方、Mentalrayシェーダーについて、それほど精通してるわけではないので誤認もあるかもですが、ご了承ください

皆さん、CG背景からIBL用Envマップを作成したい場合はどうされてます?
Softimageユーザーからすると天球にRenderMapで焼きこんじゃう方法もありでしょうが、
ここではシェーダーでEnvマップ化する方法を通してMaya用のシェーダーをSoftimageに移植した例を紹介します。

今回のドナーはRalf Habel氏。感謝です!氏作のMentalrayシェーダで3DシーンからEnvマップを生成するレンズシェーダです。

http://www.vi-motion.de/latlong_Tutorial/

このシェーダはMentalray for Maya用なので、そのままではSoftimageで使用できません*1
しかも32bit版しかコンパイルされてません。でもソースが提供されているので、習学も含めオリジナルにちょっと手を入れてSoftimage2010sp1(x64)に実装してみます。

*1・・・2011以降は新機能のおかげで使えたりしちゃったりも☆ そのネタはまた次の機会にでも! ^^

SoftimageでのMentalrayシェーダーとは?(~si2010まで)

Mentalrayのシェーダーは基本的に.mi, .dllによって構成されているのですが、Softimageでは.spdl, .dllという構成で実装されています。
.spdlはSoftimage独自のファイルで主にシェーダーパラメーター、パラメーターレイアウト、.dllとのリンクなどの情報が記述されています。

従って.mi, .dllから.spdl, .dllを生成する必要があります。

<MRシェーダー移植術>

今回、若干の拡張+64bitコンパイルが必要だったので次の方法で行いました。
1. SoftimageのShaderWizardを使いパラメータやレイアウトを定義して、必要なファイル(.spdl, VC++用Templateファイル)を生成。
2. 生成されたテンプレート(.vcproj)をVC++で開き、DownLoadしたソース(.h, .cpp)のコードをテンプレート側に移植し、変数名などを合わせる。
3. VC++でx64ビルドし、.dllを生成。
4. 適切なフォルダに.spdl, .dllをコピーし、Softimageへ登録
という流れになります。

ではこれより、”ShaderWizrdによるMRシェーダー移植術開始しまっす!”


1. ShaderWizardによるspdl及びVC++テンプレート作成

まずDownloadしたソース(.h, .cpp, .mi等)から、シェーダーの情報を判断します。
ファイルを見るとシェーダー名、タイプ、パラメーター等が解ります。
これらの情報からXSIのShaderWizardを使ってspdlとVC++用Templateファイル)を作成します。

=== .miファイル ==
declare shader
color “
latlong_lens” (
booleanflipHorizontal” #: default 0
)
version 1
apply
lens
scanline off
trace on

#: nodeid 58675
end declare

=== .hファイル ===
#ifndef _LATLONG_LENS_H_
#define _LATLONG_LENS_H_

#include <math.h>
#include <shader.h>

typedef struct
{
miBoolean m_vmirror;
} latlong_lens_params;
・・・・

ここで.mi側のbooleanパラメータ名(flipHorizontal)と.h側のmiBooleanパラメータ名(m_vmirror)が違ってます。
これってええのんかぁ~(゚д゚)!? でも問題なく動くみたいです。我がチームのエロ男爵Hとも話したところ、どうやら.mi側で定義されているパラメータの順番と.h側のstruct内での型・定義順が合ってれば問題ないようです。解り易くパラメータ名を合わせた方が良いと思いますが、どうやらこの様にしておくとMayaでの表示上は.mi側のパラメータ名(flipHorizontal)で表示されるようです。
今回の移植オペではShaderWizard内でパラメータ名やラベル名は別途定義できるのでそちらでやっちまいます。
またscanline off, trace onですが今回はeyeレイを弄ってlat/long化してますのでRayTrace Onしないといけません。
実はこの記述を見逃していて少しハマりました。(´・ω・`) この辺りの計算部分については次回お話する予定です。

ではオペmov.1をどうぞ!

※画像の乱れはコーデックによるものです。ご了承ください

2. .cppファイルへコード移植

Wizardで生成されたテンプレート(.vcproj)をVC++で開き、オリジナルソース(.h, .cpp)を参照し、テンプレート側に移植し、変数名等を合わせる。

3. DLLのビルド

・使用環境に合わせ構成マネージャにてソリューション構成:Release x64,  プラットフォーム:x64へ変更。
・構成プロパティ⇒C/C++⇒コード生成⇒ランタイムライブラリを/MTへ変更。

あとはビルドを実行しコンパイル!

しか~~し!bufferoverflowU.libを開けまてん!とエラー吐いてビルド出来ず! Σ(゚д゚lll)ガーン
もしか・・・と思いVSのversionを見てみると2008。。。
これかと思いVS2005にて試してみるとすんなりビルド完成!
なんじゃろ~と思いつつ我らのネ申こと、D社Iさんにお聞きしてみたところ、
ShaderWizardで作られる.vcprojのversionが未だ7.10だということが判明! Iさん、あざっす!
PluginWizardの方はsi2010sp1⇒version 8, si2011⇒version 9なのに。
でもこれが原因なの?厳密には特定してませんがVS2005で問題なくコンパイル出来たのでとりあえず良しとしるw
※どなたか原因&解決策ご存知の方はどうかコチラまでご一報を!(゚∀゚)神のヨカーン

というわけで、オペmov.2

※画像の乱れはコーデックによるものです。ご了承ください

というわけでとりあえずオリジナルコードのままですが”ShaderWizrdによるMRシェーダー移植オペ” 終~了!

如何だったでしょう?今回のシェーダーはパラメータも少なく初めての移植オペには良いかと。。。
ぜひ皆さんもネット上に落ちているシェーダーリソースを活用してみてはいかがでしょう。

そろそろお時間が来たようなので今回はここまでということで ^^
次回は習学も含めオリジナルにちょっと手を入れ、”より簡便に使えるモードを追加してみる(下巻)”です。
それではまた~


Pocket

コメント

[…] 過去ネタで”maya用にコンパイルされたShaderの移植術”をやった訳ですが si2011以降で実装されたsandboxのダイナミックシェーダービルド機能のおかげで siもspdlから解放され移植なしでシェーダを使えるようになりやした!ヽ(゚∀゚)ノワーイ […]

1 thought on “◆移植オペ(上巻)◆”

コメントフォーム

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

*