1

いくつかの後処理効果を実行しているテストに使用している小さなアプリケーションがあります。私の目標は、ダブルPBOを使用してピクセルを読み取り、ピクセルをフルスクリーンテクスチャクワッドにレンダリングし、フラグメントシェーダーでエフェクトを変更/追加することです。ここに似ています。アプリケーションはOSGを使用していますが、フルスクリーンテクスチャリングを行うためにopenGL呼び出しを使用しています。

私の問題は、glTexSubImage2Dを使用して各フレームのテクスチャにピクセルをコピーすると、無効な値のopenGLエラーが発生することです。これがエラーを生成する呼び出しであることをgDEBuggerで確認しました。エラーが最初に発生したとき、ポインタアドレスは後続のすべてのフレームとは異なります。また、glTexSubImage2d 0の幅と高さのパラメーターを作成することにより、エラーは生成されません。だから私は何が起こっているのか本当にわかりません。

関連するコードは次のとおりです。

MyCallbackClass()
{
    pImgData = (unsigned char*) malloc(1024*512*3);
    setupTextureAndShaders();
}
void setupTextureAndShaders()
{
    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);

    memset(pImgData, 0, 1024*512*3);

    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, 1024, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, pImgData);
    glBindTexture(GL_TEXTURE_2D, 0);
}


//callback called every frame
virtual void operator () (osg::RenderInfo& renderInfo) const
{
    // buffer and context stuff unchanged from the sample program

    if(!shaderInit) // only executed once
    {
        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);
        texLoc = glGetUniformLocation(prog, "screenTex");

        shaderInit = true;
    }

    read();  // does the double pbo operations to read the image data into pImgData

    glUseProgram(prog);

    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, screenTexture);
    glUniform1i(texLoc, 0);
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1024, 512, GL_RGB, GL_UNSIGNED_BYTE, pImgData);

    glBegin(GL_QUADS);
        glTexCoord2f(0, 1);
        glVertex2f(-1,-1);
        glTexCoord2f(0, 0);
        glVertex2f(-1,1);
        glTexCoord2f(1,0);
        glVertex2f(1,1);
        glTexCoord2f(1,1);
        glVertex2f(1,-1);
    glEnd();

    glDisable(GL_TEXTURE_2D);

    glMatrixMode (GL_MODELVIEW);
    glPopMatrix();
    glMatrixMode (GL_PROJECTION);
    glPopMatrix ();
    glMatrixMode (GL_MODELVIEW);


    glUseProgram(0);

    }
4

1 に答える 1

2

read()呼び出しで状態の変化を調べましたが、実際の問題は、setupTexturesAndShaders()関数が別のコンテキストにあることでした。これにより、同じコンテキストで最初にglTexImage2Dを呼び出さずに、glTexSubImage2Dが呼び出され、任意のサイズの画像が範囲外になると思います。正しい方向に考えさせてくれてありがとう

于 2012-01-05T16:20:44.603 に答える