如何在GLX/OpenGL中调整现有pbuffer曲面的大小?

bogh5gae  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(96)

我正在使用GLX pbuffer surface来渲染Linux中的OpenGL应用程序。

GLOffscreenBuffer::GLOffscreenBuffer(unsigned width, unsigned height)
    : m_width(width)
    , m_height(height)
    , m_display(XOpenDisplay(0))
    , m_pbuffer(0)
    , m_context(0)
{
    if (!m_display) {
        std::cerr << "Error: XOpenDisplay()\n";
        return;
    }

    static const int configAttributes[] = {
        GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT,
        GLX_RENDER_TYPE, GLX_RGBA_BIT,
        GLX_RED_SIZE, 8,
        GLX_GREEN_SIZE, 8,
        GLX_BLUE_SIZE, 8,
        GLX_ALPHA_SIZE, 8,
        GLX_DOUBLEBUFFER, GL_FALSE,
        0
    };
    int configCount;
    GLXFBConfig* config = glXChooseFBConfig(m_display, 0, configAttributes, &configCount);
    if (!configCount) {
        std::cerr << "Error: glXChooseFBConfig()\n";
        XFree(config);
        XCloseDisplay(m_display);
        return;
    }

    static const int pbufferAttributes[] = {
        GLX_PBUFFER_WIDTH, static_cast<int>(width),
        GLX_PBUFFER_HEIGHT, static_cast<int>(height),
        0
    };
    m_pbuffer = glXCreatePbuffer(m_display, config[0], pbufferAttributes);
    if (!m_pbuffer) {
        std::cerr << "Error: glXCreatePbuffer()\n";
        XFree(config);
        XCloseDisplay(m_display);
        return;
    }

    m_context = glXCreateNewContext(m_display, config[0], GLX_RGBA_TYPE, 0, GL_TRUE);
    XFree(config);
    if (!m_context) {
        std::cerr << "Error: glXCreateNewContext()\n";
        glXDestroyPbuffer(m_display, m_pbuffer);
        XCloseDisplay(m_display);
        return;
    }
}

但是我不知道在处理X11的大小调整事件时如何调整这个pbuffer表面的大小。如果你能提供一个演示就更好了。

qaxu7uf2

qaxu7uf21#

简单地说,你不能调整pbuffer的大小,唯一的办法是销毁旧的缓冲区,创建一个新的。
例如:

//in order to receive configure events,
//StructureNotifyMask must be set in the event mask
//e.g. XSelectInput(dpy, win, StructureNotifyMask);

XEvent evt;
XNextEvent(dpy, &evt);

switch (evt.type) {

    case ConfigureNotify:

        if (m_pbuffer) {
            glXDestroyPbuffer(...);
        }

        //width : evt.xconfigure.width;
        //height: evt.xconfigure.height;
        m_pbuffer = glXCreatePbuffer(...);

    break;

}

注意:正如@datenwolf在评论中指出的,渲染到纹理最好通过帧缓冲区对象完成。

相关问题