0

コンパイル済みのシェーダーまたはプログラム (正しい用語がわからない) があり、それを削除する必要があります。

コンパイルされたプログラムやシェーダーの ID を見つけるにはどうすればよいですか?

デバッガーがそれを再定義しようとしていることを教えてくれるので、それが存在することを知っています。このため、再度コンパイルすることはできません:

ERROR: 0:1: error(#198) Redefinition at_coord_Y
ERROR: 1:1: error(#248) Function already has a body main

シェーダー ソースの最初の行は次のとおりです。

"in float at_coord_Y;"

どういうわけかこれを使用してIDを見つけることはできますか?

編集 1: 少し明確にすることを願っていますが、シェーダーは既に存在するため、コンパイルに失敗します。

    GLint compiled = UNDEFINED_VALUE;

    const GLchar* shaderSrc[] = {
        "in float at_coord_Y;",
        "void main()",
        "{",
              // Dont mind the empty space
        "}"
    };

    GLuint shaderId = glCreateShader(GL_VERTEX_SHADER);

    glShaderSource(shaderId, glNumberOfLines(shaderSrc), shaderSrc, NULL);

    glCompileShader(shaderId);  // Fail to compile because it already exists. Redefinition error.

    glGetShaderiv(shaderId), GL_COMPILE_STATUS, &compiled); // Compile status GL_FALSE

しかし、どうすれば既存のシェーダー (またはプログラム) の Id を見つけることができますか?

4

1 に答える 1

7

あなたはエラーを完全に誤解しています。OpenGLは、シェーダーオブジェクト(で取得するものglCreateShader)が既に定義されているとは言っていません。シェーダーのテキスト(渡したもの)に問題があると言っていますglShaderSource

シェーダーのロードには多くの問題があります。この読み込みコードをどこから取得したかはわかりませんが、その場所は避けることを強くお勧めします。

glShaderSourceはい、複数の文字列を取ります。しかし、それはあなたがすべての行を別々の文字列に投げ込むという意味ではありません。「ヘッダー」などに使用することになっています。これは、コンパイラがコンパイル時にすべての文字列を連結することを意味します。

一般に、メインシェーダーのプレフィックスとして追加の文字列をヘッダーとして使用している場合を除き、1つの文字列の配列を渡すだけです。自分の痛みを救ってください。

また、#versionディレクティブを使用しませんでした。バージョンを指定しないと、GLSL1.10を使用せざるを得なくなります。また、GLSL 1.10では、in float at_coord_Y;これは法的な定義ではありません。

于 2012-10-19T07:01:53.550 に答える