当前位置: 首页 > article >正文

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实现球面贴图旋转


http://www.kler.cn/a/591605.html

相关文章:

  • 前端项目打包构建优化
  • vue3+antd+a-menu配置
  • 防止用户调试网页的若干方法
  • 数据结构 -- 树和二叉树
  • 从盒马看新零售:战略调整背后的零售行业风向-亿发
  • kafka指北
  • 快速进行数据验证的优雅实现-注解
  • 从PLC到云端:5G嵌入式网关的MQTT协议转换与Ubuntu二次开发全解析
  • VLLM:虚拟大型语言模型(Virtual Large Language Model)
  • AI Agent如何通过自然语言处理提升交互体验
  • 【图像处理】ISP(Image Signal Processor) 图像处理器的用途和工作原理?
  • 机器学习 [白板推导](二)[线性回归]
  • 【Go】运算符笔记
  • 安装并使用anaconda(宏观版)
  • HTML,CSS,JavaScript
  • 微服务即时通信系统---(五)框架学习
  • 解决Spring Boot中Chrome浏览器Session ID频繁变动的问题
  • 基于 ELK、Python、OLaMA 和飞书群的 AI 自动化巡检方案
  • Druid 连接池工具类及其在企业级应用中的实践
  • Linux IP 配置