Tengo un problema difícil en ciertas tarjetas ATI (Radeon X1650, X1550 + y otras).Error al llamar a glGetTexImage (atioglxx.dll)
El mensaje es: "El acceso a la dirección violación 6959DD46 en el módulo 'atioglxx.dll' Read de dirección 00000000"
Sucede en esta línea:
glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_FLOAT,P);
Nota:
- Se instalaron los últimos controladores de gráficos.
- Funciona perfectamente en otras tarjetas.
Esto es lo que he probado hasta ahora (con las afirmaciones en el código):
- que el puntero P es válido y asignada suficiente memoria para contener la imagen
- texturización está habilitado: glIsEnabled (GL_TEXTURE_2D)
- prueba de que la textura en ese momento ligado es el que yo esperaba: glGetIntegerv (GL_TEXTURE_2D_BINDING)
- prueba de que la textura en ese momento ligado tiene las dimensiones que cabe esperar: glGetTexLevelParameteriv (GL_TEXTURE_WI DTH/altura)
- prueba de que no hay errores se han reportado: glGetError
Pasa a todos aquellos prueba y entonces todavía falla con el mensaje.
Siento que lo he intentado todo y no tengo más ideas. ¡Realmente espero que algún GL gurú aquí pueda ayudar!
EDIT:
Después llegó a la conclusión que es probablemente un error de controlador que he publicado sobre ello aquí también: http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=295137#Post295137
También probé GL_PACK_ALIGNMENT y no sirvió de nada.
Investigando un poco más encontré que solo ocurría en las texturas que he llenado previamente con píxeles usando una llamada a glCopyTexSubImage2D. Así que podría producir una solución alternativa reemplazando la llamada glCopyTexSubImage2d con llamadas a glReadPixels y luego glTexImage2D en su lugar.
Aquí está mi código actualizado:
{
glCopyTexSubImage2D cannot be used here because the combination of calling
glCopyTexSubImage2D and then later glGetTexImage on the same texture causes
a crash in atioglxx.dll on ATI Radeon X1650 and X1550.
Instead we copy to the main memory first and then update.
}
// glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, PixelWidth, PixelHeight); //**
GetMem(P, PixelWidth * PixelHeight * 4);
glReadPixels(0, 0, PixelWidth, PixelHeight, GL_RGBA, GL_UNSIGNED_BYTE, P);
SetMemory(P,GL_RGBA,GL_UNSIGNED_BYTE);
Suena como un error del controlador. Los controladores OpenGL de ATI tienen una mala reputación en términos de estabilidad. Las características no utilizadas por muchos programas pueden romperse. Recuperar una imagen de textura es una característica que rara vez se usa. Sice que ya descartó todas las causas posibles para el fracaso, le sugiero que informe esto como un error a AMD/ATI. – datenwolf
Ok, gracias, publicaré en el foro de controladores de opengl.org. Parece que un par de ingenieros de AMD están activos allí. –
+1 para probar todas las cosas correctas y enumerarlas en su pregunta. Estoy de acuerdo con que suena como un error del controlador. Asegúrese de actualizar esta pregunta si escucha algo de un desarrollador de ATI :) – luke