自分の C/C++ コードの中で DirectX Shader Compiler を使って、シェーダーをコンパイルするときに妙なものに出会いました。 シェーダーのソースコードからコンパイルしてバイナリデータは正常に得られるのですが、次のようなワーニングに出会いました。
renderCubemap.hlsl:39:2: warning: null character ignored <U+0000> ^ renderCubemap.hlsl:39:3: warning: null character ignored <U+0000><U+0000> ^ renderCubemap.hlsl:39:4: warning: null character ignored <U+0000><U+0000><U+0000> ^ renderCubemap.hlsl:39:5: warning: null character ignored <U+0000><U+0000><U+0000><U+0000> ^ (以下略)
原因
特にファイルに変な文字も含まれていませんでしたし、どうしてこのようなワーニングが出るのか不思議でした。しかし気持ちがいいものではないので、出来るものならなんとか対策したいと思って色々といじっているうちに、ようやく原因を探り当てました。
改行コードを CR+LF から LF にすると、このワーニングを消すことが出来ました。
DirectX Shader Compiler の基盤が LLVM なので、もしかして LF を標準的に期待しているのかもと思ったりもしましたが、実際のところはシェーダーソースコードだからテキスト読み込みしても問題ないだろうとしていた自分のソースコード部分を直すことで、ワーニングを出さないで処理することが出来るようになりました。
// 旧コード
// std::ifstream infile(filePath);
// ↓ このように変更する
std::ifstream infile(filePath, std::ifstream::binary);
バイナリ形式として読み込んで、DirectX Shader Compiler で処理するようにすると問題は起こりません。
まとめ
この挙動ってどこにも書いておらず、他の人も遭遇していないのか本当に情報が見当たりませんでした。この記事が誰かの解決策として役立ってくれたら嬉しく思います。