Cómo hacer transparente el fondo de una imagen dibujada con Android OpenGL ES
OpenGLES es algo frustrante. Tienes que usarlo para hacer 3D en tu teléfono Android. Permítanme compartir algunas notas que tomé aquí: Introducción a Android OpenGL ES 20011-6-3 El sistema Android utiliza la interfaz estándar OpenGL para admitir funciones de gráficos 3D. El sistema de gráficos 3D de Android también se divide en dos partes: marco Java y código local. . El código local implementa principalmente la biblioteca de interfaz OpenGL. En la capa de marco de Java, javax.microedition.khronos.opengles es el paquete OpenGL estándar de Java. El paquete android.opengl proporciona la conexión entre el sistema OpenGL y el sistema GUI de Android. El código local de Android se encuentra en frameworks/base/opengl, el código JNI se encuentra en frameworks/base/core/com_google_android_gles_jni_GLImpl.cpp y frameworks/base/core/com_google_android_gles_jni_EGLImpl.cpp, y la clase java se encuentra en opengl/java/javax /microedition/khronos para pruebas locales El código se encuentra en frameworks/base/opengl/tests. Incluyendo angeles, fillrate y otros 14 códigos de prueba, estos códigos se pueden probar localmente a través de la terminal (adb shell se usa en el simulador). La operación de canalización fija de OpenGL ES 1.x admite funciones como glVertexPointer (), pero no es compatible con GLSL. El archivo de encabezado está en el directorio GLES de ndk y el archivo de biblioteca es libGLESv1_CM.so. Las operaciones de canalización programables de OpenGL ES 2.x no son compatibles con 1.x y no admiten operaciones de canalización fijas, como glVertexPointer() y otras funciones. Soporta GLSL (también debe programarse con esto). El archivo de encabezado está en el directorio GLES2 de ndk y el archivo de biblioteca es libGLESv2.so. OpenGL ES Learning 2011-6-30OpenGL define sus propios tipos de datos. Debe ceñirse a estos tipos de datos OpenGL para garantizar la portabilidad y la eficiencia. OpenGL ES actualmente no admite tipos de datos de 64 bits. OpenGL ES solo admite triángulos. OpenGL ES solo admite funciones que comienzan con gl y la biblioteca glu no las admite.
Funciones OpenGL ES eliminadas de OpenGL: 1. glBegin/glEnd2. glArrayElement3. Lista de visualización 4. Evaluador 5. Modo de color indexado 6. Plano de recorte personalizado 7. Procesamiento de imágenes (esto no está disponible en tarjetas gráficas generales, gráficos FireGL/Quadro). la tarjeta tiene)9. Búfer de selección11. Banderas de límite13. TEXTURE_R ECT, TEXTURE_CUBE_MAP17. GL_COMBINE18 Generación automática de coordenadas 19. Límite de textura 20. GL_CLAMP, GL_CLAMP_TO_BORDER21. Representación de textura que desaparece 22. Limitación de LOD de textura 23. Limitación de preferencia de textura 24. Compresión y descompresión automática de textura 25. glDrawPixels, glPixelTransfer, glPixelZoom26, glDrawBuffer, glCopyPixelsOpenGL ES 2.0 2011- 10-. 92.0 y 1.1 no son compatibles. - El archivo de encabezado utilizado por 2.0 es el directorio GLES2 bajo el directorio de inclusión de ndk, que incluye gl2.h, gl2ext.h, gl2platform.h, mientras que 1.1 usa el directorio GLES. - El archivo de biblioteca utilizado por 2.0 es libGLESv2.so en el directorio lib de ndk, mientras que 1.1 usa libGLESv1_CM.so. - Muchas funciones de 1.1 se han cancelado en 2.0, como glMatrixModel y glLoadIdentity. Lenguaje de sombreado OpenGL (GLSL - Lenguaje de sombreado OpenGL): para utilizar 2.0, debe aprender este idioma. Porque se han cancelado muchas funciones 1.1. san-angeles Programa de muestra NDK OpenGL ES 1.1 2012-3-8 San Ángeles, consulte Wikipedia, es una ciudad ficticia conceptualmente futura ubicada en el sur de California. Aparece frecuentemente en películas y proviene de Los Ángeles y San Diego. El efecto demostrativo de este programa es observar una ciudad magnífica, con espejos en el suelo y reflejos de edificios, y naves espaciales volando sobre la ciudad. Hay 5 o 6 puntos de observación en la parte delantera y trasera, y la cámara sigue moviéndose en cada punto de observación. En este ejemplo, se utiliza NDK(C) para llamar a OpenGL ES 1.1 para dibujar la ciudad de San Ángeles. Básicamente todos usan NDK y solo hay un programa Java. Utilice vc2005 para demostrarlo, con el fin de comprender algunos detalles mediante el seguimiento del código. El método es: - Copie todos los archivos .h en jni, así como demo.c y app-win32.c, colóquelos en un directorio especial y luego transfórmelos para usar OpenGL en lugar de ES.
(O simplemente elimine una sección grande del código de dibujo para asegurarse de que se complete la compilación). Primero analice el código Java: DemoActivity.java, que es el único archivo Java. Requiere principalmente las siguientes 4 interfaces jni: - nativo estático privado void NativeInit. (); // Inicialización - privado estático nativo void nativoResize(int w, int h); - privado estático nativo void NativeRender(); // Dibujar 1 fotograma - privado estático nativo void NativeDone(); android.c- primero, llamando a importGLInit() para importar dinámicamente la biblioteca OpenGL. - En segundo lugar, se llama a appInit() para crear una colección de objetos 3D independientes de la plataforma en la memoria. El método de creación consiste en utilizar una matriz para generar muchos triángulos de forma similar a dibujar un círculo y elevarlo. - Luego, llame a appRender() en cada ciclo de reloj, los detalles son: - prepareFrame(ancho, alto); // Prepare el marco de dibujo de OpenGL ES. De hecho, significa borrar los buffers de color y profundidad, y restablecer las matrices de proyección y modelo. - camTrack(); // Calcula la posición, orientación y distancia focal de la lente en el ciclo de reloj actual. Luego llame a gluLookAt para lograrlo. - configureLightAndMaterial(); // Establece la fuente de luz y el material - drawModels(-1); // Dibuja el reflejo primero (en realidad, dibuja el eje z de todos los modelos al revés) - El primer ciclo es para dibujar objetos delicados - El segundo bucle es para dibujar objetos en movimiento - drawGroundPlane(); // Luego dibuja el suelo en forma de espejo. Aclare antes de pintar, active la difuminación y pinte. Restaurar el estado después del dibujo. - drawModels(1); // Luego dibuja todos los modelos - drawFadeQuad(); // Finalmente dibuja el cuadro de desvanecimiento y usa la fusión para dibujar un cuadro 2D que cubra toda la ventana gráfica.