Cómo configurar opengl en MFC
2: Una vez creado el proyecto, puedes compilarlo y ejecutarlo primero. El siguiente paso es inicializar la ventana Ver en el entorno de programación OpenGL. Por supuesto, todas las operaciones siguientes se realizarán en la clase Ver.
Primero, agregue opengl32.lib en Proyecto->Configuración->Enlace
glu32.lib glut.lib glaux.lib, y luego agréguelo a la definición de clase en View.h Cita a continuación.
#include
#include
#include 3: Primero, debe hacer que la ventana admita OpenGL, por eso es importante comprender la referencia de la estructura PIXELFORMATDESCRIPTOR. Primero, cree una nueva función SetupPixFormat (CDC) en la clase Ver >
BOOL
CTestGLInitialView::SetupPixFormat(CDC *pDC)
// Creé un archivo llamado TestGLInitial{static PIXELFORMATDESCRIPTOR pfd =
/ / Definir el formato de píxeles { sizeof(PIXELFORMATDESCRIPTOR), //
El tamaño del descriptor de formato 1 anterior,
número de versión PFD_DRAW_TO_WINDOW | // //
Ventana de soporte de formato PFD_SUPPORT_ OPENGL | //
El formato debe admitir OpenGL PFD_DOUBLEBUFFER, //
Debe admitir doble almacenamiento en búfer PFD_TYPE_RGBA, // Aplicable a RGBA
Formato 24, //
Profundidad de color de 24 bits, es decir....
e., 167 millones de colores verdaderos 0, 0, 0, 0, 0, 0, 0, 0, //
Ignorar el bit de color 0, //
Sin caché Alpha 0 , //
Ignorar el bit de desplazamiento 0,
// Sin búfer de acumulación 0, 0, 0, 0, //
Ignorar el bit de agregación 32,
Caché Z (caché de profundidad) 0,
// Sin caché de máscara 0, //
Sin caché auxiliar PFD_MAIN_PLANE, //
Capa principal 0 , //
Reservar 0, 0, 0 //
Ignorar máscara de capa};
int nIndex = ChoosePixelFormat( pDC-> GetSafeHdc(), &pfd
//Seleccione el formato de píxel recién definido if( nIndex == 0 ) return FALSE; return
SetPixelFormat(pDC->GetSafeHdc(), &pfd ); >
SetPixelFormat(pDC-> GetSafeHdc(), &pfd
SetPixelFormat( nIndex, &pfd); El objetivo principal de esta función es establecer el formato de píxeles de la ventana para que admita OpenGL, solo comprenda esto. Esta función se llama cuando se crea la ventana.
5: La función que se acaba de llamar al crear la ventana. Al crear la ventana, también debe realizar una inicialización del entorno OpenGL y luego definir una función InitialGL(), (método: en classview, busque ** clase de vista, haga clic con el botón derecho del mouse y agregue una función) público o privado no importa, en resumen, llámelo usted mismo, de la siguiente manera:
BOOL
CTestGLInitialView::InitialGL()
{
glShadeModel(GL_SMOOTH);
/// Habilitar suavizado de sombras
glClearColor (0.0f, 0.0f, 0.0f,
p>0.0f); //
Fondo negro
glClearDepth(1.0f); >
//
/
Establecer caché de profundidad
glEnable(GL_DEPTH_TEST
/
Habilitar prueba de profundidad
glDepthFunc(GL_LEQUAL );
// Tipo de prueba de profundidad que se está realizando
glHint(GL_PERSPECTIVE_CORRECTION_HINT,
GL_NICEST ); // Dile al sistema que realice la corrección de perspectiva
return
TRUE
//Inicialización OK
}
Copié esto del código anterior del tutorial de NeHe.
6: Ahora puede capturar el mensaje WM_CREATE (método: ver -->classvizard -->mensajes
maps:classname
Seleccione **ver y buscar WM_CREATE, agregar función, editar código).
Sin embargo, primero debe definir un miembro CClientDC* (método: en la vista de clases, busque la clase **ver, haga clic derecho y agregue variables miembro de función. Escriba: CClientDC*, nombre: m_pDC) Este miembro apunta a la propia ventana Ver , Para pasar a la función SetupPixFormat(CDC
*pDC), nada más.
Ahora, para capturar el mensaje WM_CREATE(), escribe el siguiente código:
int
CTestGLInitialView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if
(CView::OnCreate(lpCreateStruct) == -1)
return -1;
/ /
TODO: Añade aquí tu código creado especialmente
m_pDC = new
CClientDC(this);
SetupPixFormat(m_pDC );
HGLRC hrc =
wglCreateContext(m_pDC->GetSafeHdc(),
wglMakeCurrent(m_pDC->GetSafeHdc(),
hrc);
InitialGL();
return
0;
}
Por supuesto, algunos Los recursos también deben liberarse cuando la ventana está cerrada. Capture el mensaje WM_DESTROY (método: ver-->classvizard
-->Asignación de mensajes: nombre de clase seleccione **ver, busque WM_DESTROY, agregue función, edite código) Escriba el siguiente código:
void
CTestGLInitialView::OnDestroy()
{
CView::OnDestroy();
// TODO: aquí Agregue su código de controlador de mensajes
HGLRC hrc =
wglGetCurrentContext();
wglMakeCurrent(NULL,
0); p>
wglDeleteContext(hrc);
delete
m_pDC;
}
Ahora puedes compilarlo sin errores.
7: Ahora, el entorno OpenGL básicamente se ha inicializado.
Puedes comenzar a dibujar Primero define una función de dibujo DrawScene() y escribe el siguiente código:
BOOL
CTestGLInitialView::DrawScene()
{ p>
glClear(GL_COLOR_BUFFER_BIT |)
GL_DEPTH_BUFFER_BIT); //
Borrar pantalla y caché de profundidad
glLoadIdentity(); p>//
Restablecer la matriz de observación del modelo actual
SwapBuffers(m_pDC->.GetSafeHdc()
// SwapBuffers
<); p>return TRUE;}
Luego, llame a esta función en OnDraw:
void
CTestGLInitialView::OnDraw(CDC * pDC)
{
CTestGLInitialDoc* pDoc =
GetDocument();
ASSERT_VALID(pDoc);
// TODO: Agregue código de dibujo para datos locales
aquí
DrawScene();
}
8: Ejecútelo, Aparecerá un fondo negro.
9: En este punto, puede modificar la función de dibujo DrawScene() para dibujar gráficos. Dibujar triángulos y cuadrados de la lección 3 de NeHe. Escriba el código de la siguiente manera:
BOOL
CTestGLInitialView::DrawScene(){glClear(GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT);
Borrar la pantalla y el caché de profundidad glLoadIdentity();
//Restablecer la matriz de observación del modelo actual
glTranslatef(-1.5f,0.0f,-6.0f) ; // Mover a la izquierda
1,5 unidades a la pantalla
6.0glBegin(GL_TRIANGLES); //
GL_DEPTH_BUFFER_BIT
GL_DEPTH_BUFFER_BIT; //
Dibujar triángulo glColor3f(1.0f, 0.0f, 0.0f); glVertex3f( 0.0f, 1.0f,
0.0f); // Vértice superior glColor3f(0.0f); , 1.0f,
0.0f);glVertex3f(-1.0f, - 1.0f, 0.0f); //
Vértice inferior izquierdo glColor3f(0.0f, 0.0f, 1.0 f) ;glVertex3f( 1.0f, -1.0f,
0.0f); //
GlEnd inferior derecho()
//
Finaliza el dibujo del triángulo.
0f);
// Desplazamiento hacia la derecha 3 unidades glColor3f(0.0f, 0.0f,
1.0f); glBegin(GL_QUADS); Dibuja un cuadrado glVertex3f(-1.0f, 1.0f, 0.0f);
// Superior izquierda glVertex3f( 1.0f, 1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 0.0f); //
Abajo izquierda glVertex3f(-1.0f,-1.0f, 0.0f); //
Abajo derecha
glEnd ();SwapBuffers(m_pDC->GetSafeHdc());
// SwapBuffers devuelve TRUE;}
Después de ejecutar, encontré que los gráficos no se muestran. esta pasando? Resulta que esto se debe a que el método de proyección y la ventana gráfica aún no se han definido. Es decir, si utilizar proyección ortográfica o en perspectiva. Defina la proyección y también capture el mensaje WM_SIZE. Por favor escriba el siguiente código:
void
CTestGLInitialView::OnSize(UINT nType, int cx, int
cy)
{
CView::OnSize(nType, cx, cy);
/ / TODO: Añade tu información aquí
Código del controlador
if (0 ==
cy) //
Evitar la división por cero
{
cy =
1; //
Establece la altura en 1
Evita la división por cero. p>}
glViewport(0, 0, cx, cy);
//Restablecer la ventana gráfica actual
glMatrixMode(GL_PROJECTION); p>
Seleccione la matriz de proyección
glLoadIdentity(); //
Restablecer la matriz de proyección
//
Configuración Tamaño de la ventana gráfica
gluPerspective(45.0f,(GLfloat)cx/(GLfloat)cy,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
//Seleccione la matriz de vista del modelo
glLoadIdentity();
Restablezca la matriz de vista del modelo
}
Ejecútelo nuevamente y el Se crearán gráficos. De ahora en adelante, puedes escribir cualquier código de dibujo en DrawScene() y todo se ajustará automáticamente cuando se vuelva a dibujar la ventana. Si desea crear gráficos 3D móviles, puede capturar el mensaje WM_TIMER nuevamente y hacer una animación simple definiendo un reloj y algunas variables en OnCreate.