opengl-es clipping bounding-box

opengl-es - opengl es 3.0 android



Recorte OpenGL (1)

La caja de tijera es una herramienta simple para necesidades simples. Si tienes necesidades menos simples, entonces vas a tener que usar el mecanismo menos simple de OpenGL para clipping: el buffer de esténcil.

Suponiendo que no está utilizando el búfer de esténcil para nada más en este momento, tiene acceso a 8 bits de esténcil. Al asignarle a cada nivel de su gráfico de escena un número más alto que el anterior, puede asignar a cada nivel su propia máscara de esténcil. Por supuesto, si dos hermanos en el mismo nivel de profundidad se superponen, o simplemente están demasiado cerca, entonces usted tiene un problema.

Otra alternativa es asignar a cada nodo un número del 1 al 255. Con una prueba de plantilla de GL_EQUAL, podrá evitar el problema de superposición anterior. Sin embargo, esto significa que no puedes tener más de 255 nodos en tu gráfico de escena completo. Dependiendo de sus necesidades particulares, esto puede ser una restricción excesiva.

Por supuesto, puede borrar la galería de símbolos (y la profundidad. No intente borrar solo uno de ellos) cuando se agoten los bits con cualquiera de los métodos. Pero eso puede ser un tanto costoso, y requiere que elimines la profundidad, lo cual es posible que no quieras hacer.

Otro método es usar el número creciente y la prueba GL_EQUAL solo para los nodos alineados al eje. Usas la caja de tijera para la mayoría de los nodos, pero si hay alguna rotación (ya sea en ese nodo o heredada), entonces usas la máscara de la plantilla, golpeando el contador de la máscara mientras procesas el gráfico. De nuevo, está limitado a 256 nodos, pero al menos estos son solo para nodos rotados. Dependiendo de sus necesidades y de la cantidad de nodos girados que haya, eso puede ser suficiente.

He estado leyendo artículos sobre clipping ahora durante horas, pero parece que no encuentro una solución para mi problema.

Esta es mi situación:

Dentro de un entorno OpenGL ES (IOS, Android) estoy teniendo un gráfico de escena 2D que consiste en objetos dibujables, formando un árbol.

Cada nodo de árbol tiene su propia sala espacial con su propia matriz de transformación, y cada nodo hereda su espacio de coordenadas a sus hijos. Cada nodo tiene un cuadro delimitador rectangular, pero estos cuadros delimitadores no están alineados con el eje.

Esta configuración funciona perfectamente para renderizar un gráfico de escena en 2D, iterando a través del árbol, representando cada objeto y luego sus elementos secundarios.

Ahora viene mi problema: estoy buscando una manera de habilitar el recorte en un nodo. Con el recorte habilitado, los elementos secundarios de un nodo deben recortarse cuando salen del área del cuadro delimitador del elemento principal.

Por ejemplo, deseo tener un nodo que contenga un conjunto de nodos de texto como secundarios, que se pueda desplazar hacia arriba y hacia abajo con su cuadro delimitador de padres, y se deben recortar al salir del área del cuadro delimitador de los padres.

Como los cuadros delimitadores no están alineados con los ejes, no puedo usar glScissor, que sería la manera más fácil.

Estaba pensando en utilizar el búfer del esténcil y dibujar el rectángulo delimitador lleno en él, cuando el recorte está habilitado y luego habilitar el búfer del esténcil. Esto podría funcionar pero conduce a otro problema: ¿qué sucede si un niño dentro de un nodo recortado tiene un recorte de nuevo? - La máscara de estarcido debería configurarse para el niño, borrando la máscara de esténcil de los padres.

Otra solución en la que estaba pensando es hacer el recorte en el software. Esto sería posible, porque dentro de cada nodo, el recorte podría hacerse con relativa facilidad en su propio espacio de coordenadas local. El retroceso de esta solución sería que el recorte debe implementarse para cada tipo de nodo nuevo que se implemente.

¿Puede alguien aquí señalarme en la dirección correcta? Lo que busco es algo así como la funcionalidad de glscissor para recortar áreas rectangulares no alineadas.