1

OpenGLのドキュメントによると、ピクセル読み取りのソースをのいずれかに設定できるはずですGL_COLOR_ATTACHMENTi。しかし、これを試してみるとglGetErrorGL_INVALID_ENUMエラーが発生します。後続はglReadPixels単にバックバッファを読み取ります。

によって報告されたバージョンglGetString(GL_VERSION)はです4.2.11627 Core Profile Forward-Compatible Context。Linuxで実行していて、fglrx atiドライバ(バージョン8.96.7-120312a-135598C-ATI)をインストールしています。

FBOがバインドされて完了していることを確認しました。glGetErrorまた、以前の呼び出しで設定されていないことも確認しました。

これですでに失敗します(ここではエラーが予想されますが、ではありませんINVALID_OPERATIONINVALID_ENUM

#include <iostream>
#include "Window.h" // My own class based on sfml, but I am sure context creation works fine
#include <glload/gll.hpp>
#include <glload/gl_core.hpp>

int main()
{
    const unsigned int screenW = 1280, screenH = 720;
    Window w(screenW, screenH, 32, false);
    if (glload::LoadFunctions() == glload::LS_LOAD_FAILED)
    {
        std::cerr << "glload failed to load" << std::endl;
        return -1;
    }
    gl::ReadBuffer(gl::GL_COLOR_ATTACHMENT0);
    if( gl::GetError() == gl::GL_INVALID_ENUM)
    {
        std::cerr << "Invalid enum error" << std::endl;
        return -1;
    }
    return 0;
}

この呼び出しがトリガーされる可能性がある別の理由がありINVALID_ENUMますか、それとも私が使用しているOpenGL実装にバグがある可能性が高いですか?

4

1 に答える 1

2

ただし、これを試してみると、glGetErrorによってGL_INVALID_ENUMエラーが発生します。後続のglReadPixelsは、単にバックバッファを読み取ります。

バックバッファから読み取っている場合、それはデフォルトのフレームバッファ がまだバインドされていることを意味します。そして、現在のglReadBufferフレームバッファの読み取りバッファを設定します。

デフォルトのフレームバッファにはsがありませんGL_COLOR_ATTACHMENT。したがって、これらのイメージの1つを読み取りバッファーとして設定するとエラーになります。最初にFBOをバインドしてから、読み取りバッファを設定する必要があります。glReadBufferフレームバッファのバインドをGL_READ_FRAMEBUFFER、ではなく、に設定することに注意してくださいGL_DRAW_FRAMEBUFFER。したがって、適切な場所にバインドされていることを確認してください。

于 2012-07-15T16:56:08.470 に答える