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

Header

Main

  • TOP
  • DF TALK
  • 役に立たないCGにまつわるどうでもいい話3

役に立たないCGにまつわるどうでもいい話3

2011/8/8

Tag: ,,,,

皆さん、お久しぶりです。Jです。
鉄拳のプロジェクト終了後、東北のある地域に行って短い期間ですが、真っ黒になるほど復興を手伝いにいってきました。
皆さんが思うより、まだ多くの助けが必要なので皆さんも余裕があったらできれば様々な形で東北を助けあいましょう!

さて、遂に弊社が総力を挙げて世の中に送り出した鉄拳 ブラッド・ベンジェンスもアメリカで公開されました。
日本では9月3日公開予定ですので皆さんも是非劇場に足を運んで立体で広がる物語を楽しんでください。

ではあまり役に立たないCGにまつわるどうでもいい話3の始まり始まり~
鉄拳のレンダリングであった怖い話をしたいと思います。
鉄拳のレンダリングが盛んに行われたいたある日、
デザイナーK:Jさん、この背景のシーン原因が分からないんですけど一枚レンダリングするのに2時間近くかかるんですよ。
オッサンJ:え~、嘘だ~。そんなにかかるようなシーンには見えないよ。
デザイナーK:いや、ほんとほんと。
と信じがたい話だと思いつつ、そのシーンをテストレンダリングしてみたら恐ろしいことに2時間近くかかるのではありませんか!
この背景シーンは世界遺産の中であるキャラが登場するとき見える壁でしたが、
同じ部屋の他の壁が見えるカットはまったく問題がないのにそのカットで見える壁だけが
原因不明で1枚2時間近くかかっていました。
なんでだ?何が問題だと思いながら色々調べても原因がさっぱり分からず、
何?呪い?と冷や汗をかきながら思いつく様々な方法を試してみても
状況は改善せず、少ない髪の毛と時間がだけが減っていきました。
そんな中、デザイナーKから報告があったのが壁で使用している「mia_material_x」の
あるattributeの値を「0」にしたら他の壁と同じスピードになりました。
と救いの連絡がありました。
急いでそのAttributeを確認してみたら
Bump > Overall Bump と Standard BumpのBump Z
でした。
これらのAttributeは普段は「0」ですがbump2dノードが繋がったときのみ「1」になります。
なのに何も繋がってないのにも関わらず「1」という値が入っており、
レンダリングに悪影響(?)を与えていたわけです。
それに、この問題が見つかりにくい一つの原因はAttribute Editor上のslotには何も
さされてないので普通に問題がないように見えます。
が、channelboxではリンクが切れてても「1」という値が残るバグが存在します。
え~~~っと思いながらその値を「0」にしてレンダリングしてみると
通常のレンダリング時間である10分で終わる…。これで一件落着~~~と思いました。
が、値が「0」になったことで当初ディレクターからOKが出たレンダリング結果と大きく
違ってしまったので、仕方なく涙ながら「1」にしてレンダリングするしかなかったのです。
そのときから私の中でこの壁は嘆きの壁になったのです。
映画の中で世界遺産の暗い部屋でキャラが登場する壁が見えたらあれが嘆きの壁か~と思ってください。^^;)

さて、「mia_material_x」のbumpのBump Zに「1」が残るバグは何故生じるのかを
調べて解決策を考えておかないと次も同じバグで苦しむことになるので早速原因捜査と解決策を探しました。
色々とコネクションをテストしながらこのAttributeってもしかしてscriptJobで管理してるのか?という
疑問が生じ、「scriptJob -lj」で調べてみると
~Maya2011/scripts/others/mia_material_functions.melのなかにある次のプロセスで管理してました。

global proc AEcheckMiaBumpConnection(string $attr) {
	// on disconnect, random values populate the attr, but it needs
	// to be set to 0,0,0 if no bump node is connected
	if (!`connectionInfo -id $attr`) {
		setAttr $attr 0 0 0;
	}
}

ああ、なるほどこれでコネクションが切れたときに値を「0 0 0」にセットするのね…orz
どのような条件でこのscriptJobが動かないかをテストしてみると
①AEでbumpをdisconnectをする → Overall bump Z(もしくはStandard bump Z)に「1」が残る
②Hypershadeでbumpをdisconnectをする → Overall bump Z(もしくはStandard bump Z)に「1」が残る
③Hypershadeで繋がっているbumpノードを削除する → Overall bump Z(もしくはstandard bump Z)に「1」が残る
がMaya2010では起こり、Maya2011、Maya2012では①、②は直ってはいるが、③の場合だとまだ残っていました。
実は弊社では①、②のバグは既に分かっており、別度対応するためのscriptJobのMELを使用していましたが、
③の場合は対応策を考えておらず「1」が残るという事態になったわけです。
対応策としてBumpノードを削除するたびにシーン上のmia_material_xのコネクションを調べるように
してはみたものの、あまり現実的はないことが分かった上に、①、②、③以外の場合、スクリプトでの制御なども
あるのでもっとも現実的な方法として考えたのが
Render時にコネクションがないものは必ず「0」にするという方法です。
mia_material_xのBumpにコネクションがある場合はスルーして
ない場合はBumpの値を0 0 0にセットすると言った下記のプロセスを作り、
それをシーンのRenderGlobalsのPre render MELの中で必ず実行するようにして
今はデザイナが気にしなくても鉄拳で起きた問題を回避出来るようにしています。

※スクリプトは弊社で使っているものをそのまま載せていますが、このスクリプトの使用は自己責任下でのご使用をお願いします。

global proc DF_checkBump_MiaXs()
{
	string $miaxs[] = {};
	string $tmps[] = `ls -type "mia_material_x"`;
	string $info = "You Must Check These Shaders.\n";
	$miaxs = stringArrayCatenate($miaxs, $tmps);
	$tmps = `ls -type "mia_material_x_passes"`;
	$miaxs = stringArrayCatenate($miaxs, $tmps);
	$chkflg = 0;

	for($miax in $miaxs){
		int $overall = `getAttr ($miax + ".overall_bumpZ")`;
		int $standard = `getAttr ($miax + ".standard_bumpZ")`;
		string $connection_overalls[] = `listConnections -s 1 -d 0 ($miax + ".overall_bump")`;
		string $connection_standards[] = `listConnections -s 1 -d 0 ($miax + ".standard_bump")`;
		if($overall == 1 && size($connection_overalls) < 1){
			setAttr ($miax + ".overall_bump") 0 0 0;
			$info += ($miax + " overall_bumpZ was " + $overall + ". But overall bump value fixed to 0 0 0\n");
			$chkflg += 1;
		}
		if($standard == 1 && size($connection_standards) < 1){
			setAttr ($miax + ".standard_bump") 0 0 0;
			$info += ($miax + " standard_bumpZ was " + $standard + ". But standard nump value fixed to 0 0 0\n");
			$chkflg += 1;
		}
	}

	if ($chkflg > 0){
		if(!`about -b`){
			confirmDialog -title "Warning!!!" -message $info -button "OK" -dismissString "OK";
		} else {
			print $info;
		}
	}
}

時には何の変哲もない値がとんでもない事態の引きかねになりかねないので
皆さんもmia_material_xのbumpには十分気をつけて使用するようにして下さい。
次回はまた別の内容でお会いできればなと思います。
では皆さんお元気で!

Pocket

コメント

[…] ・役に立たないCGにまつわるどうでもいい話3 ・役に立たないどうでもいい話-RenderLayer Overrideの話 ・RampShaderで簡単なトゥーンシェーディング ・MayaでsiToon! […]

1 thought on “役に立たないCGにまつわるどうでもいい話3”

コメントフォーム

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

*