Red de conocimiento informático - Material del sitio web - Cómo inicializar el entorno para la programación opengl en mfc

Cómo inicializar el entorno para la programación opengl en mfc

Hola, estaré encantado de responder a tu pregunta.

1: Crea un nuevo proyecto MFC, un proyecto de un solo documento.

2: Una vez creado el proyecto, puedes compilarlo y ejecutarlo primero. Lo siguiente es para inicializar la ventana Ver en el entorno de programación OpenGL. Por supuesto, todas las operaciones siguientes se realizan 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 de View.h Citado abajo.

#include

#include

#include p>

3: En primer lugar, si desea que la ventana admita OpenGL, debe comprender la estructura de PIXELFORMATDESCRIPTOR. Primero, cree una nueva función SetupPixFormat(CDC

*pDC). la clase Ver, escriba: Si observa la siguiente función, sabrá que es BOOL (Método: en la vista de clases, busque la clase **ver, haga clic con el botón derecho del mouse y agregue una función). importa si es público o privado, de la siguiente manera: BOOL?

CTestGLInitialView::SetupPixFormat(CDC ?*pDC)?

//El proyecto que creé se llama TestGLInitial{static? PIXELFORMATDESCRIPTOR?pfd?=?

//Defina el formato de píxel {sizeof(PIXELFORMATDESCRIPTOR),?/ /?

El tamaño del descriptor de formato anterior es 1,?//?

Número de versión PFD_DRAW_TO_WINDOW?|//?

Ventana de soporte de formato PFD_SUPPORT_OPENGL?|/ /?

El formato debe admitir OpenGLPFD_DOUBLEBUFFER,?//?

Debe admitir doble almacenamiento en búfer PFD_TYPE_RGBA,?//?Solicitar ?RGBA?

Formato 24, //

Profundidad de color de 24 bits, es decir, 16,7 millones de colores verdaderos 0,?0,?0,?0,?0,?0,?//?

Ignorar bit de color 0,?//?

Ninguno Alfa buffer 0,?//?

¿Ignorar Shift?Bit0,?

//?Ninguno Acumular caché 0,?0,?0,?0,//?

¿Ignorar el bit agregado 32,?//?32 bit?

Z-buffer? (caché de profundidad) 0,?

//?Sin caché de máscara 0,? //

Sin caché auxiliar PFD_MAIN_PLANE,?//?

Capa de dibujo principal 0,?//?

Reservado0,?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(),?nIndex,?&pfd);

//Establecer el formato de píxeles}

El objetivo principal de esta función es establecer el formato de píxeles de la ventana para que sea compatible con OpenGL, solo comprenda esto. Esta función se llama al crear la ventana.

5: La función que acabamos de usar se usa para llamar al crear una ventana. Al crear una ventana, también debe realizar una inicialización del entorno OpenGL y luego definir una función InitialGL (), (método). : en classview, busque **ver clase, haga clic derecho, agregue función) No importa si es público o privado, llámelo usted mismo de todos modos, de la siguiente manera: ¿BOOL?

CTestGLInitialView: :InitialGL()

{

glShadeModel(GL_SMOOTH);

//?Habilitar suavizado de sombras

glClearColor(0.0f,? 0.0f,?0.0f,?

0.0f);//?

Fondo negro

glClearDepth(1.0f);

//?

Establecer caché de profundidad

glEnable(GL_DEPTH_TEST);?

//?

Habilitar prueba de profundidad

glDepthFunc(GL_LEQUAL);?

//?El tipo de prueba de profundidad realizada

glHint(GL_PERSPECTIVE_CORRECTION_HINT,?

GL_NICEST);// ?Dile al sistema que corrija la perspectiva

¿regresar?

TRUE;?

//?Inicialización?OK

}

Copié todos los códigos aquí. Código anterior del tutorial de NeHe.

6: Ahora puedes capturar el mensaje WM_CREATE (método: view-->classvizard -->messages

maps:classname

Selecciona **ver y buscar WM_CREATE, agregar función, editar código). Sin embargo, primero debe definir un miembro de CClientDC* (Método: en la vista de clases, busque la clase **ver, haga clic con el botón derecho y agregue variables miembro de función. Escriba: CClientDC*, nombre: m_pDC) Este miembro apunta a la Vista. ventana en sí. Se utiliza para pasar a la función SetupPixFormat(CDC

*pDC) y no tiene otro significado.

Ahora, para capturar el mensaje WM_CREATE (), escribe el siguiente código: int?

CTestGLInitialView::OnCreate(LPCREATESTRUCT?lpCreateStruct)

{

si?

(CView::OnCreate(lpCreateStruct)?==?-1)

return?-1;

//

TODO:?Agregar?tu?código?de?creación?especializada?aquí

m_pDC?=?nuevo?

CClientDC(este);

SetupPixFormat(m_pDC);

HGLRC?hrc?=?

wglCreateContext(m_pDC->GetSafeHdc());

wglMakeCurrent(m_pDC- > GetSafeHdc(),?

hrc);

InitialGL();

¿retorno?

0;

}

Por supuesto, cuando se cierra la ventana, se deben liberar algunos recursos.

Capture el mensaje WM_DESTROY, (método: ver-->classvizard

-->maps 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:?Agregar?

¿su?mensaje?handler?código?aquí

HGLRC?hrc?=?

wglGetCurrentContext();

wglMakeCurrent(NULL,?

0);

wglDeleteContext(hrc);

¿eliminar?

m_pDC;

}

Ahora puedes compilarlo sin errores.

7: Ahora, el entorno OpenGL casi se ha inicializado. Puede comenzar a dibujar Primero defina una función de dibujo DrawScene() y escriba el siguiente código: BOOL?

CTestGLInitialView::DrawScene()

{

glClear. (GL_COLOR_BUFFER_BIT?|?

GL_DEPTH_BUFFER_BIT);//?

Borrar pantalla y caché de profundidad

glLoadIdentity();

// ?

Restablecer la matriz de observación del modelo actual

SwapBuffers(m_pDC->GetSafeHdc());

//?Swap buffers

return?TRUE;

}

Luego, en OnDraw, llame a esta función: void?

CTestGLInitialView::OnDraw( CDC*?pDC)

{

CTestGLInitialDoc*?pDoc?=?

GetDocument();

ASSERT_VALID(pDoc

/ /?TODO:?¿Agregar?dibujar?código?para?datos?nativos?

aquí

DrawScene();

}

8: Ejecútelo y aparecerá un fondo negro.

9: En este momento, puede modificar la función de dibujo DrawScene () para dibujar. Dibuja el triángulo y el cuadrado 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 el caché de pantalla y profundidad glLoadIdentity();

//?Restablecer la matriz de observación del modelo actual

glTranslatef(-1.5f,0.0f,-6.0f);//?Shift izquierda ?

1.5? unidades y se movió a la pantalla?

6.0glBegin(GL_TRIANGLES);?/?

Dibuja el 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);//?

Abajo izquierda glColor3f(0.0f,?0.0f,?1.0f);glVertex3f(? 1.0f,-1.0 f,?

0.0f);//?

GlEnd() inferior derecha;

//?

Fin del dibujo del triángulo glTranslatef(3.0f,0.0f,0.0f);

//?Desplazamiento a la derecha 3 unidades glColor3f(0.0f,?0.0f,?

1.0f);glBegin(GL_QUADS );?

//?Dibujar un cuadrado glVertex3f(-1.0f,?1.0f,?0.0f);

//?Arriba izquierda glVertex3f(?1.0f,?1.0f ,?0.0f);//?

Arriba a la derecha glVertex3f(?1.0f,-1.0f,?0.0f);//?

Abajo izquierda glVertex3f(-1.0f,- 1.0f,?0.0f);//?

Abajo derecha

glEnd();SwapBuffers(m_pDC->GetSafeHdc() );

// ?Swap buffer return?TRUE;}

Ejecútalo y descubre que los gráficos no aparecen. ¿Qué está pasando? Resulta que el método de proyección y la ventana gráfica aún no se han definido. Es decir, si se debe utilizar proyección ortográfica o proyección en perspectiva. Defina la proyección y capture el mensaje WM_SIZE.

Escribe el siguiente código: void?

CTestGLInitialView::OnSize(UINT?nType,?int?cx,?int?

cy)

{

CView::OnSize(nType,?cx,?cy);

//?TODO:?Agregar?su?mensaje?

¿código?de controlador?aquí

if?(0?==?

cy)?//?

Evitar la división por cero

{

cy?=?

1;?//?

Establecer altura en 1

}

glViewport(0 ,?0,?cx,?cy);?

//?Restablecer la ventana gráfica actual

glMatrixMode(GL_PROJECTION);?//?

Seleccionar la matriz de proyección

glLoadIdentity();//?

Restablecer la matriz de proyección

//?

Establecer el 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 observación del modelo

glLoadIdentity();//?

Restablecer la matriz de observación del modelo

}

Ejecutar nuevamente Después Al cabo de un rato, aparecieron los gráficos. De ahora en adelante, puede escribir cualquier código de dibujo en DrawScene() y se adaptará automáticamente cuando se vuelva a dibujar la ventana. Si desea crear un dibujo 3D que pueda moverse, puede capturar el mensaje WM_TIMER, definir un reloj durante OnCreate y combinarlo con algunas variables para crear una animación simple.

Si está satisfecho, haga clic derecho Acepte la respuesta. Si aún tiene preguntas, haga clic para preguntar

¡Espero que mi respuesta le sea útil y espero que la acepte! ~?O(∩_∩)O~