C++ OpenGL帧缓冲区渲染在高分辨率下失败

C++ OpenGL帧缓冲区渲染在高分辨率下失败,c++,opengl,framebuffer,C++,Opengl,Framebuffer,在我的代码中,我正在渲染Mandelbrot分形,我注意到当我将分辨率从7680x4320提高到15360x8640时,输出图像变为空白,没有OpenGL错误报告 尺寸在允许的16384x16384限制内,GPU内存没有溢出,因为我没有内存不足错误 我的GPU:Intel(R)HD Graphics 4000,Build 10.18.10.4425 OpenGL版本:4.0.0 代码: constexpr GLsizei宽度=15360; constexpr GLsizei高度=8640;

在我的代码中,我正在渲染Mandelbrot分形,我注意到当我将分辨率从7680x4320提高到15360x8640时,输出图像变为空白,没有OpenGL错误报告

尺寸在允许的16384x16384限制内,GPU内存没有溢出,因为我没有内存不足错误

  • 我的GPU:Intel(R)HD Graphics 4000,Build 10.18.10.4425
  • OpenGL版本:4.0.0
代码:

constexpr GLsizei宽度=15360;
constexpr GLsizei高度=8640;
//注意:我只对OpenGL上下文使用GLFW
glfwInit();
glfwWindowHint(GLFW_可见,GL_假);
GLFWwindow*window=glfwCreateWindow(800600,“Mandelbrot生成器”,nullptr,nullptr);//窗口的分辨率并不重要
glfwMakeContextCurrent(窗口);
//注意:我正在包装OpenGL调用,以允许为每个func调用glGetError()
//生成帧缓冲区的代码
gl::GenFramebuffers(1,&fbo);
gl::GenRenderbuffers(1和rbo);
gl::BindRenderBuffer(rbo);
gl::SetRenderbufferStorage(gl::e_RGBA,宽度,高度);
gl::BindFramebuffer(gl::e_DrawFramebuffer,fbo);
gl::SetFramebufferRenderBuffer(gl::e_DrawFramebuffer,gl::e_ColorAttachment0,rbo);
//渲染
gl::BindFramebuffer(gl::e_DrawFramebuffer,fbo);
{
gl::Clear(gl::e_ColorBufferBit);
gl::SetViewport(0,0,宽度,高度);
gl::BindBuffer(gl::e_ArrayBuffer,rect);//rect是一个全屏四元组
gl::DrawArray(gl::e_三角形,0,6);
gl::BindBuffer(gl::e_ArrayBuffer,0);
}
gl::BindFramebuffer(gl::e_DrawFramebuffer,0);
//保存图像
标准::矢量像素(宽度*高度*4);
{
gl::BindFramebuffer(gl::e_ReadFramebuffer,fbo);
gl::ReadPixels(0,0,宽度,高度,gl::e_RGBA,gl::e_UnsignedByte,pixels.data());
}
编码(“mandelbrot.png”,像素,宽度,高度);

是什么让你如此确定16384是你特定GPU/驱动程序组合的实际限制?@derhass我用GL_MAX_RENDERBUFFER_sized查询OpenGL你有SavePNG(..)的文档吗?@HannesHauptmann我不想让代码复杂化,但我使用lodepng来保存和加载(检查编辑的代码)。对此感到抱歉。根据a,限制增加到16K。所以这可能是英特尔的情况。
constexpr GLsizei Width  = 15360;
constexpr GLsizei Height = 8640;

// Note: I'm only using GLFW for the OpenGL context
glfwInit();
glfwWindowHint(GLFW_VISIBLE, GL_FALSE);
GLFWwindow* window = glfwCreateWindow(800, 600, "Mandelbrot Generator", nullptr, nullptr); // the resolution of the window is not important
glfwMakeContextCurrent(window);

// Note: I'm wrapping OpenGL calls to allow for glGetError() to be called for each func
// Code to generate framebuffer
gl::GenFramebuffers(1, &fbo);
gl::GenRenderbuffers(1, &rbo);
gl::BindRenderBuffer(rbo);
gl::SetRenderbufferStorage(gl::e_RGBA, Width, Height);
gl::BindFramebuffer(gl::e_DrawFramebuffer, fbo);
gl::SetFramebufferRenderBuffer(gl::e_DrawFramebuffer, gl::e_ColorAttachment0, rbo);

// Rendering
gl::BindFramebuffer(gl::e_DrawFramebuffer, fbo);
{
    gl::Clear(gl::e_ColorBufferBit);
    gl::SetViewport(0, 0, Width, Height);
    gl::BindBuffer(gl::e_ArrayBuffer, rect); // rect is a fullscreen quad
    gl::DrawArrays(gl::e_Triangles, 0, 6);
    gl::BindBuffer(gl::e_ArrayBuffer, 0);
}
gl::BindFramebuffer(gl::e_DrawFramebuffer, 0);

// Saving image
std::vector<GLubyte> pixels(Width * Height * 4);
{
    gl::BindFramebuffer(gl::e_ReadFramebuffer, fbo);
    gl::ReadPixels(0, 0, Width, Height, gl::e_RGBA, gl::e_UnsignedByte, pixels.data());
}
lodepng::encode("mandelbrot.png", pixels, Width, Height);