1

glsl プログラムを、以前に正常にコンパイルされた 2 つのシェーダとリンクしようとしていますが、プログラムがリンクしません。glRemedy のデバッガーによると、エラー メッセージはERROR: Definition for "void main()" not found. いくつかのデバッグの後、glRemedy によると、GPU がシェーダーを受け取っていないことがわかりました。私のコードは正しく見え、クライアント側から期待どおりに動作すると思います。

頂点シェーダー:

layout(location = 0) in vec3 vertexPosicao;

void main() {
    gl_Position.xyz = vertexPosicao;
    gl_Position.w = 1.0;
}

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

out vec3 cor;

void main() {
    cor = vec3(1, 0, 0);
}

コードを読み込んでいます:

bool Shader::fromCode(std::string strCode) {
    GLint result;
    GLchar *code = new GLchar[strCode.size() + 1];
    strcpy(code, strCode.c_str());

    glShaderSource(m_id, 1, const_cast<const GLchar **>(&code), NULL);
    glCompileShader(m_id);
    glGetShaderiv(m_id, GL_COMPILE_STATUS, &result);
    return (bool)result;
}

編集:

使用glShaderSourceしたシェーダー ID で使用した後、ソースを取り戻しました。それのすべて。しかし、\n が欠けているようです。それは問題になるでしょうか?

編集2:

Infolog はすべて問題ないと言っています。C++ コードからは、プログラムの情報ログも問題ないと言っていますが、glRemedy からは上記のエラーがあります。また、glRemedy のシェーダーのソースが表示されず、サイズが 0kb です。いいえ、私が設定したテストは、何かが機能していないことを示しています。

編集3:

メリークリスマス!=D

4

1 に答える 1

1

なぜそんなに複雑なのか、新しく割り当てられた GLchar* へのコピー (後で [] を削除するのを忘れる) という意味です。私はそれを次のように書き直します

bool Shader::fromCode(std::string strCode) {
    GLint result;
    GLuint source_length = strCode.length();
    GLchar const * strCodePtr = strCode.c_str();

    glShaderSource(m_id, 1, &strCodePtr, &source_length);
    glCompileShader(m_id);
    glGetShaderiv(m_id, GL_COMPILE_STATUS, &result);
    return (bool)result;
}

追加の source_length パラメーターは、後でメモリ内で見つかる可能性のある末尾のガベージを処理します (一番の理由は、ほとんどの人のシェーダー ローダーが機能しないためです)。

于 2012-12-25T00:14:50.330 に答える