TakNipper
(TakNipper)
1
お世話になります。
ソースからビルドしたエディタを起動しようとしたところ、シェーダーのコンパイルエラーが発生し、起動時に落ちる問題がありました。
調べたところ、シェーダーのUSFファイルをプリプロセッサ(MCPP)にかけた際、
一部のシェーダーファイルで「Unknown encoding: jp」のようなWarningが発生し、
エンジン側がこれをエラーと捉えているようでした。
対応としまして、
\Engine\Source\Developer\ShaderPreprocessor\Private\ShaderPreprocessor.cpp
内にある、MCPPのWarningをフィルターする関数、
static bool FilterMcppError(const FString& ErrorMsg)
の中身を以下のように変更したところ、コンパイルが通るようになりました。
static bool FilterMcppError(const FString& ErrorMsg)
{
const TCHAR* SubstringsToFilter[] =
{
TEXT("Unknown encoding: jp"), // この行を追加
TEXT("with no newline, supplemented newline"),
TEXT("Converted [CR+LF] to [LF]")
};
}
初めからビルドされているエディタでは起きないようなので、こちらのセットアップミスなのかもしれません…
同じようなエラーが表示されている方は居らっしゃいますでしょうか?
もしかしてUSFファイルを編集しましたか?
USFファイルにANSIじゃないキャラクターを対応してないかもしれないです。
僕とレンダリングチームが調べています。
よろしくお願いします!
TakNipper
(TakNipper)
4
Joeさん
English Translationと、返答ありがとうございます!
原因がわかりましたので、報告致します。
原因は、私のPCの環境変数(environment variables)にあった「LANG=jp」というのが問題でした・・・。
ShaderCompileWorker が、mcpp_run関数でusf ファイルをプリプロセスする際、
Multibyte chara encoding の設定がデフォルトの「sjis」に設定されているのですが、
この環境変数「LANG=jp」があると、エンコーディング設定を上書きしてしまうようです。
MCPP\mcpp-2.7.2\src\system.c(2066)
/*
* Set multi-byte character encoding according to environment variables
* LC_ALL, LC_CTYPE and LANG -- with preference in this order.
*/
if (! mb_changed) { /* -m option precedes */
if ((env = getenv( "LC_ALL")) != NULL)
set_encoding( env, "LC_ALL", 0);
else if ((env = getenv( "LC_CTYPE")) != NULL)
set_encoding( env, "LC_CTYPE", 0);
else if ((env = getenv( "LANG")) != NULL) // <<< ここでエンコーディングを変更してしまう!
set_encoding( env, "LANG", 0);
}
「LANG=jp」を削除することで対応できました。
別の対処方としましては、mcpp_run のオプションMcppOptionsに「McppOptions += TEXT(" -esjis");」を追加すると、設定にかかわらず、明示的にshift-jisでエンコードできるようです。
お騒がせして申し訳ありませんでした。よろしくお願い致します。