1

テクスチャリングが完了する前にシーン内のすべてをレンダリングする必要があるため、finalDrawCallback で全画面クワッドをテクスチャ マップしたい OSG アプリケーションがあります。これが、プログラムとシェーダーを実行するために osg 呼び出しの代わりに openGL 呼び出しを使用する必要がある理由です。

具体的には、頂点シェーダーとフラグ シェーダーの両方のコンパイルに問題があるようです。)を呼び出すglGetShaderiv(shader, GL_COMPILE_STATUS, &paramと、param 値が変更されないか、未定義になります。ドキュメントによると、エラーが発生したと書かれています。ただし、glGetError()確認のために呼び出すと、openGL はGL_NO_ERROR.

セットアップ機能はこちら

    glActiveTexture(GL_TEXTURE0);
    glGenTextures(1, &screenTexture);
    glBindTexture(GL_TEXTURE_2D, screenTexture);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);

    GLuint vs = glCreateShader(GL_VERTEX_SHADER);
    const GLchar* vs_source = shaderLoadFile("vert.glsl");

    glShaderSource(vs, 1, &vs_source, NULL);
    glCompileShader(vs);
    checkShader(vs);

    GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
    const GLchar* fs_source = shaderLoadFile("frag.glsl");

    glShaderSource(fs, 1, &fs_source, NULL);
    glCompileShader(fs);
    checkShader(fs);

    prog = glCreateProgram();
    glAttachShader(prog, vs);
    glAttachShader(prog, fs);

    glLinkProgram(prog);
    glUseProgram(prog); 

シェーダー ソースを読み取るためのヘルパー関数:

FILE *f = fopen(file, "rb");
if (f == NULL)
{
    std::cout<<"Error: Unable to locate shader files.\n";
    exit(-1);
    return NULL;
}

fseek(f, 0, SEEK_END);
long size = ftell(f);
fseek(f, 0, SEEK_SET);
char* ret = new char[size+1];
fread(ret, size, 1, f);
fclose(f);
ret[size] = '\0';
return ret;

そしてシェーダー自体

    //vertex shader
void main() 
{
    glTexCoord[0] = gl_MultiTexCoord0;
}
     //frag shader
uniform sampler2D screenTex;
void main()
{
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
}

編集:私はこれを理解しました。問題は、これらの呼び出しを行うときにグラフィック コンテキストがなかったことです。

4

1 に答える 1

1

問題は、これらの呼び出しを行うときにグラフィック コンテキストがなかったことです。これは、エラーが発生していないのにシェーダーがコンパイルに失敗した理由を説明していると思います。

于 2011-12-30T00:00:56.303 に答える