2015年10月02日

テクスチャ名の話

したらばでちょっと話題になってたので、ブログのネタにでもしておこうかと思います。

PMXやPMDのモデルデータではモデル(*.pmx/*.pmd)が、外部のテクスチャファイル(*.pngなど)を参照しているのはご存知かと思います。

このテクスチャファイルですが実は 「ファイル名を日本語で指定するとうまく動作しない」 というケースがたまにあります。

モデルファイルやモデルデータ内の各部分は日本語表記でも特に問題はないのに、何故テクスチャファイルだけが例外なのか?...と、この手の問題に慣れていない方などは不思議に思われるかもしれませんが、

理由としては単純に 「テクスチャファイルの読み込みは DirectXの専用処理を使っている」 からです。

例えば DX9のテクスチャロードでは D3DXCreateTextureFromFile 関数 などを使うのが定番ですが、この処理で指定するファイルパスは(デフォルト設定では)日本語などの2バイト文字に対応していません(使用文字によっては別の記号として認識されてしまう)

※ファイルパスはフルパスで指定する場合がほとんどなので、本来フォルダ名にも注意が必要です。

また 2バイト文字への対応を正しく設定していた場合でも、DirectXの内部処理も同じように対応して(正しく)動作しているかどうかはわかりません。

基本的にベースライブラリを作成している方たちは 「半角英数(7bit)だけで事がすむ」文化圏の方たちですし、昨今ではユニコード対応なども当たり前になりましたが、DX9が作られた頃はまだそうでもない時代でしたので。

※そもそもライブラリではなく呼び出し側に実装ミスがあることもよくあります。

そういった内部の事情から 「テクスチャファイル名の問題」 ということが表面化するわけです。


その他の名称やファイルパス部分で特に問題になることはない理由も同様に、

・PMXエディタやMMMなどの.NETフレームワークベースのアプリケーションはユニコード仕様になりほぼ問題が出なくなった
・MMDなどのネイティブアプリでも作成者が日本人などの多バイト圏の方なら(自身の処理部分では)大体対応済み

ということだからです

※.NETフレームワークから呼び出しているDirectXも結局はネイティブ側の処理に繋がっているので、問題が出ることはよくあります(Xファイルのロードとか)

今でも海外(特に欧米系)のネイティブアプリでは日本語指定でたまに問題が起きたりしますが、このあたりは自分たちで対応していくしかありません(=日本語使わない)

それにしても日本語のファイル名に関する問題とか、こんな風に古いシステムの名残による問題がひょこっと顔を出すと、「ファイル名なんてちょっと前は 8+3 文字(英数のみ)が当たり前だったのになぁ」 みたいにちょっと郷愁的な気分になりますね(笑)


以上


※PMDの各部位やパス指定などの文字列データは特定の容量制限があるので、昨今の PMXから入った方などは特に注意しておきましょう(アトVMDハ今デモ15byte制限アルヨ、キヲツケテ)

【関連する記事】
posted by - at 12:20| PMX | 更新情報をチェックする