Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Problemas de prueba OpenGL ES2 Alpha

Estoy procesando en 3D objetos múltiples con texturas que tienen alfa. Todas las texturas cargan bien, pero cuando trato de hacerlas frente a la otra, obtengo lo siguiente:

Izquierda es lo que tengo. Bien es lo que quiero

  • ¿Cómo construir Celestia a Android?
  • Luz de punto libgdx no funciona en la malla generada
  • Manera recomendada de cargar (no interactivo) animaciones (hechas usando Maya) en OpenGL ES en iOS y Android
  • Carrusel 3D en Android
  • Motor de juego Android NDK
  • Carga de modelos 3d con jPCT-AE
  • Izquierda es lo que tengo. Bien es lo que debería ser. La cuadrícula es sólo para ayudar a visualizar la perspectiva.

    La textura delante de la textura roja del círculo se acorta. Busqué alrededor de una respuesta y dice para mí utilizar:

    GLES20.glEnable( GLES20.GL_BLEND ); GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA ); 

    Pero lo estoy usando y todavía no está funcionando. Mi configuración en la que he colocado correctamente en la función onSurfaceCreated () es:

     GLES20.glClearColor( 0.75f, 0.85f, 1f, 1.0f ); GLES20.glEnable( GLES20.GL_BLEND ); GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA ); GLES20.glEnable( GLES20.GL_DEPTH_TEST ); GLES20.glDepthFunc( GLES20.GL_LEQUAL ); GLES20.glDepthMask( true ); GLES20.glClearDepthf( 1f ); 

    Mi shader de fragmentos es:

     uniform sampler2D texture; varying vec2 texCoord; void main(){ gl_FragColor = texture2D( texture, texCoord ); } 

    ¿Debo incluir algo en el manifiesto de Android para habilitar la prueba alfa? No quiero acabar teniendo que organizar manualmente mis polígonos o utilizar alpha descartar () porque necesito y quiero que algunos píxeles sean translúcidos.

    ¿Cómo puedo conseguir que los búferes 3D de profundidad de prueba funcionen?

  • Proguard que causa RuntimeException (Unmarshalling código de tipo desconocido) en la clase Parcelable
  • Archivos DDMS no encontrados Error
  • Reproductor de medios de Android: descargue a archivo y secuencia de archivo
  • Android dibuja usando SurfaceView y el hilo
  • Hacer inserciones SQLite eficientes con Android
  • No se puede resolver el método setLatestEventInfo
  • 2 Solutions collect form web for “Problemas de prueba OpenGL ES2 Alpha”

    Aquí hay una descripción de algunos métodos para procesar con transparencia en OpenGL, con ventajas y desventajas para cada uno.

    Pruebas Alpha

    Este es un método muy limitado, pero es suficiente para el caso específico que el cartel le preguntó. El ejemplo mostrado no necesita transparencia, ya que todo es completamente opaco o totalmente transparente (alpha = 1.0 o alpha = 0.0).

    Solía ​​haber una prueba alfa para este propósito en OpenGL, pero eso es una característica obsoleta, y por supuesto no está en ES. Puedes emular lo mismo en tu fragment shader, que se verá así:

     vec4 val = texture2D(tex, texCoord); if (val.a > 0.5) { gl_FragColor = val; } else { discard; } 

    Ventajas:

    • Sencillo.
    • No hay trabajo adicional en el lado de la aplicación.

    Desventajas:

    • Sólo funciona para una opacidad total / transparencia, no puede hacer frente a la semi-transparencia.
    • Puede perjudicar el rendimiento porque normalmente significa que la prueba de profundidad antes de que el fragmento shader tiene que ser deshabilitado.

    Clasificación y mezcla

    La transparencia de renderizado es un caso de uso primario para la mezcla. El enfoque más común es establecer la función de mezcla en SRC_ALPHA, ONE_MINUS_SRC_ALPHA , habilitar la mezcla y renderizar con el componente alfa de los fragmentos procesados ​​que contienen la opacidad deseada.

    Si la escena contiene una mezcla de objetos completamente opacos y objetos con transparencia, los objetos completamente opacos pueden ser procesados ​​primero, sin necesidad de que se ordenen. Sólo los objetos con transparencia necesitan ser ordenados. La secuencia es entonces:

    1. Proporciona una geometría totalmente opaca.
    2. Proporciona una geometría no opaca, ordenada de nuevo al frente.

    Ventajas:

    • Puede manejar semitransparencia.
    • Puede manejar múltiples capas de geometría transparente.
    • Rendering en sí es muy eficiente.

    Desventajas:

    • Requiere la clasificación para el resultado correcto. Para la función de mezcla mencionada anteriormente, la geometría tiene que ser devuelta al frente. Dependiendo de la aplicación, esto puede ser entre no gran cosa y casi imposible. Por ejemplo, para representar correctamente la geometría que se intersecta, puede que tenga que empezar a dividir triángulos, lo cual está lejos de ser atractivo.

    Depilación Depilación

    Este es un uso muy inteligente de las características OpenGL, IMHO, y puede ser una buena solución práctica. Requiere múltiples pases de renderizado. La forma simple requiere 3 pases:

    1. Render la escena con los ajustes habituales (prueba de profundidad activada, función de profundidad MENOS, color y profundidad de escritura activada), pero renderizar sólo la geometría completamente opaca. Si la opacidad es por objeto, puede manejarlo omitiendo las llamadas de dibujo para objetos no opacos. De lo contrario, tendrá que desechar fragmentos no opacos con un sombreador similar al que se muestra en la sección Prueba alfa anterior.
    2. Render la geometría no opaca con los mismos ajustes que anteriormente, excepto que la escritura de color está deshabilitada.
    3. Proporcione de nuevo la geometría no opaca, pero esta vez con la función de profundidad EQUAL, la escritura de color habilitada de nuevo, la escritura de profundidad desactivada y el uso de mezcla.

    Se puede utilizar un sombreado mínimo para el paso 2, ya que no necesita producir ningún fragmento de colores válido.

    Ventajas:

    • Fácil de implementar.
    • Razonablemente eficiente, no requiere clasificación.
    • Maneja correctamente la semitransparencia.

    Desventajas:

    • La forma simple sólo dibuja la capa más frontal de la geometría transparente. Esto puede sonar como una limitación importante, pero los resultados pueden parecer realmente muy buenos. Hay formas más avanzadas donde se producen capas adicionales con pases adicionales. Más allá de la sobrecarga para los pases adicionales, también se vuelve más complejo, ya que requiere múltiples búferes de profundidad. Creo que hay un libro blanco sobre el sitio web de NVIDIA.

    Alfa a Cobertura

    No he utilizado esto yo mismo, por lo que la siguiente se basa en mi limitada comprensión teórica. Parece otro método interesante. Esto requiere representación multi-muestreada. La función está habilitada con glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE) , que luego traduce valores alfa en una máscara de cobertura, resultando en que sólo se escriben partes de las muestras dependiendo del valor alfa. Esto da como resultado un efecto de transparencia cuando el búfer multi-muestra es muestreado por debajo del búfer de color final.

    Ventajas:

    • Puede manejar semitransparencia.
    • Maneja correctamente múltiples capas de transparencia.
    • Eficiente, sobre todo si MSAA se hubiera utilizado de todos modos. No se requiere clasificación.

    Desventajas:

    • Requiere MSAA. Moderno GPUs son muy eficaces en la prestación MSAA, por lo que este no es un gran problema. Muchas veces, es probable que desee utilizar MSAA de todos modos.
    • La resolución eficaz del valor alfa es muy pequeña, a menos que me falte algo. Por ejemplo, con 4x MSAA, sólo puede representar 5 posibles valores alfa (0, 1, 2, 3, 4 muestras establecidas en la máscara de cobertura).

    La respuesta aceptada no lo cubre.

    En su caso, la solución es desactivar la prueba de profundidad y posiblemente invertir el orden que está dibujando.

    El descarte de sombreado es un hack que parecerá horrible si necesitas un rango de valores alfa.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.