vc no se muestra cuando se ejecutan gráficos opengl
En primer lugar, Windows solo admite la versión 1.1 de OpenGL, por lo que muchas API no están disponibles.
Pero puedes usar algunas implementaciones opengl de código abierto como Mesa3D. Tenga en cuenta que es una implementación de software de OpenGL y es muy lenta.
Alternativamente, dependiendo del modelo de tu tarjeta gráfica, puedes visitar el kit de desarrollo oficial de OpenGL y descargarlo directamente.
Además, la API OpenGL no parece admitir directamente la velocidad de fotogramas de control de subprocesos. Debes abrir tu propio subproceso para dibujar. Aquí hay algunos códigos de muestra:
1. OpenGL en MFC Parte 1
void CXXXDlg: InitOpenGLWithWnd(HWND hWnd, HDC* hDC, HGLRC* hRC)
{
PIXELFORMATDESCRIPTOR pfd;
int iFormat;
*hDC =::GetDC(hWnd);
ZeroMemory(amp;pfd, sizeof(pfd));
pfd .nSize = sizeof( pfd );
pfd.iLayerType = PFD_MAIN_ PLANE;
iFormat = ChoosePixelFormat( *hDC, amp; pfd ); *hDC, iFormat, amp;pfd);
*hRC = wglCreateContext(*hDC);
wglMakeCurrent(*hDC, *hRC);
}
hWnd es el control que debe dibujarse y m_hDrawGLRC es el contexto GL utilizado para regresar.
Luego abrirías un hilo propio y llamarías repetidamente a una función de dibujo, como llamar a DrawFrame
2 Parte 2, Dibujo básico
void COpenGLDemo01Dlg. ::DrawFrame()
{
CGLAutoLock autolock(m_glLock);
glMatrixMode(GL_PROJECTION //Modificar la matriz de proyección
glLoadIdentity();/Restablecer, borrar la matriz de proyección
glMatrixMode(GL_MODELVIEW); //Modificar la matriz de vista del modelo
glLoadIdentity() //Restablecer, borrar el modelo la matriz de vista
gluPerspective(60.0f, ((float)width)/height, 5.0f, 150.0f); //Modo de proyección.
glViewport(0, 0, ancho, alto);
gluLookAt(eye.x, eye.y, eye.z, eye.x dir.x, eye.y dir .y, eye.z dir.z, up.x, up.y, up.z); //Viewport.
OpenGLDrawFrame(m_hDrawDC);
}
OpenGLDrawFrame es otra función para dibujar contenido en él.
eye, dir Estas son variables que almacenan en caché la dirección de la vista. Si no necesita itinerancia de escena, puede escribirlas de forma física.
// Definir el ancho, alto y profundidad del mundo
GLint world_width = 1000
GLint world_height = 1000
GLint world_ Depth = 1000;
// Dibuja el plano X-Z en forma de cuadrícula. Una cuadrícula por celda.
void drawWorld(void)
{
glColor4f(1.0f, 0.0f, 0.0f, 1.0f); (GLint w=-(ancho_mundo/2); wlt;=ancho_mundo/2; w = 5){
glBegin(GL_LINE_STRIP);
glVertex3f(w, 0, -profundidad_mundial /2);
glVertex3f(w, 0, profundidad_mundo/2);
glEnd();
}
glColor4f( 0.0f, 0.0f, 1.0f, 1.0f);
for(GLint d=-(world_profundidad/2); dlt;=world_profundidad/2; d =5){
glBegin(GL_LINE_STRIP).
glVertex3f(-world_width/2, 0, d
glVertex3f(world_width/2, 0, d); glEnd();
}
glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
for(GLint w=-(world_width/) 2); wlt;=ancho_mundo/2; w =5){
glBegin(GL_LINE_STRIP);
glVertex3f(w, 40.0f, -profundidad_mundo/2); p>
glBegin(GL_LINE_STRIP);
p>
glVertex3f(w, 40.0f, world_ Depth/2);
glEnd(); p> }
glColor4f(0.0f, 0.0f , 1.0f, 1.0f);
for(GLint d=- (profundidad_mundial/2); dlt;=profundidad_mundial/2 ; d =5){
glBegin(GL_LINE_STRIP) ;
glVertex3f(-world_width/2, 40.0f, d
glVertex3f(world_width/2); , 40.0f, d);
glEnd() ;
}
}
void OpenGLDrawFrame(HDC hDrawDC)
{
glClear(GL_ COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
//drawWorld
drawWorld();
p>
//drawObjects
// ...
//Enviar
glFlush();
// Utilice el caché para actualizar la interfaz.
IntercambiarBuffers(hDrawDC
}
;