4

最後に、シェーダーがコンパイルに失敗することに慣れていないという問題を特定しました。

これが私のシェーダー読み込みルーチンです。最初の部分は、シェーダーで読み取ります。

void GLSLShader::LoadFromFile(GLenum whichShader, const string filename)
{   
    ifstream fp;

    // Attempt to open the shader
    fp.open(filename.c_str(), ios_base::in);

    // If the file exists, load it
    if(fp) 
    {
        // Copy the shader into the buffer
        string buffer(std::istreambuf_iterator<char>(fp), (std::istreambuf_iterator<char>()));

        // Debug output to show full text of shader
        errorLog.writeSuccess("Shader debug: %s", buffer.c_str());

        LoadFromString(whichShader, buffer);
    } 
    else 
    {
        errorLog.writeError("Could not load the shader %s", filename.c_str());
    }
}

それを文字列にロードした後、それを送信してロードします。

void GLSLShader::LoadFromString(GLenum type, const string source) 
{
    // Create the shader
    GLuint shader = glCreateShader(type);

    // Convert the string
    const char * ptmp = source.c_str();
    glShaderSource(shader, 1, &ptmp, NULL);

    // Compile the shader
    glCompileShader(shader);

    // Check to see if the shader has loaded
    GLint status;
    glGetShaderiv (shader, GL_COMPILE_STATUS, &status);
    if (status == GL_FALSE) {
        GLint infoLogLength;
        glGetShaderiv (shader, GL_INFO_LOG_LENGTH, &infoLogLength);
        GLchar *infoLog= new GLchar[infoLogLength];
        glGetShaderInfoLog (shader, infoLogLength, NULL, infoLog);
        errorLog.writeError("could not compile: %s", infoLog);
        delete [] infoLog;
    }
    _shaders[_totalShaders++]=shader;
}

「コンパイルできませんでした:」というデバッグ出力が表示され、エラー バッファが空になっているようです。これは、過去3日間私を夢中にさせてきました。誰かが私のエラーを見ますか?

非常に単純なシェーダーは次のとおりです。

#version 330

layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;

smooth out vec4 theColor;

void main()
{
    gl_Position = position;
    theColor = color;
}



#version 330

smooth in vec4 theColor;

out vec4 outputColor;

void main()
{
    outputColor = theColor;
}

アップデート

何らかの理由で、メモリ内のシェーダーの最後にがらくたが追加されているようです。理由はわかりません。char* と文字列に読み込もうとしました。出力は次のとおりです。

<-!-> Shader: #version 330

layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;

smooth out vec4 theColor;

void main()
{
    gl_Position = position;
    theColor = color;
}
n
<-!-> Shader: #version 330

smooth in vec4 theColor;

out vec4 outputColor;

void main()
{
    outputColor = theColor;
}
nts/Resources

最初のシェーダーの末尾にある「n」と、2 番目のシェーダーの末尾にある「nts/Resources」に注目してください。理由はありますか?

別の更新

最後のがらくたは、最後の余分な行によって引き起こされました。それを削除したところ、正しいシェーダー テキストが出力されるようになりました。コンパイルに関してはまだ運がないと思います。

私はここで途方に暮れています。The Superbible には、最適化されていない膨大なライブラリがあり、私には必要ありません。Mac 用のまともなシェーダ コンパイラはないようです。私はそれがどれほど単純であるかを本当に気にしません。シェーダーで動作する必要があるだけです。誰にも例がありますか?

4

1 に答える 1

2

glShaderSourceソース配列の各文字列の長さを指定せずに呼び出しています。したがって、指定された文字列はヌル バイト ('\0') で終了すると見なされます。ファイルをメモリに読み込む方法では、追加の null バイトでシェーダー ソースが終了しません。そのため、GLSL コンパイラは、シェーダー ソースの末尾を超えてランダム メモリに読み込み、そこでゴミを見つけます。

解決策: 終端のヌル バイトを追加するか、シェーダー テキストの長さパラメーターを指定します。

于 2012-07-24T07:28:24.837 に答える