我正在使用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表面的大小。如果你能提供一个演示就更好了。
1条答案
按热度按时间qaxu7uf21#
简单地说,你不能调整pbuffer的大小,唯一的办法是销毁旧的缓冲区,创建一个新的。
例如:
注意:正如@datenwolf在评论中指出的,渲染到纹理最好通过帧缓冲区对象完成。