上書きについての走り書き
2007年02月26日(Mon)
バンプの不具合の件。
前回アップロードしたファイルを数人の方にテスト頂いて、いくつかの事が明らかになった。
テストして頂いた有志の方に感謝しつつ、簡単にまとめてみると。
とりあえず不具合内容は、
「Poser 7日本語版でルートノードのバンプにイメージマップノードが直接接続されているフィギュアや小道具をロードすると、イメージマップノードのファイルが正常に読み込まれておらず、そのためレンダリングすると他のイメージが適用されてしまう」
である。これはマテリアルルームでイメージマップノードのファイル指定をイチからやり直すことで対処できる(回避じゃないぞ、遭遇してしまってるんだから)。複数のイメージマップノードで同じファイルが指定されている場合、Poserは1つのファイルを使い回すので、一回だけ指定してやれば全てのイメージマップノードが正常に戻る。
これを、もうちょっとなんとかならんか、ということでウダウダ考えている。
- どうやらライブラリからの追加やシーンファイルのオープンでフィギュアやプロップがロードされる時、同時に読み込まれるはずのバンプマップがまずいことになってしまうらしい。
- ロード時に読み込まれるのはマテリアルにP4書式で記述されているイメージファイルである。
- なので、このP4書式をサクってロード時のイメージファイル読み込みを行わなければ、シェーダツリーが適用された時にファイルは正常に読み込まれるので、問題を回避できる。
- これはマテリアルルームで手動対応するよりは、多少は楽かもしれない。
これを主軸にして、さらにウダウダと外堀を埋めていく。
- マテリアルファイル、マテリアルコレクションファイル、MATポーズファイルを適用した場合にも同様の現象が起こるらしい。これが同じプロセスで発生しているのかどうかは不明。
- Poser 7Jでしか発生しないが、シーンファイル自体は英語のファイルでも発生する。
- 間違って適用されてしまうイメージファイルは、2度目のレンダリングからは先頭のマテリアルグループに存在するファイルだが、テスト結果を頂いた限り、1度目のファイルにも実は法則性があるっぽい。
てな感じだ。以下本題。
casiopeaさんのブログで、P7Jのファイルの記述が怪しいという記事を拝見した。シェーダツリーによるP4書式の上書きの法則性も知りたかったので、作成したファイルをP6JとP7Eで読み込んで動作を確認してみる。
使用したファイルはテストデータのNoP4、P4書式はNO_MAP指定で、シェーダツリーは ":runtime:textures:test:test1.jpg"という指定になっている。
まずはシーンファイルを開いた状態のP6J。

P4書式はサクられたまま、シェーダツリーではファイル名しか保存されていない。また、ロード時にテクスチャを読み込んでいないので、テクスチャシェーディングにしていてもテクスチャは表示されない。これがP7Eの場合はと言うと、

Mac版ではアプリケーションフォルダからの絶対パス(しかもスラッシュ区切り)に変わっている。次に、このシーンをそのまま一度だけレンダリングし、ファイルを別名保存したところ(もちろんレンダ結果は正常である)。P6J。

ボカシで大変失礼だが、この部分はボリューム名:ユーザID:~と続いている。基本的にMac版P6Jはファイル記述は全てボリュームからの絶対パスである。レンダリング時にシェーダツリーの記述によってファイルは読み込まれているはずだが、まだP4書式への上書きは行われていない。また、テクスチャシェーディングにもテクスチャは反映されていない。
P7E。

ここでシェーダツリーのファイルパスが何故か元のpz3の記述に戻っている。あとはP6Jと同様。
ここで、一度シーンファイルを閉じ、「Poserを終了せずに」同じファイルを開き直してみた。Poserは一度ロードしたファイルは、Poserを終了するまでその所在地を記憶している。この場合、P4書式をカットしていることがどう影響するか。というわけでP6J。

ファイルを開いた直後に、そのまま別名保存したものである。P4書式の部分にも絶対パスでファイル指定が入り、テクスチャシェーディングも始めから適用されている。
次にP7E。

こちらはRuntimeからの指定で、やはりP4書式が上書きされている。つまり、Poserはロードの時点で、ファイルの読み込みは行わないもののシェーダツリーを読み出していて、メモリ上に同名のファイルがあればさっさと適用してしまうようである。
さて、では最初のファイルを開いて、そのままマテリアルルームでマテリアルグループを一つだけ表示させ、その状態でファイルを別名保存してみよう。マテリアルルームの操作は、ファイルにどのように反映されているか。

P6Jでは、マテリアルルームに入り、マテリアルグループを選択した瞬間にその部分のテクスチャがテクスチャシェーディングに反映された。シーンファイルも、その時点でP4書式が上書きされていることがわかる。マテリアルルームで表示させていない部分の記述は最初のケースと同様だった。

P7Eでも同様である。
この一部だけテクスチャシェーディングが反映された状態で、一度ファイルを閉じて開き直してみよう。P6J。

やはり、一部のテクスチャシェーディングだけは反映、そしてP4書式への上書きも行われている。

P7Eでも同様。
さて。
と、いうことは、P4書式の上書き(というかP4書式とシェーダツリーの整合性のチェック)は、マテリアルルームで該当のマテリアルグループを操作した時、そしてフィギュアや小道具をロードした時に行われている、ということになりそうだ。ただし、ロード時にはシェーダツリー内のイメージの読み込みは行わない。その為、Poserを起動した直後の状態ではP4書式に上書きするべきファイルパスが見つからないためNO_MAPのままとなっている……という感じだろうか。
Poserは外部ファイルを読み込む時、実はファイル名でしかファイルを区別しない。だから別のディレクトリに同名のファイルが存在する場合、それは「同じもの」として扱われてしまい、さらに、「先にロードしたファイルのファイルパス」を意固地に保持している。
仮に、テクスチャを01.jpgと名付け、texturesフォルダ下に保存したとしよう。次にテクスチャを変えたくなって、別のファイルに同じ01.jpgと名付け、textures:testフォルダ下に保存する。すると、マテリアルルームでいくらtextures:test下の01.jpgを指定しようとも、あるいはtextures:test下の01.jpgを指定したファイルをロードしようとも、最初に読み込んだtexturesフォルダ下の01.jpgを表示してしまうのである。
これはテクスチャだけではなく、ジオメトリファイルでも同様である。大人しくファイル名を変更するか、Poserを終了してエディタでファイルパスを変更するしかない。この辺の仕様はPoser 7になっても変わらない。
とりあえず変更されるタイミングがわかったので……うーん……。
……保存時にサクっちゃうとか……どうだろ。
とりあえず、わふうてんまであとよっか。