Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Mensajes - fgutierrez

#1
Cuando decía que no me funcionaba me refería a que no consigo solucionar el problema del parpadeo. Berserker,he probado lo que me decias y no he conseguido solucionar nada, aunque no se si estoy sobrecargando bien, lo único que he hecho es añadir estas lineas de código:

BOOL CView::OnEraseBkgnd(CDC *pDC)
{
return false;
}


Y la verdad es que no soluciono nada. Lo curioso del caso es que en el equipo en el que estaba trabajando hasta ahora si que me funcionaba esta solución y evitaba el parpadeo, pero al portar el programa al nuevo equipo la cosa dejaba de ir bien. Por cierto, muchas gracias BerSerker por tu ayuda, seguiremos investigando
#2
Hola, buenas noches a todos. Estoy inmerso en un proyecto de modelado de vegetación con OpenGL. Estoy construyendo mi proyecto en una MFC, utilizando Visual C++. Los pasos que sigo para renderizar mi escena en una ventana MFC son los siguientes:

 1. Codifico una función para definir el formato de pixel de ventana. Para ello declaro una estructura PIXELFORMATDESCRIPTOR pixelDesc en la cual activo los siguientes flags:


pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_DRAW_TO_BITMAP |
PFD_GENERIC_ACCELERATED|
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER |
PFD_STEREO_DONTCARE;
   /* Formato de color RGBA */
   pixelDesc.iPixelType = PFD_TYPE_RGBA;

Como puede verse esta activada la opción del double buffer. En las siguientes lineas de código simplemente activo el formato de pixel descrito

/* Buscamos el formato de pixel de sistema más cercano
      al que hemos descrito en pixelDesc */

   m_GLPixelIndex = ChoosePixelFormat( hDC, &pixelDesc);
   
   if (m_GLPixelIndex==0){ // Let's choose a default index.

m_GLPixelIndex = 1;
if (DescribePixelFormat(hDC, m_GLPixelIndex,
       sizeof(PIXELFORMATDESCRIPTOR), &pixelDesc)==0){
   return FALSE;
   }
}
   /* Configuramos el formato de pixel que hayamos encontrado */

   if (SetPixelFormat( hDC, m_GLPixelIndex, &pixelDesc)==FALSE){
return FALSE;
}
   return TRUE;

 2. Codifico una función para generar un GL context.

BOOL CL_System_v1View::CreateViewGLContext(HDC hDC){
   
   /* Creamos un nuevo OpenGL Rendering Context */

   m_hGLContext = wglCreateContext(hDC);

   if (m_hGLContext == NULL){
return FALSE;
}
   /* Activamos ese OGL Rendering Context en el Contexto de Dispositivo hDC */

   if (wglMakeCurrent(hDC, m_hGLContext)==FALSE){
return FALSE;
}
   return TRUE;
   
   }

3.Ambas funciones son llamadas desde el manejador OnCreate de la clase Vista, en el orden en que se han descrito.

int CL_System_v1View::OnCreate(LPCREATESTRUCT lpCreateStruct){

if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

HWND hWnd = GetSafeHwnd();
HDC hDC = ::GetDC(hWnd);
if (SetWindowPixelFormat(hDC)==FALSE)
   return 0;
if (CreateViewGLContext(hDC)==FALSE)
   return 0;

return 0;
   }

4. Por último, para intercambiar los contenidos de los buffer y evitar los flickers o parpadeos de la pantalla, en la función OnPaint, cuando termino de llamar a todas las funciones de rendering, llamo a:


SwapBuffers(dc);

,siendo dc el contexto de dispositivo actual. Bien, esta implementación del double buffer funciona en algunos equipos pero no en otros, teniendo todos los equipos en los que se ha probado la misma  Windows XP instalado. No entiendo cual puede ser la razón y la verdad es que empiezo a desesperarme. ¿alguien sabria decirme la posible causa del problema? Muchas gracias por la ayuda, un saludo.
#3
General Programadores / CArray
23 de Octubre de 2007, 12:15:14 PM
Hola, tengo un problema al intentar utilizar esta template class. Cuando declaro una instancia de la misma de la forma

CArray<int,int> branch_container;

e intento compilar, el compilador me lanza los siguientes errores:


U:\L_System_v1\LTree_v1\LTree_v1.cpp(69) : error C2143: syntax error : missing ';' before '<'

U:\L_System_v1\LTree_v1\LTree_v1.cpp(69) : error C2501: 'CArray' : missing storage-class or type specifiers

U:\L_System_v1\LTree_v1\LTree_v1.cpp(69) : error C2143: syntax error : missing ';' before '<'



¿Alguien sabe porque ocurre eso?

Muchas gracias

Fernando Gutiérrez[/code]
#4
Programación gráfica / Rotaciones en OpenGL
17 de Octubre de 2007, 10:48:55 PM
La verdad es que me explico de pena, jeje, pero es algo complicado de expresar. En todo caso, mañana intento exponerlo de forma más clara que hoy estoy ya un poco oxidado, aunque creo que la solución a mi problema por lo que he estado investigando por ahí puede tener algo que ver con un invento llamado Cuaterniones.Tengo que mirarlo más tranquilamente, como he dicho mañana intentaré ser más claro a la hora de exponer mi problema
#5
Programación gráfica / Rotaciones en OpenGL
17 de Octubre de 2007, 07:14:48 PM
Hola, buenas tardes. Estoy inmerso en mi Proyecto Fin de Carrera que consiste en la implementación de un L-System para modelar el crecimiento de árboles. Bien, teniendo una primera versión de la parte lógica(aquella que va generando la cadena de símbolos resultante tras cada paso de derivación) más o menos resuelta, a la hora de interpretar gráficamente los símbolos me he encontrado el siguiente problema:

Mi alfabeto consta de un símbolo '+(a1,a2,a3)' que consta de 3 parámetros, que especifican los Ángulos de Euler  de una determinada rotación. Es decir, la idea es que en este símbolo puede especificar como quiero rotar mi sistema de coordenadas local alrededor de cada uno de los 3 ejes. Bien, la dificultad que me encuentro es la de conseguir que los 3 giros sean simúltaneos, es decir, que sean tratados como un único giro. Si simplemente interpreto este símbolo llamando secuencialmente a los comandos:

glRotate(a1,1,0,0);
glRotate(a2,0,1,0);
glRotate(a3,0,0,1);  

Me encuentro que la primera rotación afecta a la segunda, y esta a la tercera. Yo busco el efecto de que los 3 ejes de rotación se refieran a la ModelView anterior a la interpretación del símbolo, es decir, a un sistema de coordenadas más global por asi decirlo. No se si  he explicado bien mi problemática, en todo caso si alguién se aclara ante todo este embrollo y es capaz de aportarme alguna idea, se lo agradeceria eternamente.

Muchas gracias por anticipado

Fernando Gutiérrez
#6
General Programadores / Duda liberar memoria dinámica
17 de Octubre de 2007, 06:59:26 PM
Se me habia olvidado completamente que habia dejado este post abierto sin finiquitar la duda que planteaba. Finalmente encontré el error, y como suele ocurrir en estos casos fue la cosa más absurda que uno se pueda echar a la cabeza. Resulta que a la hora de reservar memoria para la cadena param_cpy no estaba reservando un espacio para el carácter Nulo. Vamos, que solucioné el asunto simplemente cambiando:


char *param_cpy = (char*)calloc (
        strlen(&(cadena[p_cadena])
         ),
        sizeof (char)
  );



por:

char *param_cpy = (char*)malloc (
        (strlen(&(cadena[p_cadena]) )+1) * sizeof (char) );


Cambié la instrución calloc por malloc porque descubrí que esta última supone menos carga para el sistema ya que no tiene la propiedad zero-filling que si posee la malloc. Muchas gracias por vuestra ayuda, un saludo.

Fernando Gutiérrez.
#7
General Programadores / Duda liberar memoria dinámica
15 de Octubre de 2007, 05:45:29 PM
Cita de: "r2d2rigo"Tienes ese codigo en un bucle? Lo digo porque strtok devuelve un char* con el token encontrado, PERO si no lo encuentra devuelve NULL directamente. A ver si en la ultima iteracion estas usando un free(NULL) y por eso te peta :P

En todo caso si fuera eso lo que me ocurriera devolveria un NULL en la variable 'lg' y no en 'param_cpy' Aun así,me he asegurado de que la función strtok nunca me devuelva un NULL.

Cita de: "r2d2rigo"PD: hey, yo a ti te he visto por GameDev ;)

Si señor, jeje. La verdad que estoy ahora liado con el Proyecto Fin de Carrera y estoy registrado en varios foros. Supongo que me habrás visto en el foro de OpenGL preguntando cosas absurdas de principiante.

Muchas gracias por la ayuda, un saludo.
#8
General Programadores / Re: Duda liberar memoria dinámica
15 de Octubre de 2007, 05:41:05 PM
Cita de: "Tei"Lo he sangrado para ayudar al proximo aventurero, pero no he desentrañado ningun misterio del interior de la bestia.


  p_cadena = p_cadena + 2; /* Puntero para ir recorriendo cada  
                                              cada carácter de la cadena
       
  char *param_cpy = (char*)calloc (
        strlen(&(cadena[p_cadena])
         ),
        sizeof (char)
  );

  if (!param_cpy)
    die("No hay memoria. Agite el dispositivo, y vuelva intentarlo.");

  strcpy( param_cpy , &(cadena[p_cadena]) );//??????????????
  // esto es algo como strcpy( param_cpy , cadena + p_cadena )? Eso es.

  char *lg = strtok( param_cpy,","); //??
  p_cadena = p_cadena + strlen(lg); //??

 *result = sscanf( lg,"%f",l );

 if (param_cpy)  free(param_cpy); //no deberia ser necesario el if, creo
 


Estoy un poco oxidado. Igual en casa le hecho un vistazo en serio. Pero para entonces alguien ya habra descuvierto el misterio :D

Explico un poco que pretende hacer el código. Mi proyecto consiste en implementar un L-System, en principio algo sencillo, que se deberá utilizar para modelar  después mediante Open GL el crecimiento de árboles y plantas. Llendo al grano, en esta parte del código se recorre la cadena de símbolos generados, para lo cual se utiliza un puntero llamado 'p_cadena'. Si por ejemplo se encuentra en la cadena un símbolo A con dos parámetros 'A(l,t)', en esta parte del código se pretende recuperar el valor de esos dos parámetros. Por ello se implementa un tokenizador. El tema esta en que en esta parte del programa nos aseguramos de que la cadena analizado es sintácticamente correcta, por lo que el tokenizador siempre deberia devolver algo y nunca un NULL.
Muchas gracias por vuestra ayuda, y perdón si mi forma de programar es un tanto ilegible, pero estoy empezando y se puede decir que este es mi primer proyecto serio. Jeje, de hecho este es mi Proyecto Fin de Carrera.
#9
General Programadores / Duda liberar memoria dinámica
15 de Octubre de 2007, 02:24:50 PM
Hola, buenas tardes. Llevo varios dias dándole vueltas a un asunto. Estoy implementando un tokenizador, y tengo problemas con la reserva y liberación dinámica de memoria. El fragmento de código que me esta dando problemas es el siguiente:


   /* Se lee el valor del parámetro Longitud del   símbolo Apex */

  p_cadena=p_cadena+2;
  char *param_cpy=(char*)calloc(strlen(&(cadena[p_cadena])),sizeof (char));
 strcpy(param_cpy,&(cadena[p_cadena]));
 char *lg=strtok(param_cpy,",");
 p_cadena=p_cadena+strlen(lg);
 *result=sscanf(lg,"%f",l);

 free(param_cpy);

Es decir, en primer lugar reservo memoria para la cadena param_cpy donde guardo una copia de la cadena de texto a 'tokenizar'. Con la llamada a la función strtok(param_cpy,'',") guardo en la cadena lg un determinado token. El problema viene cuando intento liberar la memoria antes reservada en la variable param_cpy, generándome la instrucción marcada en rojo un error en tiempo de ejecución. Creo que la razón del error tiene que ver con el funcionamiento de la función strtok, pero no logró llegar a comprender el porque de este mal funcionamiento. ¿Alguien podria ayudarme?

Gracias de antemano.

Fernando.
#10
Programación gráfica / Anti-aliasing
09 de Octubre de 2007, 01:20:10 PM
Cita de: "Tei"
Cita de: "fgutierrez"No conocia la técnica de multisamplig FSAA, asi que le echaré un vistazo y lo intentaré de esta forma. De todas formas es realmente curioso lo del POLYGON_SMOOTH,he intentado probrarlo en otro Pc con otra tarjeta gráfica (la de mi casa es un NVIDIA) y lo que ahora ocurre es que la figura aparece totalmente pintada en colo blanco. Curioso el tema.

Bueno. Puede que necesites dibujar las lineas con antialias o poligonos con antialias de atras hacia adelante.  

Del primer mensaje ya saque como conclusión que tienes un poligono que ocupa toda la pantalla.  Quizas un fondo, o una gui, o algo.

He probado tanto dibujando un solo polígono simple como un cilindro utilizando los quadratics de glu, y el efecto  es el mismo. De todas formas, muchas gracias por intentar ayudarme, seguiré investigando.
#11
Programación gráfica / Anti-aliasing
09 de Octubre de 2007, 12:01:00 PM
No conocia la técnica de multisamplig FSAA, asi que le echaré un vistazo y lo intentaré de esta forma. De todas formas es realmente curioso lo del POLYGON_SMOOTH,he intentado probrarlo en otro Pc con otra tarjeta gráfica (la de mi casa es un NVIDIA) y lo que ahora ocurre es que la figura aparece totalmente pintada en colo blanco. Curioso el tema.
#12
Programación gráfica / Anti-aliasing
08 de Octubre de 2007, 06:05:43 PM
Cita de: "r2d2rigo"
EDIT: me acabo de encontrar esto de casualidad en GameDev: http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node121.html

Justo es esa recomendación la que estoy intentando seguir, pero no se porque razón cuando la implemento tal cual desaparece el cilindro con el que estoy haciendo las pruebas. No se si tiene algo que ver el hecho de que esté trabajando con Quadratics. Muchas gracias de todas las maneras.
#13
Programación gráfica / Anti-aliasing
08 de Octubre de 2007, 01:40:14 PM
Hola, buenas tardes. Estoy intentando suavizar mis polígonos mediante la implementación de anti-aliasing mediante las funciones de blending. Estoy haciendo las pruebas con un Quadratic Object cilíndrico, generandolo mediante la función gluCylinder(...). Antes de llamar a esta función realizo las siguientes modificaciones:

  .....

  glDisable(GL_DEPTH_TEST);
  glEnable(GL_BLEND);
  glEnable(GL_POLYGON_SMOOTH);
  glBlendFunc(GL_SRC_ALPHA_SATURATE,GL_ONE);


y después del dibujado

  glEnable(GL_DEPTH_TEST);
  glDisable(GL_BLEND);
  glDisable(GL_POLYGON_SMOOTH);


bien, despues de incluir estas lineas en mi código y ejecutar, me encuentro con la desagradable sorpresa de que no se ve nada en la ventana de dibujado. Le ha dado varias vueltas y no encuentro la razón por la que esto ocurre.Además,esta misma función de Blending es utilizada en el Red Book con un ejemplo de Antialiasing en polígonos. ¿Alguien podria decirme porque me esta ocurriendo esto?

Muchas gracias
#14
Programación gráfica / Shaders
04 de Octubre de 2007, 12:44:21 PM
Hola, buenos dias. Estoy un poco confundido con lo que leo sobre los shaders. Parece ser que es una forma de configurar el Pipeline de la tarjeta gráfica, pero no acabo de entender a que se refiere con esto. Entiendo, pero no estoy seguro de si esto es asi, que los shaders son funciones que tratan de aprovechar ciertas capacidades que poseen algunas tarjetas gráficas para realizar de forma más eficiente tareas comunes de OpenGL como texturización, dar color a ciertos polígonos, iluminación, etc... ¿Alguno puede darme algún ejemplo de como se puede utilizar esto?
Muchas gracias. Fernando.
#15
Programación gráfica / Rendering de árboles
03 de Octubre de 2007, 03:26:58 PM
Ok, muchas gracias.

Fernando





Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.