¿Cuál es el propósito de glScissor?


33

Sé que es más eficiente que la prueba de plantilla, pero ¿estoy en lo cierto al suponer que se podría lograr la misma funcionalidad utilizando transformaciones de proyección con viewport?

Respuestas:


47

Son más complementarios que alternativas entre sí. Casi siempre desea establecer el rectángulo de tijera con los mismos valores que la ventana gráfica.

glViewport () especifica una transformación del espacio de proyección normalizado al espacio de pantalla. Los polígonos se recortan en el borde del espacio de proyección, pero otras operaciones de dibujo como glClear () no. Por lo tanto, utiliza glViewport () para determinar la ubicación y el tamaño de la región de la ventana gráfica del espacio de la pantalla, pero el rasterizador aún puede ocasionalmente generar píxeles fuera de esa región.

Ahí es donde entra la tijera. GlScissor () define un rectángulo de espacio de pantalla más allá del cual no se dibuja nada (si la prueba de tijera está habilitada).

Entonces, por ejemplo, el siguiente código borrará toda la pantalla, aunque la ventana gráfica esté configurada en una pequeña porción de la ventana más grande:

glViewport(200,200,100,100);
glClear(GL_COLOR_BUFFER_BIT);

Agregar glScissor () y habilitar la prueba de tijera (que está deshabilitada por defecto) restringe el borrado.

glViewport(200,200,100,100);
glScissor(200,200,100,100);
glEnable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);

Ocasionalmente, se encuentra con una implementación que se abre automáticamente en la región de la ventana gráfica, pero que viola la especificación GL.

Más allá de eso, el rectángulo de tijera se puede usar para restringir temporalmente el dibujo a un sub-rectángulo de la ventana gráfica, para efectos especiales, elementos de la interfaz de usuario, etc.


11
Para ser más claro, Viewportrecorta los cálculos de vértice. Si dibuja una línea con grosor de línea> 1 o un punto con gl_PointSize> 1, también dibujará fuera de la ventana gráfica.
gman

13

Operan en dos partes completamente diferentes de la tubería de gráficos.

glViewport realmente especifica una transformación, y es una transformación que ocurre después del sombreador de vértices pero antes del sombreador de fragmentos. Si ayuda a ver dónde encaja conceptualmente, piense en términos de que forma parte de las transformaciones que se utilizan para obtener sus datos de vértice del espacio mundial al espacio de la pantalla (es decir, está relativamente relacionado con la vista del modelo y la proyección).

La prueba de tijera ocurre después del sombreador de fragmentos, junto con todas las otras operaciones por fragmento que ocurren en ese momento, como la fusión, la profundidad / plantilla, etc. Cuando la prueba de tijera prueba un fragmento, por lo tanto, ya ha pasado La transformación de la ventana gráfica.

Sí, la prueba de tijera puede ser más rápida puede ser una plantilla porque es un simple aceptar / rechazar basado en las coordenadas de espacio de la pantalla de un fragmento, mientras que la plantilla debe compararse con el valor actual en el búfer de la plantilla, posiblemente aumentar o disminuir ese valor actual, también tener en cuenta los resultados de la prueba de profundidad, etc.

Entonces, juntando todo eso, puedes ver por qué existe la prueba de tijera. Le brinda la capacidad de restringir las operaciones por fragmento a una porción rectangular de la pantalla, pero sin modificar realmente la transformación de la ventana gráfica actual.


6

Me gusta este tipo de cosas explicadas visualmente.

En OnpenGL tenemos coordenadas 2D que van de -1 a +1 tanto para el eje X como para el eje Y.

ingrese la descripción de la imagen aquí

Entonces esta imagen debe ser asignada a las coordenadas de la ventana.

Imaginemos que tenemos una ventana que tiene un color oscuro como fondo y tenemos el blanco como color claro.

El caso más común es que la ventana gráfica y la tijera cubran toda la pantalla.

ingrese la descripción de la imagen aquí

Pero podemos configurarlos para que sean una región más pequeña de la pantalla.

ingrese la descripción de la imagen aquí

Estas regiones pueden ser diferentes. En el siguiente ejemplo, la ventana gráfica cubre toda la pantalla, mientras que tijera es el cuadro más pequeño.

ingrese la descripción de la imagen aquí

Y en este último caso, las tijeras cubren toda la pantalla, mientras que la ventana gráfica es el cuadro más pequeño. Tenga en cuenta que glClearafecta a toda la pantalla, ya que está determinada por la región de tijera.

ingrese la descripción de la imagen aquí


1
Esta es la explicación más clara para mí, realmente necesitaba dibujos.
Laurent Caillette

5

glScissors logra el recorte de la geometría contra una parte de la pantalla.

Desearía esto, por ejemplo, si renderizara un cuadro de GUI que tuviera un texto de desplazamiento suave dentro de él. Desea recortar toda la geometría fuera de la parte de la pantalla cubierta por la GUI, pero mantenga texto parcial o polígonos que todavía están dentro.

glViewport asigna las coordenadas de proyección a las coordenadas del dispositivo, pero no recorta.

glStencil se usa para enmascarar píxeles individuales en patrones más complejos, como formas irregulares. Por lo tanto, glScissors es más rápido.


1

glScissor es más simple que las transformaciones de proyección con viewport.

La prueba glScissor especifica qué píxeles se deben cambiar al renderizar, mientras que glViewport cambia la forma en que gl debe mapearse desde las coordenadas del dispositivo a las coordenadas de la ventana.

Entonces, ¿cuál es la diferencia con configurar la ventana gráfica en el rectángulo al que desea renderizar y ajustar la matriz de proyección para deshacer la escala realizada por la ventana gráfica?

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.