如何通过更改帧缓冲区大小来处理 png 生成?

How to handle png generation with changing frame buffer size?

我正在为我的绘图代码编写一些单元测试。步骤包括:

  1. 设置 GLFW window 和上下文

    glfwMakeContextCurrent(window);
    glfwGetWindowSize(window, &window_width, &window_height);        
    glfwGetFramebufferSize(window, &frame_buffer_width, &frame_buffer_height);
    
  2. 执行绘图

    beginFrame(); 
    // perform drawing..     
    endFrame();
    
  3. 将绘制的内容输出到 png 文件(使用 stb_image_write)。

    stbi_write_png(file_name, frame_buffer_width, frame_buffer_height, 4, image.get(), frame_buffer_width * 4);
    
  4. 将生成的 png 与参考图像进行比较(使用图像的像素比较)。

我遇到的问题是frame_buffer_widthframe_buffer_height并不总是一致的。更具体地说,有时它们 1:1 到 window 大小,有时它们的大小加倍。这会使测试失败,因为生成的 png 并不总是相同的(而参考图像大小是恒定的)。使用 window_width 和 window_height 写入 png 不是正确的方法。

根据 GLFW 文档 link

The size of a framebuffer may change independently of the size of a window.

我还在某处读到,特别是对于 macOS,帧缓冲区大小可以是 window 大小的两倍。

如何解决更改帧缓冲区大小的问题?

由于多种原因,依赖默认帧缓冲区进行测试是错误的。除了未确定的大小,位深度也可以改变,以及一些像素可能无法通过像素所有权测试。

相反,出于单元测试的目的,重构您的渲染代码,以便它可以渲染到屏幕外的 FBO。然后你可以创建一个确定大小和格式的 FBO,渲染它,并将它保存到一个文件。