1

私は現在、GLSLシェーダーをコンパイルしようとしているときに発生するエラーに不満を感じて、両方のシェーダーを正常にコンパイルできましたが、それらをリンクすることになるとエラーが発生します。出力はありませんが、リンクに失敗しました。

コンパイル+リンクコードは次のとおりです。

GLuint program = NULL;
GLint compile_ok = GL_FALSE, link_ok = GL_FALSE;

GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vertCont, NULL);
glCompileShader(vs);
glGetShaderiv(vs, GL_COMPILE_STATUS, &compile_ok);
char logBuf[1024];
int len;
if (0 == compile_ok)
{
    glGetShaderInfoLog(vs, sizeof(logBuf), &len, logBuf);
    LogMgr::logMessage(LogMgr::CRITICAL, "Error in vertex shader\n", logBuf);
    return false;
}

GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, &fragCont, NULL);
glCompileShader(fs);
glGetShaderiv(fs, GL_COMPILE_STATUS, &compile_ok);
if (!compile_ok) 
{
    glGetShaderInfoLog(vs, sizeof(logBuf), &len, logBuf);
    LogMgr::logMessage(LogMgr::CRITICAL, "Error in fragment shader", logBuf);
    return false;
}

glAttachShader(program, vs);
glAttachShader(program, fs);
glLinkProgram(program);
glGetProgramiv(program, GL_LINK_STATUS, &link_ok);
if (!link_ok) 
{
    glGetShaderInfoLog(vs, sizeof(logBuf), &len, logBuf);
    LogMgr::logMessage(LogMgr::CRITICAL, "Could not link basic shaders!", logBuf);
    return false;
}
return program;

そして、これが頂点シェーダーです。

#version 330

layout(location = 0) in vec4 position;
void main()
{
    gl_Position = position;
}

フラグメントシェーダー:

#version 330

out vec4 outputColor;
void main()
{
   outputColor = vec4(1.0f, 0.0f, 1.0f, 1.0f);
}

手がかりはありますか?

4

2 に答える 2

7

getShaderInfoLogへの呼び出しが間違っています。頂点シェーダーのコンパイルログを常にチェックしています。これは、エラーメッセージが表示されない理由を説明しています。そして、それはあなたがコードをコピーして貼り付けるためにあなたが得るものです;)

フラグメントシェーダーの場合、次のようになります。

glGetShaderInfoLog(fs, sizeof(logBuf), &len, logBuf);

リンクステータスについては、次のようになります。

glGetProgramInfoLog(program, sizeof(logBuf), &len, logBuf);
于 2012-12-28T18:02:48.500 に答える
0

問題は、プログラムオブジェクトを作成しなかったことです。リンクする前にこのコード行を追加しましたが、機能しました。

program = glCreateProgram();
于 2012-12-30T00:27:54.487 に答える