| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
GrayFox
Registrado: 28 Ene 2007 Mensajes: 47
| Publicado: 21/08/2007 1:19 pm | | | Título: Problema con texturas en OpenGL |
| Bueno el problema es el siguiente: Resulta que programe un arkanoid y no me gusto el aspecto grafico que tenia (Muy duro con esos colores solidos para los bloques) asi que me baje un editor de texturas y me puse a estudiar como ponerle texturas a mi juego. Cuando termine la barra tenia un azul en degradado, la pelota un rojo igual, y los bloques eran de piedra que al primer golpe se rajaba y al segundo desaparecian (El fondo me quedo horrible con una textura que nadie me sabe decir que es y que le mande para rellenar el espacio en blanco) Bueno como es el primer juego que me sale con una calidad grafica y una dificultad aceptable quise alardear un poco y se lo pase a todos mis compañeros de la escuela, ¡Pero cuando ellos lo ejecutan solo ven una pantalla en blanco! Si se preciona la tecla para comenzar el juego al rato aparece el cartel que dice que perdiste, asi que lo que se ve es una pelota blanca sobre un fondo blanco rebotando contra bloques blancos. Aclaro que adjunte la carpeta en la que estan las texturas correctamente y todo, probe mover el ejecutable y la carpeta texturas de lugar y en mi maquina sigue funcionando, pero no en ninguna maquina ajena. Dejo el codigo haber si alguien encuentra el error.
| Código: | class Textura { //Propiedades unsigned int m_uiID; unsigned int m_uiAncho; unsigned int m_uiAlto; public: //Propiedades estatica static unsigned int m_uiActiva; static float m_fRepeatX; static float m_fRepeatY; //Metodos estaticos static void Desactivar(); //Metodos complejos bool Crear(char * szNombreArchivo); void Usar(); void Eliminar(); bool EnUso(); //Constructor Textura(); //Destructor ~Textura(); };
|
| Código: | float Textura::m_fRepeatX=1.0f; float Textura::m_fRepeatY=1.0f; unsigned int Textura::m_uiActiva=0; Textura::Textura() { m_uiID=0; m_uiAncho=0; m_uiAlto=0; } Textura::~Textura() { Eliminar(); } bool Textura::EnUso() { return (m_uiID==m_uiActiva); } void Textura::Usar() { glBindTexture(GL_TEXTURE_2D,m_uiID); m_uiActiva=m_uiID; } void Textura::Eliminar() { glDeleteTextures(1,&m_uiID); glBindTexture(GL_TEXTURE_2D,NULL); m_uiActiva=0; m_uiID=0; } void Textura::Desactivar() { glBindTexture(GL_TEXTURE_2D,NULL); } bool Textura::Crear(char *szNombreArchivo) { Eliminar(); std::fstream fsArchivo; AUX_RGBImageRec* Imagen; if(szNombreArchivo) { fsArchivo.open(szNombreArchivo); if(fsArchivo.is_open()) { fsArchivo.close(); Imagen=auxDIBImageLoad(szNombreArchivo); if(Imagen) { m_uiAncho=Imagen->sizeX; m_uiAlto=Imagen->sizeY; glGenTextures(1,&m_uiID); glBindTexture(GL_TEXTURE_2D,m_uiID); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); glTexImage2D(GL_TEXTURE_2D, 0, 3, m_uiAncho, m_uiAlto, 0, GL_RGB, GL_UNSIGNED_BYTE, Imagen->data); glBindTexture(GL_TEXTURE_2D,NULL); delete Imagen->data; delete Imagen; return true; } } } return false; }
|
| Código: | //Inicializar void Game::Inicializar() { //Texturas m_Datos.m_texBloque[0].Crear("./Texturas/Ladrillo.bmp"); m_Datos.m_texBloque[1].Crear("./Texturas/Ladrillo2.bmp"); m_Datos.m_texPanel.Crear("./Texturas/Bambú.bmp"); m_Datos.m_texMarco.Crear("./Texturas/Tierra.bmp"); m_Datos.m_texBarra.Crear("./Texturas/Barra.bmp"); m_Datos.m_texPelota.Crear("./Texturas/Pelota.bmp"); glEnable(GL_TEXTURE_2D); //Este algoritmo de ordenamiento matematico se debe remplazar por lectura desde un archivo Coordenada cPosicion=GetCoor(-4*ANCHO_BLOQUE,0.8f); m_Datos.m_cirPelota.m_cCentro=GetCoor(GF_CENTRO,POS_Y_PELOTA); m_Datos.m_recBarra.m_cCentro=GetCoor(GF_CENTRO,POS_Y_BARRA); m_Datos.m_vPelota.m_Ang.SetAng(85); m_Datos.m_Bloque= new Bloque[CANTIDAD_BLOQUES]; for(int i=0;i<CANTIDAD_BLOQUES;i++) { m_Datos.m_Bloque[i].m_Pos=cPosicion; cPosicion.m_fX+=ANCHO_BLOQUE; if(cPosicion.m_fX>4*ANCHO_BLOQUE) { cPosicion.m_fX=-4*ANCHO_BLOQUE; cPosicion.m_fY-=ALTO_BLOQUE; } } m_Datos.m_bPausa=true; m_bInGame=true; }
|
Puse nada mas el codigo donde creo que esta el problema (Para mi el metodo inicializar de la clase Game) y el codigo de la clase textura.
Desde ya muchas gracias Salu2 GrayFox |
| | Volver arriba | |  | Killrazor
Registrado: 24 Ene 2006 Mensajes: 1182 Ubicación: Barcelona
| Publicado: 22/08/2007 3:30 am | | | Título: |
| Yo no buscaria el error en el codigo. Me parece muy sospechoso que el mismo codigo se comporte diferente en otras maquinas. Me parece un problema de configuracion. IDE, SO, como lo ejecutas, mediante el IDE o haciendo doble click en el programa ejecutable? Ahi es donde vas a encontrar el problema _________________ I wanna heal i wanna feel like I'm close to something real. I wanna find something I've wanted all along somewhere i belong |
| | Volver arriba | |  | GrayFox
Registrado: 28 Ene 2007 Mensajes: 47
| Publicado: 22/08/2007 9:08 am | | | Título: |
| Ahora que lo mencionas, si ejecuto el codigo desde el IDE tengo el mismo problema incluso en mi maquina, pero si hago click en el ejecutable no. Ahora voy a probar con lo siguiente
| Código: | m_Datos.m_texBloque[0].Crear("C:/Texturas/Ladrillo.bmp"); m_Datos.m_texBloque[1].Crear("C:/Texturas/Ladrillo2.bmp");
|
Y voy a colocar el programa y la carpeta texturas en el disco C. Lo que ocurre es que en mi casa solo tengo una PC y entonces es un poco dificil de probar. Yo pensaba que talvez estaba mal la forma en que usaba el '.' al principio de la ruta. segun tengo entendido el punto representa el directorio donde se encuentra el ejecutable verdad?
Windows XP Visual C++ 2005 El programa lo probe en maquinas con windows XP y en una con windows 98. |
| | Volver arriba | |  | | Killrazor
Registrado: 24 Ene 2006 Mensajes: 1182 Ubicación: Barcelona
| Publicado: 23/08/2007 2:45 am | | | Título: |
| Mira, si creas un acceso directo a un programa y lo pones en el escritorio y despues haces click derecho en propiedades, veras que tiene varios campos. El primero es destino (es decir, que programa ejecuta) y el segundo es iniciar en: pues este es importante por que dependiendo de donde inicias, las rutas relativas de todos los archivos dependeran de esta ruta.
Cuando ejecutas desde el IDE VC++ (es el ejemplo que conozco pero supongo que los otros mas o menos se parecen), en general, el ejecutable ha ido a una carpeta llamada Debug o Release (dependiendo de los settings). Pero sus rutas relativas son a partir de la carpeta donde esta el proyecto (creo que se puede cambiar en propiedades del proyecto), y que no son ni debug ni release. En cambio si abres la carpeta y lo ejecutas a mano, se inicia en la misma carpeta donde esta el ejecutable.
Si pones mas o menos el esquema de carpetas tal como se lo pasas a tus amigos seguro que lo resolvemos. Lo que no te aconsejo es usar rutas absolutas puesto que si se lo pasas a tus amigos no funcionara a menos que este en la misma ruta. Te aconsejo que pongas el ejecutable y las posibles librerias en la carpeta raiz (por ejemplo si la carpeta donde esta todo tu juego se llama arkanoid tendrias - [Arkanoid] ---- Arkanoid.exe ---- sdl_main.dll ---- [textures] ---- ----- image1.png ---- ----- image2.png
Lo que va entre corchetes son carpetas. Ahora la ruta deberia ser ./textures/ siempre. Si en debug no te funciona le deberias cambiar el working directory en las propiedades del proyecto.[/list] _________________ I wanna heal i wanna feel like I'm close to something real. I wanna find something I've wanted all along somewhere i belong |
| | Volver arriba | |  | GrayFox
Registrado: 28 Ene 2007 Mensajes: 47
| Publicado: 23/08/2007 11:23 am | | | Título: |
| Bueno lo que yo he hecho es mas o menos lo que tu dijiste exepto con una diferencia: - [Arkanoid] ---- Arkanoid.exe ---- [textures] ---- ----- image1.png ---- ----- image2.png
Que vendria a ser sdl_main? Osea podrias definir las "posibles librerias" que mensionaste en el post anterior? Significa por ejemplo que si trabajo en OpenGL tengo que incluir "Opengl32.dll"? Gracias por tu tiempo y por favor disculpa mi ignorancia.
Salu2 GrayFox |
| | Volver arriba | |  | Killrazor
Registrado: 24 Ene 2006 Mensajes: 1182 Ubicación: Barcelona
| Publicado: 24/08/2007 12:11 am | | | Título: |
| | GrayFox escribió: | Bueno lo que yo he hecho es mas o menos lo que tu dijiste exepto con una diferencia: - [Arkanoid] ---- Arkanoid.exe ---- [textures] ---- ----- image1.png ---- ----- image2.png
Que vendria a ser sdl_main? Osea podrias definir las "posibles librerias" que mensionaste en el post anterior? Significa por ejemplo que si trabajo en OpenGL tengo que incluir "Opengl32.dll"? Gracias por tu tiempo y por favor disculpa mi ignorancia.
Salu2 GrayFox |
El archivo .dll que te menciono es uno de los que debes incluir si usas SDL. Hay mas maneras de usar SDL, una de ellas es compilarlo todo dentro de tu ejecutable pero eso puede darte problemas legales con las licencias. Yo nunca lo hago. La otra manera es como explican en ciertos tutoriales, que es copiar las dll en /windows/system32. A mi eso me parece un error por que si despues quieres distribuir la aplicacion es posible que tus compañeros no tengan estas dlls (en el caso de sdl es muy posible que no las tengan).
La tercera opcion es la que digo, incluirlas en la misma carpeta donde el ejecutable. Cuando hablamos de opengl32 es diferente. La gran mayoria de drivers de targetas de video distribuyen esta dll, asi que a poco que un ordenador tenga una targeta grafica con menos de 15 años deberia estar correctamente instalado. De ahi que esta dll nunca se incluya.
Como regla general, piensa que muchas librerias tienen dos partes. Uno o varios .lib que sirven para compilar tu programa y uno o varios .dll para ejecutarlos. Cuando te bajas librerias tienes que ir a la carpeta lib para copiar los .lib en la ruta de compilacion y tienes que poner los dll en la ruta de ejecucion. _________________ I wanna heal i wanna feel like I'm close to something real. I wanna find something I've wanted all along somewhere i belong |
| | Volver arriba | |  | | GrayFox
Registrado: 28 Ene 2007 Mensajes: 47
| Publicado: 25/08/2007 2:46 pm | | | Título: |
| Listo me quedo claro. En otras palabras si utilizo OpenGL no nesisito incluir las dll (A menos que la PC de mi amigo funcione a pedales). De todos modos hice la prueba y nada, el mismo error. Tambien hice la pruba de pasar una version del programa que utilizaba rutas absolutas y le indique a la persona que debia colocarlo directamente en el C... El mismo error aunque voy a considerar que talvez lo guardo en otro lugar (tuve que pasarle una captura de pantalla para explicarle como descomprimir el archivo) Supongo que es un error muy bobo el que tengo pero al no tener otra PC se me esta haciendo extremadamente dificil hacer las pruebas. Ademas tengo dos hipotesis: 1) Que el error sea que el programa no encuentra las texturas. 2) Que falte alguna libreria en las maquinas a las que los paso. Supongo que lo que tengo que hacer primero son experimentos para descartar alguna de las dos, como que comenté al principio, que parece indicar que el problema es el segundo, pero no quiero descartar del todo la primera. Algunas preguntas mas: 1) Ya me dijiste que opengl32.dll no es nesesario incluirla, ¿si utilizo glu o glaux en mi programa, hay que incluir algo o ocurre lo mismo que con opengl32.dll? 2) Parte del codigo del programa esta en una libreria GFGL.lib (GrayFoxGL) que programé mitad como ejercicio para entender opengl mitad para simplificar un poco algunas tareas. ¿Cuando compilo el programa incluyendola en las opciones del linker queda automaticamente unida al ejecutable no?
Muchas gracias por tu ayuda Killrazor. Salu2 GrayFox |
| | Volver arriba | |  | GrayFox
Registrado: 28 Ene 2007 Mensajes: 47
| Publicado: 25/08/2007 3:57 pm | | | Título: |
| Acabo de hacer un experimento: modifique el codigo y agregue mensajes
| Código: | bool Textura::Crear(char *szNombreArchivo) { Eliminar(); std::fstream fsArchivo; AUX_RGBImageRec* Imagen; if(szNombreArchivo) { fsArchivo.open(szNombreArchivo); if(fsArchivo.is_open()) { fsArchivo.close(); Imagen=auxDIBImageLoad(szNombreArchivo); if(Imagen) { m_uiAncho=Imagen->sizeX; m_uiAlto=Imagen->sizeY; glGenTextures(1,&m_uiID); glBindTexture(GL_TEXTURE_2D,m_uiID); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); glTexImage2D(GL_TEXTURE_2D, 0, 3, m_uiAncho, m_uiAlto, 0, GL_RGB, GL_UNSIGNED_BYTE, Imagen->data); glBindTexture(GL_TEXTURE_2D,NULL); delete Imagen->data; delete Imagen; MessageBox(NULL,"Textura creada con exito, el error no esta en esta parte del codigo","PERFECTO",NULL); return true; } else { MessageBox(NULL,"No se pudo cargar la imagen","ERROR",NULL); } } else { MessageBox(NULL,"No se pudo abrir el archivo","ERROR",NULL); } } else { MessageBox(NULL,"Nombre de archivo nulo","ERROR",NULL); } MessageBox(NULL,"Fallo al crear la textura","ERROR",NULL); return false; }
|
El resultado:
·En mi PC salio el mensaje de que estaba todo bien una vez por cada textura, seguido de el juego funcionando bien ·En mi PC pero eliminando o moviendo la carpeta texturas salio el mensaje de que no se encontro el archivo y de que habia fallado la creacion de las texturas. ·¡¡En la PC de mi amigo salio que esta todo bien, seguido de la pantalla en blanco!!
... ... ... Para dejar el dato nomas... Me voy a llorar un rato. |
| | Volver arriba | |  | daltomi
Registrado: 28 Abr 2007 Mensajes: 120 Ubicación: Argentina
| Publicado: 25/08/2007 8:42 pm | | | Título: |
| Hola. Cito del libro que tengo:
| Cita: | Internamente, OpenGL mantiene un conjunto de seis banderas de estado de error... ....si un error es causado por una llamada inválida a una función o comando de OpenGL, esa función o comando se ignora. Puede que OpenGL no se comporte como pretendíamos, pero continuará funcionando. la única excepción a esto es GL_OUT_OF_MEMORY( o GLU_OUT_OF_MEMORY). Cuando ocurre este error, el estado de OpenGL es indefinido; o mejor, ¡el estado de nuestro programa es indefinido! |
Un ejemplo de como obtener la lista de errores que mantiene OpenGL:
| Código: | int i = 0; do{ glError = glGetError(); SetDlgItemtext(hDlg,IDC_ERROR1+i, gluErrorString(glError)); i++; }while( i < && glError != GL_NO_ERROR);
|
Sobre las librerias que utilizas son dos archivos .dll: opengl32.dll y glu32.dll, para la libreria AUX no existe un archivo de este tipo.
Este seria el listado se librerias(.lib) y encabezados.
| Código: | #include <gl\gl.h> #include <gl\glu.h> #include <gl\glaux.h> #pragma comment(lib,"opengl32.lib") #pragma comment(lib,"glu32.lib") #pragma comment(lib,"glaux.lib")
|
Nota:
| Cita: | | A pesar que la libreria AUX no forma parte de la especificación OpenGL, parece que sigue apareciendo en todas las plataformas a las que se porta OpenGL. |
Mucho libro pero poca páctica de parte mía. Nunca hice un juego o algo parecido. Espero haberte ayudado en algo. Saludos. |
| | Volver arriba | |  | | GrayFox
Registrado: 28 Ene 2007 Mensajes: 47
| Publicado: 26/08/2007 2:48 pm | | | Título: |
| Gracis por la info, voy ver si me sirve. Igual ahora no voy a poder trabajar mucho, es epoca de trimestrales y me estoy pasando todos los dias estudiando jajaja. Por cierto, ¿podrias poner el nombre nombre del libro que estas usando? Los tutoriales de internet son muy buenos pero no hay nada como un buen libro. Gracias.
Salu2 GrayFox |
| | Volver arriba | |  | daltomi
Registrado: 28 Abr 2007 Mensajes: 120 Ubicación: Argentina
| Publicado: 26/08/2007 4:37 pm | | | Título: |
| | Cita: | Programación en OpenGL Una guía de referencia completa de OpenGL
Richard S. Wright JR. Michael Sweet
Editorial: Anaya Multimedia
|
Trae un cd-rom con ejemplos.
Saludos. |
| | Volver arriba | |  | Killrazor
Registrado: 24 Ene 2006 Mensajes: 1182 Ubicación: Barcelona
| Publicado: 29/08/2007 12:13 am | | | Título: |
| Vale, lo has conseguido. Has despertado mi curiosidad. Mandame un privado que te envie mi e-mail y me mandas es proyecto. A ver si veo que es lo que pasa. Pero te adelanto que seguro que el problema no esta en el codigo. Yo creo que ademas de las imagenes en esta carpeta, a lo mejor las tienes en algun directorio por defecto que tambien te las encuentre. Pero eso, pasame el proyecto que me lo mire, por que no entiendo este tipo de errores. _________________ I wanna heal i wanna feel like I'm close to something real. I wanna find something I've wanted all along somewhere i belong |
| | Volver arriba | |  | | Killrazor
Registrado: 24 Ene 2006 Mensajes: 1182 Ubicación: Barcelona
| Publicado: 29/08/2007 12:22 am | | | Título: |
| | GrayFox escribió: | L 1) Ya me dijiste que opengl32.dll no es nesesario incluirla, ¿si utilizo glu o glaux en mi programa, hay que incluir algo o ocurre lo mismo que con opengl32.dll? 2) Parte del codigo del programa esta en una libreria GFGL.lib (GrayFoxGL) que programé mitad como ejercicio para entender opengl mitad para simplificar un poco algunas tareas. ¿Cuando compilo el programa incluyendola en las opciones del linker queda automaticamente unida al ejecutable no?
|
Lo importante es que entiendas qué pasa cuando falta una libreria. Si es un .lib simplemente no podras compilarlo. Si es una dll, seguro que que te dara un mensaje del sistema que te pedira que reinstales la aplicacion por que no encuentra la DLL. Eso es seguro!!! Asi que el problema puede ser que: 1.- Que no manejes bien los errores de carga de imagenes 2.- Que trabajes con Dlls con versiones diferentes (es decir, que no funciones igual, pero las funciones que has usado no son tan nuevas como para sufrir ese tipo de cambios).
No se....
[EDITO]
Se me acaba de encender la bombilla. Comprueba el tamaño de las imagenes. Deberian ser potencias de dos, es decir, las medidas de las imagenes tienen que ser 2x2, 4x4, 8x8, ...., 256x256,512x512,... Mira que sean este tipo de texturas. Por que? Por que hay algunas targetas graficas mas potentes que manejan por hardware las texturas no-potencia de 2, pero todavia son pocas. En cambio, si tus amigos tienen targetas mas antiguas o mas baratas (que no sean 6600GT, 8600GT o incluso algo mas potentes), entonces cargan este tipo de texturas asimetricas pero no las muestran. De ahi que te sirvan una textura en blanco.
Eso explicaria que no diesen error, porque precisamente las cargan bien, y se suben bien a la memoria de la targeta, pero en cambio no se muestra. Ademas no hay ningun error asociado a esto asi que tampoco te va a avisar OpenGL sobre esta circunstancia. _________________ I wanna heal i wanna feel like I'm close to something real. I wanna find something I've wanted all along somewhere i belong |
| | Volver arriba | |  | GrayFox
Registrado: 28 Ene 2007 Mensajes: 47
| Publicado: 31/08/2007 5:50 pm | | | Título: |
| Me siento un demonio al tener que decir esto,pero las texturas que uso son potencia de 2. Ahora estoy en otra casa, despues me voy a fijar si tipie mal el numero en el paint. Ya que mensionas eso de la targeta grafica,voy a mandarle el archivo a alguien que conozco que tiene una PC que parece un plato volador.
Ya estoy a punto de borrar todo el programa y escribirlo de nuevo (a veces me funciona) Tambien hice otro programa para probarla clase textura en forma mas aislada pero no lo use todavia (en mi PC funciona)
Gracias por la idea de las potencias. Salu2 GrayFox |
| | Volver arriba | |  | Killrazor
Registrado: 24 Ene 2006 Mensajes: 1182 Ubicación: Barcelona
| Publicado: 01/09/2007 1:01 am | | | Título: |
| Compruebalo y si no te va, mandame el proyecto y lo miro en mi maquina, a ver si veo algo que te pueda haber escapado _________________ I wanna heal i wanna feel like I'm close to something real. I wanna find something I've wanted all along somewhere i belong |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |