2010-06-19 12 views
8

Estoy intentando algo así comocómo utilizar glCopyImage2D

glEnable(texture_2d) 
glBindTexture 
glCopyTexImage2D 
glDisable(GL_TEXTURE_2D); 

Creo glCopyTexImage2D no funcionará con un no-poder de dos imagen, así que eso es un problema; También probé glReadPixels, pero es demasiado lento para mis propósitos.

+0

¿Sabes si el problema está en crear la textura o en renderizarla más tarde? ¿'GlCopyTexImage2D' seguido de' glGetTexImage' produce el mismo resultado que 'glReadPixels'? (no se recomienda como una solución a largo plazo por motivos de rendimiento, sino como un paso de solución de problemas para ver qué ocurre con la textura) –

+0

Para la restricción de la potencia de 2, puede usar 'glTexImage2D' para asignar la textura con una potencia -de-2 tamaño y pasa 'NULL' para los datos, luego' glCopyTexSubImage2D' que permite dimensiones sin potencia de 2. –

Respuesta

9

Si glReadPixels es demasiado lento para usted, entonces glCopyTexImage2D y glCopyTexSubImage2D no serán mucho más rápidos. En las plataformas con soporte para objetos framebuffer, como iOS, la forma recomendada (es decir, más rápida) de obtener datos de imágenes procesados ​​por GPU en una textura es usar esa textura como el archivo adjunto en color para un objeto framebuffer y representarlo directamente en él. Dicho esto, si aún desea seguir este método, aquí tiene lo que debe hacer para solucionarlo:

Primero, está pasando argumentos incorrectos al glCopyTexImage2D. El tercer argumento, internalformat, probablemente debería ser GL_RGBA en lugar de 0. Si hubiera llamado al glGetError después de llamar al glCopyTexImage2D, probablemente hubiera obtenido GL_INVALID_OPERATION. Consulte las páginas de manual de OpenGL ES 1.1 para glCopyTexImage2D y glCopyTexSubImage2D.

En segundo lugar, como ya ha observado, glCopyTexImage2D requiere que sus argumentos de ancho y alto sean también potencia de dos. La forma correcta de solucionar esto es asignar una imagen de textura usando glTexImage2D (puede pasar NULL para pixels aquí), luego use glCopyTexSubImage2D para copiar el contenido de su framebuffer en un rectángulo. Tenga en cuenta que glCopyTexSubImage2D no toma un argumento internalformat, ya que está actualizando un subrectangle de una textura, utiliza el formato existente de la textura.

Para el registro, glGetTexImage no existe en OpenGL ES 1.1 o 2.0, por lo que está obteniendo una declaración implícita.

+0

Parece que debería mirar dentro de los objetos framebuffer ... Gracias – Adam

1

Puede comprobar si la tarjeta de video es compatible con la no potencia de 2 texturas si es compatible con la extensión ARB_texture_non_power_of_two. See here for info.

0

Para ayudar a determinar si el "no-poder de dos" que es un problema, utilice glGetError() así:

printf("error: %#06x\n", glGetError()); 

poner esto en diferentes lugares en su código para asegurarse de qué línea es la causa del problema, a continuación, compruebe el código de error aquí: https://www.khronos.org/opengl/wiki/OpenGL_Error

Para copiar una textura que hice:

glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0); 
glGenerateMipmap(GL_TEXTURE_2D); 

después de la unión de la textura. Verifique los documentos en esas dos funciones para más información.