Я думаю, что лучший способ сделать это, как вы сказали, визуализировать все в текстуру с низким разрешением (лучше всего это сделать с помощью FBOs ), а затем просто отобразить текстуру, нарисовав квадрат размером с сцену. (конечно, используя GL_NEAREST
в качестве фильтра увеличения для текстуры). Возможно, вы также можете использовать glBlitFramebuffer
для копирования непосредственно из FBO с низким разрешением в кадровый буфер с высоким разрешением, хотя я не знаю, можете ли вы скопировать напрямую в стандартный буфер кадров (отображаемый) таким образом.
РЕДАКТИРОВАТЬ: После просмотра спецификации для framebuffer_blit кажется, что вы можете просто скопировать из FBO с низким разрешением в кадровый буфер по умолчанию с высоким разрешением, используя glBlitFramebuffer(EXT/ARB)
. Это может быть быстрее, чем использование четырехугольника с отображением текстуры, поскольку он полностью обходит конвейер фрагмента вершины (хотя это было бы простым). И еще одно преимущество заключается в том, что вы также получаете буферы глубины низкого разрешения и трафарета, если это необходимо, и можете таким образом отображать содержимое высокого разрешения поверх фона низкого разрешения, что может быть интересным эффектом. Так и получилось бы так:
generate FBO with low-res renderbuffers for color and depth (and stencil)
...
glBindFramebuffer(GL_FRAMEBUFFER, lowFBO);
render_scene();
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, 640, 480, 0, 0, 1024, 768,
GL_COLOR_BUFFER_BIT [| GL_DEPTH_BUFFER_BIT], GL_NEAREST);