2010-11-15 16 views
8

Tengo un sombreador de vértices en el que realizo una búsqueda de texturas para determinar gl_Position. Estoy usando esto como parte de un sistema de simulación de partículas GPU, donde las posiciones de las partículas se almacenan en una textura.La búsqueda de texturas en el sombreado de vértices se comporta de manera diferente en un simulador de dispositivo iPad vs iPad - OpenGL ES 2.0

Parece que: vec4 textureValue = texture2D(dataTexture, vec2(1.0, 1.0)); se comporta de manera diferente en el simulador que el dispositivo iPad. En el simulador, la búsqueda de textura tiene éxito (el valor en esa ubicación es 0.5, 0.5) y mi partícula aparece allí. Sin embargo, en el iPad en sí, la búsqueda de texturas retorna constantemente 0.0, 0.0.

He intentado ambas texturas del formato GL_FLOAT y GL_UNSIGNED_BYTE.

¿Alguien más ha experimentado esto? La especificación ES de GLSL dice que las búsquedas de texturas se pueden realizar en los sombreadores de vértices y fragmentos, por lo que no veo cuál es el problema.

estoy usando la última GM Beta del SDK de iOS 4.2

Respuesta

10

Acabo de probar esto también. Usando iOS 4.3, puede puede hacer una búsqueda de textura en el sombreador de vértices tanto en el dispositivo como en el simulador. Sin embargo, hay un poco de extrañeza (que tal vez sea la razón por la cual no es "oficial" como se menciona szu). En el dispositivo real (probé en el iPad 2), debe buscar en el sombreador de fragmentos y en el sombreador de vértices. Es decir, si no está realmente usándolo en el sombreador de fragmentos, igual tendrá que hacer referencia a él de alguna manera.Aquí está un ejemplo trivial, donde estoy pasando en una textura y usando el píxel de color rojo para reposicionar el valor y del vértice por un poco:

/////fragment shader 
uniform sampler2D tex; //necessary even though not actually used 

void main() { 
    vec4 notUsed = texture2D(tex, vec2(0.0,0.0)); //necessary even though not actually used 
    gl_FragColor = vec4(1.0,1.0,1.0,1.0); 
} 

/////vertex shader 
attribute vec4 position; 
attribute vec2 texCoord; 
uniform sampler2D tex; 

void main() { 
    float offset = texture2D(tex, texCoord).x; 
    offset = (offset - 0.5) * 2.0; //map 0->1 to -1 to +1 
    float posx = position.x; 
    float posy = position.y + offset/8.0; 

    gl_Position = vec4(posx, posy, 0.0, 1.0); 
} 

tengo un poco más completo relato de esto en http://www.mat.ucsb.edu/a.forbes/blog/?p=453

+1

Lo que has descubierto debe ser un error o "accidente feliz". En mi iPad (admitidamente 4.2.1), GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS devuelve 0, lo que significa que no se pueden realizar búsquedas de textura en el sombreado de vértices. Tengo curiosidad por saber qué valor obtienes en tu iPad2 por GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS. –

+2

Hola, mi iPad 2 utilizando 4.3.4 también devuelve 0 para GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS (y 8 para GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS y GL_MAX_TEXTURE_IMAGE_UNITS). Supongo que la tarjeta gráfica del iPad 2 lo admite, pero por alguna razón el controlador lo desactiva para que haya un comportamiento uniforme en los distintos dispositivos iOS. No he probado esto en el iPhone o iPad 1 todavía. El simulador iOS iPad 4.3 también informa 0 para GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, pero le permite acceder a las texturas del sombreador de vértices normalmente (sin agregar la búsqueda de textura falsa en el sombreador de fragmentos). –

+0

Huh, interesante ... por mucho que me gustaría utilizar la función, soy demasiado paranoico sobre una futura pieza de hardware rompiendo mi aplicación si mi aplicación ignora ese valor reportado. :( –

1

Ésta no es la única cosa que se comporta de manera diferente en la tarjeta SIM contra el dispositivo. Te haré la misma sugerencia que hago a los demás: Ignora el simulador cuando necesites probar que las cosas se vean como deberían en el dispositivo. Solo pruebe cosas como la lógica, la funcionalidad, no mire en el simulador, y solo si puede.

+0

Correcto, y esto es lo que he estado haciendo; pero no puedo encontrar una manera de lograr el comportamiento correcto en el dispositivo. Es una búsqueda de textura simple, así que no estoy seguro de cómo solucionarlo. – kcbanner

1

Tengo la sensación de que GLES en el iPad (o iPhone) no admite la búsqueda de textura en un sombreado de vértices, pero no me cites.

Si no admite la búsqueda de texel en los sombreadores de vértices, ¿quizás tiene recortadas o envueltas las coordenadas de la textura? Porque 1.0x1.0 está fuera de la textura IIRC.

1.0x1.0 en el modo de envoltura debe ser 0.0x0.0. 1.0x1.0 en recorte debe ser el último texel.

+0

Correcto, y en este caso mi textura es completamente del mismo 'color'. La información es 0.8 en todas partes. Aún obteniendo 0,0 como valor de retorno. – kcbanner

+0

Lo primero que haría es probar un shader de fragmentación simple con la misma textura e intentar cambiar lo menos posible en tu código. Si se muestra a la derecha o bien algo está mal en el sombreador de vértices o la búsqueda de texel no es posible. – v01d

+0

Sí, tengo la textura que se muestra en un quad usando un sombreador por separado, y eso funciona bien. Supongo que la respuesta es que las búsquedas de texturas no se pueden hacer en el sombreador de vértices en el hardware del iPad. – kcbanner

1

Lo intenté yo mismo y Texture2D hace funciona en iPad (dispositivo y simulador) en iOS 4.2 cuando se utiliza en el sombreador de vértices.

Mi mejor estimación es que tiene habilitada la función de mapeo de mip, y ese es el problema. Noté que las búsquedas mapeadas en mip en el sombreador de vértices usando Texture2D funcionan en el simulador pero no en el dispositivo. No puede usar los mapas de mip con Texture2D en el sombreador de vértices porque no hay forma de que seleccione el nivel de mapa de mip que utilizará. Necesita desactivar el mip-mapping para esa textura, o use Texture2DLod en su lugar, que admite mapas mip.

6

de la "Guía de programación OpenGL ES para iOS" oficial, la sección "Notas sobre la plataforma"

"no puede utilizar las búsquedas de textura en un vertex shader".

Cuestiones relacionadas