如何通过更改帧缓冲区大小来处理 png 生成?
How to handle png generation with changing frame buffer size?
我正在为我的绘图代码编写一些单元测试。步骤包括:
设置 GLFW window 和上下文
glfwMakeContextCurrent(window);
glfwGetWindowSize(window, &window_width, &window_height);
glfwGetFramebufferSize(window, &frame_buffer_width, &frame_buffer_height);
执行绘图
beginFrame();
// perform drawing..
endFrame();
将绘制的内容输出到 png 文件(使用 stb_image_write)。
stbi_write_png(file_name, frame_buffer_width, frame_buffer_height, 4, image.get(), frame_buffer_width * 4);
将生成的 png 与参考图像进行比较(使用图像的像素比较)。
我遇到的问题是frame_buffer_width和frame_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,渲染它,并将它保存到一个文件。
我正在为我的绘图代码编写一些单元测试。步骤包括:
设置 GLFW window 和上下文
glfwMakeContextCurrent(window); glfwGetWindowSize(window, &window_width, &window_height); glfwGetFramebufferSize(window, &frame_buffer_width, &frame_buffer_height);
执行绘图
beginFrame(); // perform drawing.. endFrame();
将绘制的内容输出到 png 文件(使用 stb_image_write)。
stbi_write_png(file_name, frame_buffer_width, frame_buffer_height, 4, image.get(), frame_buffer_width * 4);
将生成的 png 与参考图像进行比较(使用图像的像素比较)。
我遇到的问题是frame_buffer_width和frame_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,渲染它,并将它保存到一个文件。