Renderizar solo una parte de la ventana en un framebuffer en OpenGL.
He querido crear un menú de edición usando marcos de visualización en OpenGL (con C ++). Luego rendericé algunos botones en el espacio de menú y después rendericé el framebuffer. Así que al crear el framebuffer, solo quiero que sea capaz de leer y dibujar solo una parte de la pantalla (digamos coordenadas entre X1 y X2 e Y1 e Y2), que luego se convertirá en un archivo adjunto de textura.
El problema es que no sé cómo renderear un framebuffer que tenga un tamaño diferente del tamaño de la ventana. Así que necesito saber cómo lograr esto.
Creo que el código que necesita ser modificado son estas 3 líneas:
1. glRenderBufferStorageMultiSample(GL_FRAMEBUFFER, 4, GL_RGB, SCREEN_WIDTH, SCREEN_HEIGHT);
2. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SCREEN_WIDTH, SCREEN_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
3. glBlitFrameBuffer(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0,0,SCREEN_WIDTH, SCREEN_HEIGHT, GL_COLOR_BUFFER_BIT, GL_NEAREST);
davy.ai
Para crear un framebuffer con una dimensión diferente a la de la ventana, se necesita modificar el código anterior de la siguiente manera:
glRenderBufferStorageMultiSample(GL_FRAMEBUFFER, 4, GL_RGB, framebufferWidth, framebufferHeight);
Aquí,
framebufferWidth
yframebufferHeight
deben ser las dimensiones del tamaño deseado del framebuffer, que pueden ser diferentes a las dimensionesSCREEN_WIDTH
ySCREEN_HEIGHT
.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, framebufferWidth, framebufferHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
Lo mismo se aplica para esta línea también, donde la textura debe asignarse con las dimensiones del framebuffer.
glBlitFrameBuffer(x1, y1, x2, y2, 0, 0, framebufferWidth, framebufferHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
Aquí,
x1
,y1
,x2
ey2
representan las coordenadas de la parte deseada de la pantalla que se va a mostrar en el framebuffer. Estos valores deben usarse en la llamadaglBlitFrameBuffer
para copiar el contenido de la parte seleccionada de la pantalla al nuevo framebuffer.Estas modificaciones deberían permitir crear un framebuffer con una dimensión diferente a la de la ventana y renderizar una parte de la pantalla en él.