2011-01-21 15 views
12

¿Es posible renderizar en textura con OpenGL ES 1.1 en el iPhone (2G o más)? Si ato una textura como un buffer de renderizado, tiene que ser del tamaño del buffer de renderizado, que no tiene el tamaño de POT. Pero OpenGL ES 1.1 requiere texturas para ser POT.Representación a una textura sin poder de encendido en iPhone

Quizás no se pueda hacer en ES 1.1?

Respuesta

2

Se puede hacer, todo lo que necesita hacer es obtener la siguiente potencia de 2 más grande que la que no es POT.

luego generar un framebuffer:

GLuint aFramebuffer; 
glGenFramebuffersOES(1, &aFramebuffer); 

y una textura:

GLuint aTexturebuffer; 
glGenTextures(1, &aTexturebuffer); 

Luego haces la misma textura que las cosas:

glBindTexture(GL_TEXTURE_2D, aTexturebuffer); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glColor4ub(0, 0, 0, 255); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

int area[] = {0.0, 0.0, renderWidth, renderHeight}; 

glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, area); 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, aFramebuffer); 
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, aTexturebuffer, 0); 

Aquí he utilizado la extensión draw_texture. textureWidth y textureHeight son la potencia de 2 más grandes, y renderWidth y renderHeight son el ancho y la altura de la representación. Luego cuando se une a aFramebuffer dibujará en la textura.

+0

Lamentablemente, no funciona. glCheckFramebufferStatusOES devuelve GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS. – GhassanPL

+0

@Kronikarz: ¿Creaste también un renderbuffer? Como en 'glRenderbufferStorageOES (GL_RENDERBUFFER_OES, GL_RGBA8_OES, width, height);' para conectarse al framebuffer? –

+0

@Kronikarz: En mi experiencia, también debería ser capaz de procesar una textura sin POT sin redondear los tamaños, creo. –

26

Mientras OpenGL ES 1.1 no soporta no-poder-de-dos texturas, los nuevos modelos de dispositivos IOS tienen la extensión GL_APPLE_texture_2D_limited_npot, que establece:

convencional OpenGL ES 1.X texturizar se limita a imágenes con dimensiones de potencia de dos (POT). APPLE_texture_2D_limited_npot extensión relaja estas restricciones de tamaño para texturas 2D. Las restricciones permanecen en su lugar para el mapa del cubo y texturas 3D, si es compatible.

No hay API de procedimiento o enumerant adicional introducida por esta extensión excepto que una implementación que exporta la cadena extensión permitirá una aplicación pase en 2D textura dimensiones que pueden o no ser una potencia de dos.

En ausencia de OES_texture_npot, que levanta estas restricciones, ni modos mipmapping ni abrigo distintos de CLAMP_TO_EDGE son compatibles en conjunción con texturas NPOT 2D. Una textura 2D de NPOT con un modo de ajuste que no es CLAMP_TO_EDGE o un minilimpiador que no es MÁS CERCANO o LINEAR se considera incompleto. Si tal textura está vinculada a una unidad de textura , es como si la asignación de texturas estuviera deshabilitada para esa unidad de textura.

se puede utilizar el siguiente código para determinar si esta extensión se apoya en su dispositivo (extraído de excelente iPhone 3D Programming libro de Philip Rideout):

const char* extensions = (char*) glGetString(GL_EXTENSIONS); 
bool npot = strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0; 

En estos dispositivos, a continuación, debería ser capaz de utilizar no-poder-de-dos texturas, siempre y cuando se establece la textura adecuada envoltura:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

Desafortunadamente, this example application que tengo que hace a un no-poder-de-dos de textura utiliza OpenGL ES 2.0, así que no estoy seguro de que lo ayude en este caso.

+9

Debería * no * usar * strstr * para verificar el nombre de la extensión en la cadena de extensión. Esto no garantiza que otra extensión que comience con el mismo prefijo no se malinterprete. Dígale que busque * GL_ARB_shadow * con strstr que lo morderá si tiene * GL_ARB_shadow_ambient *. Me mordieron hace mucho tiempo cuando una actualización de software trajo una nueva extensión GL en el controlador y rompió mi código meses después de su lanzamiento. – rotoglup

+0

@rotoglup: ese es un gran punto. Como dije, este fue un código extraído del libro de Philip Rideout. Quizás puedas escribirle algo para la errata en el libro. –

+0

hecho, envió un correo electrónico a Philip para mencionar esto;) – rotoglup

Cuestiones relacionadas