Las texturas de 0TOT son compatibles con en hardware PowerVR SGX, pero tienen restricciones. Las texturas de NPOT no pueden usar mipmaps, deben ser 2D (sin mapas de cubo o texturas 3D) y deben usar GL_CLAMP_TO_EDGE
para el ajuste de texturas en ambas dimensiones; esto es apoyado por defecto en OpenGL ES 2.0 y bajo ES 1,1 por la extensión GL_APPLE_texture_2D_limited_npot
Para ES 1.1, se puede comprobar en tiempo de ejecución para ver si esta extensión está presente con este código:
const char* extensions = (char*) glGetString(GL_EXTENSIONS);
bool npot = strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0;
Desde este solo está presente en el SGX y no en el MBX, tenga en cuenta que confiando en el soporte de textura de NPOT lo limitará a los dispositivos SGX más nuevos. Por supuesto, depender de ES 2.0 hará lo mismo, por lo que si ese es su objetivo, el soporte de NPOT es un punto discutible y puede continuar con las texturas de NPOT.
Aquí hay una solución alternativa que le permite seguir usando ES 1.1 y conservar el soporte completo del dispositivo. Coloca la textura 320x480 dentro de un 512x512, llena el espacio en blanco con otros mosaicos de fondo, glifos u otras texturas que se dibujarán al mismo tiempo (para evitar múltiples llamadas glBindTexture
) y luego utiliza una de mis extensiones ES 1.1 favoritas, GL_OES_draw_texture
, para copiar rápidamente la sección de 320x480 en la ventana gráfica:
int rect[4] = {0, 0, 480, 320};
glBindTexture(GL_TEXTURE_2D, texBackground);
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect);
glDrawTexiOES(0, 0, z, 480, 320);
Recuadro: la OpenGL ES 2.0 spec sí no especifica cualquier restricción de texturas NPOT; a menos que me equivoque, Apple está imponiendo las limitaciones; por supuesto, en el mundo de ES 1.1, el soporte de NPOT no existe en absoluto, por lo que es una adición allí.
Gracias Chris, muy buena información. Disculpe por ser un novato, pero ¿cuál es el parámetro z en glDrawTexiOES()? ¿profundidad? Parece que no puedo encontrar ninguna documentación. Gracias –
@Ben: Vaya, perdón por eso. Z es la profundidad del rectángulo - 0 es el plano cercano, 1 es el plano lejano, y los valores decimales le dan ese porcentaje de distancia entre ellos. En el ejemplo anterior, fue para una escena estrictamente 2D que gestionaba su propia profundidad con el "algoritmo del pintor", por lo que z = 0; para la mayoría de los usos de fondos, querrás z = 1 a menos que hayas invertido tu rango de profundidad. La página de especificaciones de OpenGL es un poco mejor: (http://www.khronos.org/registry/gles/extensions/OES/OES_draw_texture.txt - aproximadamente a la mitad de la página) ¿Claro como el barro? :) –