win10搭建opengl环境搭建并测试--输出立方体球体和碗型并在球体上贴图
参照本文档可以完成环境搭建和测试,如果想要快速完成环境的搭建可以获取本人的工程,包括所用到的工具链和测试工程源码获取(非免费介意务下载):链接: 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\include
E:\opengl\glew-2.2.0\include
E:\opengl\freeglut\include
设置库目录
E:\opengl\glfw-3.4.bin.WIN64\lib-vc2022
E:\opengl\glew-2.2.0\lib\Release\x64
E:\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;
else
mouseLeftDown = false;
}
else if (button == GLUT_RIGHT_BUTTON) {
if (state == GLUT_DOWN)
mouseRightDown = true;
else
mouseRightDown = 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实现球面贴图旋转