2 つ以上の .txt ファイルを使用せず、プログラム用の #defines を持つ 1 つだけを使用するように、シェーダー コンパイラをなんとか作り直しました。今は問題なく動作しますが、shader.txt の最後の行の後にスペースを入力したり残したりしないと、動作がおかしくなります。タイトルに記載されているエラーが表示されます。
私のシェーダーローダー:
m_vertexShader.source = readFile(m_vertexShader.filename);//.source is string
const GLchar defineVertex[] = "#define VERTEX \n";
const GLchar* vertexsource[2]={defineVertex,
static_cast<const GLchar*>(m_vertexShader.source.c_str())};
glShaderSource(m_vertexShader.id, 2, vertexsource, NULL);
フラグメントプログラムについても同じです。
ソースリーダー:
string readFile(const string& filename)
{
ifstream fileIn(filename.c_str());
if (!fileIn.good())
{
std::cerr << "Could not load shader: " << filename << std::endl;
return string();
}
string stringBuffer(std::istreambuf_iterator<char>(fileIn),(std::istreambuf_iterator<char>()));
return stringBuffer;
}
さて、.txt にはまだいくつかの行があります。
#version 400
layout (location = 0)
in vec3 a_Vertex;
uniform mat4 model_matrix;
uniform mat4 view_matrix;
uniform mat4 projection_matrix;
mat4 mvp = projection_matrix*view_matrix*model_matrix;
#ifdef VERTEX
void main(void)
{
gl_Position = mvp*vec4(a_Vertex,1);
}
#endif
#ifdef FRAGMENT void main(void)
{
gl_FragColor = vec4(gl_FragCoord.zzz,1);
}
#endif
したがって、これをこの形式のままにし、最後の文字が #endif の「f」である場合、メッセージが表示されます。この形式で何が起こるか、最後の文字の後にスペースがあるとどう違うか.
EDIT: feeefeeeエラーが何であるかは知っていますが、スペースがどのようにメモリエラーを引き起こすかはわかりません。