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:
- ¿Por qué eglMakeCurrent () falla con EGL_BAD_MATCH?
- Decodificación y reproducción de vídeo en Android
- Android OpenGL texturas se ven terrible en Sprint Samsung Galaxy s2 Epic Touch 4g
- Matriz int a la textura opengl en android
- Cómo grabar la pantalla de actividad de la webview con Android MediaCodec?
#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?
- GLES 3.0 incluyendo gl2ext.h
- ¿Cómo implemento el tipo de curl de página utilizado en Google Play Books?
- Límites de android.graphics.path
- Recursos para aprender desarrollando juegos con ndk + opengl en C ++?
- Cargador de archivos Android OpenGL .OBJ
- ¿Cómo acceder al contexto de renderizado de OpenGL en Android con Delphi XE5?
- GLES10.glGetIntegerv devuelve 0 sólo en Lollipop
- Cómo agregar una imagen panorámica en la aplicación google cartón?
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;