我正在使用 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就更好了
简单来说,你不能调整一个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 对象完成。