前回作成した、frag.spv, vert.spvファイルを読み込みます。まず単純なファイルからバイナリーをロードするヘルパー関数を使います。
std::vector<char> ReadFile(const std::string& filename) {
std::ifstream file(filename, std::ios::ate | std::ios::binary);
if (!file.is_open()) {
throw std::runtime_error("Don't read" + filename);
}
size_t fileSize = (size_t)file.tellg();
std::vector<char> fileBuffer(fileSize);
file.seekg(0);
file.read(fileBuffer.data(), fileSize);
file.close();
return fileBuffer;
}
ReadFile関数は、すべてのバイトを読み込み、それをstd::vectorの配列に渡す関数です。
ifstream は、ファイルの読み出しに使うクラスです。
逆に書き込み専用のファイルストリームはofstreamとなります。
- ate : 最後の行から読み込む。
- binary : バイナリーファイルとして読み込む(文字として読み込むのを防ぐ)
ファイルを最後から読んだ理由は、ファイルのサイズを調べることが目的です。file.tellg()を使うことで、現在の読み込み位置を取得できます。
size_t fileSize = (size_t)file.tellg();
std::vector<char> fileBuffer(fileSize);
ファイルの読み込み位置をseekg(0)を使い最初からにした後、ファイルを読み込みます。
file.seekg(0);
file.read(fileBuffer.data(), fileSize);
作成した関数を使い2つのシェーダーを呼び出します。
void Shader::_init_shaderModule()
{
std::vector<char> _VertShader;
std::vector<char> _FragShader;
_VertShader = ReadFile("vert.spv");
_FragShader = ReadFile("frag.spv");
}