Error al asignar variaciones en dispositivos Samsung

Compilación de sombreado de difuminado en dispositivos Samsung falla con error: Error al asignar variaciones

El código de sombreado es el siguiente:

#ifdef GL_ES precision mediump float; #endif varying vec2 v_texCoord; varying vec2 v_blurTexCoords[14]; varying vec2 pixel_size; uniform vec2 v_resolution; uniform sampler2D u_texture; uniform mat4 u_projTrans; void main() { ... } 

En otros dispositivos funciona bien, ¿qué podría estar mal con los dispositivos Samsung?

Parece que simplemente estás superando el número de variaciones soportadas por tu implementación. El número máximo de vectores variables puede consultarse con:

 GLint maxVarying == 0; glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVarying); 

El límite mínimo requerido para una implementación compatible es 8. Esto significa que se admiten al menos 8 variaciones del tipo vec4 .

Tu caso es interesante porque usas un total de 16 variaciones de tipo vec2 . Usted puede pensar que esto encajará en el espacio de 8 valores vec4 , y por lo tanto debe funcionar en todos los dispositivos. Pero es más complicado que eso.

Los detalles peludos sobre este tema se pueden encontrar en el Apéndice A.7 a partir de la página 111 de la especificación GLES 1.00, titulada "Contar de Variaciones y Uniformes". Se trata de unas 2,5 páginas de descripción muy técnica que no podré repetir aquí. Pero esencialmente, describe un algoritmo de empaque posible que las implementaciones pueden usar mientras son compatibles. Ellos podrían usar algo que los paquetes de manera más eficaz, pero no tienen que hacerlo.

Una parte clave en este algoritmo de empaquetado que se aplica a su caso es la siguiente:

Los vectores siempre ocupan los registros en una sola fila. Los elementos de una matriz deben estar en filas diferentes. Por ejemplo, vec4 siempre ocupará una fila; float [8] ocupará una columna. Dado que no está permitido dividir una variable, matrices grandes por ejemplo. para variaciones, float [16] siempre fallará con este algoritmo.

Esto significa que para una implementación que admita sólo 8 vectores variables y que utiliza este algoritmo compatible, no puede ajustarse a su matriz de 14 valores vec2 . Podría caber 16 valores individuales de tipo vec2 . O, por ejemplo, una matriz de 8 valores vec2 y 8 valores simples de tipo vec2 , si entiendo la especificación correctamente. Pero no una matriz con un tamaño mayor de 8.

Para que su shader compile con seguridad, necesitará una implementación que devuelva al menos 14 para el límite GL_MAX_VARYING_VECTORS .

Esta pregunta realmente me ayudó.

Terminé dividiendo el arreglo y funcionó bien:

 varying vec2 v_blurTexCoords0; varying vec2 v_blurTexCoords1; varying vec2 v_blurTexCoords2; varying vec2 v_blurTexCoords3; varying vec2 v_blurTexCoords4; varying vec2 v_blurTexCoords5; varying vec2 v_blurTexCoords6; varying vec2 v_blurTexCoords7; varying vec2 v_blurTexCoords8; varying vec2 v_blurTexCoords9; varying vec2 v_blurTexCoords10; varying vec2 v_blurTexCoords11; varying vec2 v_blurTexCoords12; varying vec2 v_blurTexCoords13; 
  • Android: ¿Cómo crear VR-controles parecidos a YouTube?
  • Cómo hacer la detección de objetos en opengl Android?
  • ¿Por qué los colores de los píxeles no son correctos en OpenGL ES 2.0 en Android?
  • Android: LibGDX 2D consumo de memoria del juego
  • Manera recomendada de cargar (no interactivo) animaciones (hechas usando Maya) en OpenGL ES en iOS y Android
  • ¿Puedo usar gloss en Android?
  • Android: dibuja el video de YouTube en SurfaceTexture
  • ¿Puedo hacer una aplicación C ++ bastante nativa con Android?
  • OpenGL y 9 trazos desmontables
  • OpenGL ES profundidad buffer android, no puede llegar a trabajar
  • Android OpenGL ES Soporte en todas partes?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.