opengl - reales - libro de android studio en español pdf
En OpenGL, ¿cómo puedes obtener elementos para retroceder al frente? (6)
Por defecto, parece que los objetos se dibujan de adelante hacia atrás. Estoy dibujando un objeto de interfaz de usuario en 2-D y me gustaría crearlo de nuevo al frente. Por ejemplo, podría crear un cuadrado blanco primero y luego crear un cuadrado negro ligeramente más pequeño encima de él creando así un panel negro con un borde blanco. Esta publicación tuvo un poco de discusión y describió este orden como el "Algoritmo del pintor", pero finalmente el ejemplo que dieron simplemente procesó los objetos en orden inverso para obtener el efecto deseado. Me imagino de vuelta al frente (los primeros objetos van hacia atrás, los objetos posteriores se dibujan en la parte superior), la representación puede lograrse mediante alguna transformación (¿gOrtho?)?
También mencionaré que no estoy interesado en una solución que use una biblioteca contenedora como GLUT.
También encontré que el comportamiento predeterminado en Mac con el Cocoa NSOpenGLView parece retroceder al frente, mientras que en Windows no puedo obtener este comportamiento. El código de configuración en Windows que estoy usando es este:
glViewport (0, 0, wd, ht);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho (0.0f, wd, ht, 0.0f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
Dibuje los elementos en los que desea colocar ligeramente detrás de los elementos que quiere que estén al frente. Es decir, en realidad cambie el valor z (suponiendo que z es perpendicular al plano de la pantalla). No tiene que cambiarlo demasiado para que los artículos se dibujen uno frente al otro. Y si solo cambia ligeramente el valor de z, no debería notar mucho desplazamiento de su posición deseada. Incluso puede ir realmente elegante, y calcular la posición x, y correcta en función de la posición z modificada, de modo que el elemento aparezca donde se supone que debe estar.
El orden de dibujo es difícil. No hay una solución fácil. El alogoritmo del pintor (ordenar los objetos por su distancia en relación con la vista de su cámara) es el más sencillo, pero como ha descubierto, no resuelve todos los casos.
Sugeriría una combinación del algroitmo y las capas del pintor. Construyes capas para elementos específicos en tu programa. Así que tienes una capa de fondo, capas de objetos, capas de efectos especiales y capa de GUI.
Usa el algoritmo del pintor en los elementos de cada capa. En algunas capas especiales (como la capa de su GUI), no ordene con el algoritmo del pintor, sino según su orden de llamada. Llamas a ese cuadrado blanco primero para que se dibuje primero.
Para su pregunta específica, no, no hay una forma estandarizada para especificar el orden de profundidad en OpenGL. Algunas implementaciones pueden hacer el orden de profundidad de frente a atrás de forma predeterminada porque generalmente es más rápido, pero eso no está garantizado (como descubriste).
Pero realmente no veo cómo te ayudará en tu situación. Si dibujas un cuadrado negro delante de un cuadrado blanco, el cuadrado negro debe dibujarse delante del cuadrado blanco, independientemente del orden en que estén dibujados, siempre que tengas habilitado el almacenamiento en profundidad. Si en realidad son coplanares, ninguno está realmente en frente del otro y cualquier algoritmo de clasificación de profundidad sería impredecible.
El tutorial sobre el que publicó un enlace solo lo mencionó porque la ordenación en profundidad ES relevante cuando usa transparencia. Pero no me parece que sea eso lo que buscas.
Pero si realmente tienes que hacerlo de esa manera, entonces tienes que hacerlo tú mismo. Primero envíe su cuadro blanco a la tubería de renderizado, fuerce el renderizado, y luego envíe su cuadro negro. Si lo haces de esa manera y deshabilitas el buffer de profundidad, entonces los cuadrados pueden ser coplanares y aún se te garantizará que el cuadrado negro se dibuje sobre el cuadrado blanco.
Como señaló AlanKley, la forma de hacerlo es desactivar el buffer de profundidad. El algoritmo del pintor es realmente una técnica de conversión de escaneo 2D utilizada para representar polígonos en el orden correcto cuando no tiene algo como un z-buffer. Pero no lo aplicarías a los polígonos 3D. Por lo general, los transforma y proyecta (maneja las intersecciones con otros polígonos) y luego ordena la lista resultante de polígonos proyectados en 2D por su coordenada z proyectada, luego los dibuja en orden z invertido.
Siempre he pensado en el algoritmo del pintor como una técnica alternativa para eliminar superficies ocultas cuando no puedes (o no quieres) usar un z-buffer.
La siguiente llamada desactivará la prueba de profundidad haciendo que los objetos se dibujen en el orden creado. Esto, en efecto, hará que los objetos retrocedan hacia adelante.
glDepthFunc(GL_NEVER); // Ignore depth values (Z) to cause drawing bottom to top
Asegúrate de no llamar esto:
glEnable (GL_DEPTH_TEST); // Enables Depth Testing
Su material se dibujará en el orden exacto al que llama las funciones glBegin / glEnd. Puede obtener buffering de profundidad usando z-buffer, y si sus objetos 2d tienen valores z diferentes, puede obtener el efecto que desee de esa manera. La única forma en que está viendo el comportamiento que describe en la Mac es si el programa está dibujando cosas en orden de ida y vuelta manualmente o usando z-buffer para lograr esto. De lo contrario, OpenGL no tiene ninguna funcionalidad automáticamente como usted describe.