Yo uso SDL2 .
Actualmente, mi único sombreador tiene una matriz MVP y transforma los puntos con ella.
Calculo mi matriz de Vista y Proyección para una cámara con GLM:
glm::lookAt(pos, pos + forward, up);
glm::perspective(fov, aspectRatio, zNear, zFar);
Lo busqué, pero solo puedo encontrar la implementación heredada de múltiples ventanas gráficas.
Si creo, por ejemplo, 4 cámaras y digamos que todas son iguales , excepto que cada cámara tiene un cuarto diferente de la pantalla para renderizar. (Entonces quiero 4 viewports con el mismo contenido)
¿Cómo puedo hacer esto? Lo siento si no di suficiente información, no dude en preguntar.
Respuestas:
El renderizado a diferentes viewports (partes) de la misma pantalla se puede hacer de la siguiente manera:
Por ejemplo, dividir la pantalla en cuatro partes y renderizar la misma escena cuatro veces en cada esquina con diferentes uniformes y diferentes vistas:
fuente
viewport
son x, y de la esquina inferior izquierda del fragmento y ancho, altura del fragmento. Con la mezcla puedes experimentar.Si está escribiendo su propio Vertex / Fragment Shader, existe otra posibilidad adicional para hacerlo. Es mucho más complicado pero puede ser útil para usted y para otros. Además, acelera todo el proceso de dibujo, ya que solo utiliza una llamada a un comando de dibujo. El número máximo de Viewports está definido por GL_MAX_VIEWPORTS y generalmente es 16.
Desde OpenGL 4.1 existe el método glViewportArrayv . Puede definir una matriz de ventanas gráficas. Las ventanas gráficas creadas por este método tienen un índice asignado.
Este índice se puede usar en el sombreador de vértices para establecer la ventana gráfica en la que se representa la escena. ( Debe incluir la extensión " ARB_shader_viewport_layer_array " en el código del sombreador)
En su caso, sugeriría hacer lo siguiente:
fuente
Esta es una copia de la respuesta de @ narthex, excepto con solo las ventanas gráficas, ya que eso es todo lo que necesita. No estoy seguro de por qué el material del búfer / mezcla de cuadros está incluido en su respuesta.
fuente
Estas son todas buenas respuestas y, sin embargo, hay otra manera: (¿No hay siempre?)
Debido a la creciente popularidad de la realidad virtual, la gente de OculusVR ha desarrollado un trío de extensiones "Multiview" llamadas:
Estas extensiones permiten que se visualicen múltiples vistas de la misma escena en una sola llamada de dibujo, eliminando la redundancia de renderizar la misma escena en el mismo estado desde el punto de vista de cada ojo. Aunque creado con el propósito de VR, el desarrollador no se limita necesariamente a solo dos vistas. Más bien, esta extensión permite tantas vistas como MAX_VIEWS_OVR especifica.
Antes de usar estas extensiones, el desarrollador debe verificar su compatibilidad en el controlador de gráficos del usuario agregando el siguiente código:
A partir de ahí, se trata de configurar su framebuffer para utilizar esta función:
y del mismo modo en el sombreador:
En una aplicación vinculada a la CPU, esta extensión puede reducir drásticamente el tiempo de renderizado, especialmente con escenas más complejas :
fuente