0

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エラーが何であるかは知っていますが、スペースがどのようにメモリエラーを引き起こすかはわかりません。

4

2 に答える 2

1

すべての gl シェーダーは で終わる必要があり\nます。私は自分の時間で理由を見つけようとしましたが、失敗しました。しかし、既知のバグ/機能です。

于 2013-10-18T20:06:20.333 に答える