Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con Implementación del Double Buffer

Iniciado por fgutierrez, 13 de Enero de 2008, 12:44:45 AM

« anterior - próximo »

fgutierrez

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.
eamos realistas: Exijamos lo imposible

BeRSeRKeR

¿Con que no funciona quieres decir que el programa da un error al ejecutarlo o que la imagen parpadea?. Si es lo último, prueba a sobrecargar el método OnEraseBkgnd de la vista y haz que devuelva FALSE.

Sólo es una idea, la verdad es que mis tiempos de OpenGL pasaron hace muchos años. :P

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

fgutierrez

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
eamos realistas: Exijamos lo imposible

tamat

madre de dios bendito, despues de ver ese codigo de MFC he recordado porqué me pasé a QT. Tres lineas y ya tengo mi contexto de GL creado.
Por un stratos menos tenso






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.