參照本文檔可以完成環境搭建和測試,如果想要快速完成環境的搭建可以獲取本人的工程,包括所用到的工具鏈和測試工程源碼獲取(非免費介意務下載):鏈接: https://pan.baidu.com/s/1H2ejbT7kLM9ore5MqyomgA 提取碼: 8s1b?
1、環境搭建
1)安裝glew
https://sourceforge.net/projects/glew/
直接下載,當前使用的版本是glew-2.2.0-win32.zip
放到指定的路徑并解壓
如下所示:
2)安裝glfw
Download | GLFW
直接下載,當前使用的版本是glfw-3.4.bin.WIN64.zip
放到指定的路徑并解壓
如下所示:
3)安裝freeglut
https://www.transmissionzero.co.uk/software/freeglut-devel/
直接下載,當前使用的版本是glfw-3.4.bin.WIN64.zip
放到指定的路徑并解壓
如下所示:
2、配置MFC工程和測試
配置如下所示
設置包含目錄
E:\opengl\glfw-3.4.bin.WIN64\includeE:\opengl\glew-2.2.0\includeE:\opengl\freeglut\include
設置庫目錄
E:\opengl\glfw-3.4.bin.WIN64\lib-vc2022E:\opengl\glew-2.2.0\lib\Release\x64E:\opengl\freeglut\lib\x64
連接器設置
freeglut.lib
glew32.lib
glew32s.lib
glfw3.lib
glfw3_mt.lib
glfw3dll.lib
3、測試界面
4、運行效果
1、正方形測試
部分源碼
int argc = 1; // 至少需要一個參數(程序名) char* argv[1] = { "program" }; // 模擬程序名 glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("第一個OpenGL程序");glutDisplayFunc(&myDisplay);glutMainLoop();
2、立方體測試
部分源碼
// 繪制立方體
void displayMe() {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除顏色和深度緩沖區 glLoadIdentity(); // 重置模型視圖矩陣 // 設置觀察位置 gluLookAt(0.0, 0.0, 5.0, // 攝像機位置 0.0, 0.0, 0.0, // 觀察目標 0.0, 1.0, 0.0); // 上方向 // 旋轉立方體 glRotatef(angle, 1.0f, 1.0f, 0.0f); // 繞 (1, 1, 0) 軸旋轉 // 繪制立方體 glBegin(GL_QUADS);// 前面 glColor3f(1.0f, 0.0f, 0.0f); // 紅色 glVertex3f(-1.0f, -1.0f, 1.0f);glVertex3f(1.0f, -1.0f, 1.0f);glVertex3f(1.0f, 1.0f, 1.0f);glVertex3f(-1.0f, 1.0f, 1.0f);// 后面 glColor3f(0.0f, 1.0f, 0.0f); // 綠色 glVertex3f(-1.0f, -1.0f, -1.0f);glVertex3f(-1.0f, 1.0f, -1.0f);glVertex3f(1.0f, 1.0f, -1.0f);glVertex3f(1.0f, -1.0f, -1.0f);// 左面 glColor3f(0.0f, 0.0f, 1.0f); // 藍色 glVertex3f(-1.0f, -1.0f, -1.0f);glVertex3f(-1.0f, -1.0f, 1.0f);glVertex3f(-1.0f, 1.0f, 1.0f);glVertex3f(-1.0f, 1.0f, -1.0f);// 右面 glColor3f(1.0f, 1.0f, 0.0f); // 黃色 glVertex3f(1.0f, -1.0f, -1.0f);glVertex3f(1.0f, 1.0f, -1.0f);glVertex3f(1.0f, 1.0f, 1.0f);glVertex3f(1.0f, -1.0f, 1.0f);// 頂面 glColor3f(0.0f, 1.0f, 1.0f); // 青色 glVertex3f(-1.0f, 1.0f, -1.0f);glVertex3f(-1.0f, 1.0f, 1.0f);glVertex3f(1.0f, 1.0f, 1.0f);glVertex3f(1.0f, 1.0f, -1.0f);// 底面 glColor3f(1.0f, 0.0f, 1.0f); // 紫色 glVertex3f(-1.0f, -1.0f, -1.0f);glVertex3f(1.0f, -1.0f, -1.0f);glVertex3f(1.0f, -1.0f, 1.0f);glVertex3f(-1.0f, -1.0f, 1.0f);glEnd();glutSwapBuffers(); // 交換前后緩沖區
}void CjsAVMopenglDlg::OnBnClickedButton1()
{TODO: 在此添加控件通知處理程序代碼int argc_fake = 1;char* argv_fake[1] = { "program" };glutInit(&argc_fake, argv_fake);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(500, 500);glutCreateWindow("3D Cube");glEnable(GL_DEPTH_TEST); // 啟用深度測試 glutDisplayFunc(displayMe);glutReshapeFunc(reshapeMe);// 使用定時器控制旋轉速度 glutTimerFunc(16, updateRotation, 0); // 每 16 毫秒調用一次 updateRotation glutMainLoop();
}
3、球體測試(帶貼圖)
部分源碼
// 繪制函數
void display() {// 清除顏色和深度緩沖 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();// 設置觀察點 gluLookAt(0.0, 0.0, 5.0, // 相機位置 0.0, 0.0, 0.0, // 觀察點 0.0, 1.0, 0.0); // 上方向 // 旋轉地球 glRotatef(angle, 0.0f, 1.0f, 0.0f);// 啟用紋理 glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, texture);// 創建球體 GLUquadric* sphere = gluNewQuadric();gluQuadricTexture(sphere, GL_TRUE);gluQuadricNormals(sphere, GLU_SMOOTH);gluSphere(sphere, 1.8, 50, 50); // 半徑1.0,50x50分段 gluDeleteQuadric(sphere);// 禁用紋理 glDisable(GL_TEXTURE_2D);// 交換緩沖區 glutSwapBuffers();
}
//MFC對話框按鈕點擊事件
void CjsAVMopenglDlg::OnBnClickedButton3()
{// 初始化GLUT int argc = 1;char* argv[1] = { (char*)"Something" };glutInit(&argc, argv);// 設置顯示模式 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);// 設置窗口大小和位置 glutInitWindowSize(800, 800);glutInitWindowPosition(100, 100);// 創建窗口 glutCreateWindow("Earth Rotation");// 初始化OpenGL init();// 加載紋理 loadTexture();// 設置回調函數 glutDisplayFunc(display);glutReshapeFunc(reshape);glutTimerFunc(0, update, 0);// 進入主循環 glutMainLoop();
}
4、碗型測試
// 窗口大小變化回調函數
void reshape_wan(int width, int height) {glViewport(0, 0, width, height);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0f, (float)width / height, 0.1f, 100.0f);glMatrixMode(GL_MODELVIEW);
}// 鍵盤回調函數
void keyboard(unsigned char key, int x, int y) {switch (key) {case '1': // 碗型視圖 viewMode = 0;break;case '2': // 俯視圖 viewMode = 1;break;case '3': // 分屏視圖 viewMode = 2;break;case '+': // 放大 case '=':zoom += 1.0f;break;case '-': // 縮小 case '_':zoom -= 1.0f;break;case 27: // ESC鍵,退出程序 // 釋放紋理內存 for (int i = 0; i < 5; i++) {delete[] textureData[i];}exit(0);break;}glutPostRedisplay();
}// 方向鍵回調函數
void specialKeys(int key, int x, int y) {switch (key) {case GLUT_KEY_UP:rotX += 5.0f;break;case GLUT_KEY_DOWN:rotX -= 5.0f;break;case GLUT_KEY_LEFT:rotY -= 5.0f;break;case GLUT_KEY_RIGHT:rotY += 5.0f;break;}glutPostRedisplay();
}// 鼠標處理
int mouseX = 0, mouseY = 0;
bool mouseLeftDown = false;
bool mouseRightDown = false;void mouse(int button, int state, int x, int y) {mouseX = x;mouseY = y;if (button == GLUT_LEFT_BUTTON) {if (state == GLUT_DOWN)mouseLeftDown = true;elsemouseLeftDown = false;}else if (button == GLUT_RIGHT_BUTTON) {if (state == GLUT_DOWN)mouseRightDown = true;elsemouseRightDown = false;}
}void mouseMotion(int x, int y) {if (mouseLeftDown) {rotY += (x - mouseX);rotX += (y - mouseY);mouseX = x;mouseY = y;}if (mouseRightDown) {zoom += (y - mouseY) * 0.1f;mouseY = y;}glutPostRedisplay();
}// MFC按鈕事件處理
void CjsAVMopenglDlg::OnBnClickedButton4()
{// TODO: 在此添加控件通知處理程序代碼 int argc = 1;char* argv[1] = { (char*)"Something" };glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(1000, 600);glutCreateWindow("OpenGL AVM 碗型投影全景系統");init_wan();glutDisplayFunc(display_wan);glutReshapeFunc(reshape_wan);glutKeyboardFunc(keyboard);glutSpecialFunc(specialKeys);glutMouseFunc(mouse);glutMotionFunc(mouseMotion);glutMainLoop();
}
動態視頻測試
基于opengl實現球面貼圖旋轉