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

问题描述 投票:0回答:1

我正在使用 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 表面的大小。如果能提供demo就更好了

c++ opengl server-side-rendering x11 glx
1个回答
0
投票

简单来说,你不能调整一个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 在评论中指出的那样,渲染到纹理最好通过 Framebuffer 对象完成。

© www.soinside.com 2019 - 2024. All rights reserved.