【OpenGL】《计算机图形学基础》(第二版)实验课代码

配置开发环境

本文用Vscode+Cmake+MSVC2019开发,环境配置教程参考:Windows下配置C++开发环境:Vscode+VS+CMake

首先,从官网下载库文件,库文件压缩包打开如下图所示:
在这里插入图片描述
将文件复制到项目目录下,项目目录配置如下:
在这里插入图片描述
CMakeList.txt如下:

cmake_minimum_required(VERSION 3.20)
project(opengl)include_directories(glut/include)
link_directories(glut/lib)add_executable(${PROJECT_NAME} main.cpp)
target_link_directories(${PROJECT_NAME} PUBLIC glut32.lib)# 程序运行时不打开黑窗
Set_Target_Properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") 

将后缀名为.lib和.dll的文件放到编译生成的exe文件附近程序即可运行

文章目录

  • 配置开发环境
  • 实验1 OpenGL初识
  • 实验2&3 直线光栅化
  • 实验4 OpenGL交互

实验1 OpenGL初识

main.cpp

#include void myDisplay(void)
{glClearColor(0.0, 0.0, 0.0, 0.0); //预设颜色缓冲区的值:红色、绿色、蓝色、alphaglClear(GL_COLOR_BUFFER_BIT);     //通过预设的值清空色彩缓存区glColor3f(1.0f, 1.0f, 1.0f);      //设置绘制矩形的颜色glRectf(-0.5f,-0.5f,0.5f,0.5f);   //绘制矩形// 绘制三角形glBegin(GL_TRIANGLES);glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 1.0f);glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.8f, -0.5f);glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.8f, -0.5f);glEnd();// 画点glPointSize(3);glBegin(GL_POINTS);glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(-0.4f, -0.4f);glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.0f,   0.0f);glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(0.4f,   0.4f);glEnd();glFlush(); // 画图}int main(int argc,char *argv[])
{glutInit(&argc,argv);                          //初始化glut  (可不写默认)glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);   //显示模式初始化 RGB显示模式,单缓冲模式glutInitWindowPosition(400, 400);              //窗口窗口位置  (可不写默认)glutInitWindowSize(400, 400);                  //窗口大小  (可不写默认)glutCreateWindow("The first OpenGL programe"); //窗口名称glutDisplayFunc(&myDisplay);                   //自定义函数绘图glutMainLoop();                                //消息循环相应return 0;
}

实验2&3 直线光栅化

DDA算法、Bresenham算法、中点线算法

main.cpp

实验4 OpenGL交互

main.cpp

#include 
#include // 四字节精度IEEE 754-1985 浮点数
// 矩形中心位置
GLfloat x = 0.0;
GLfloat y = 0.0;
// 矩形大小
GLfloat size = 50.0;// 有符号四字节整型
// 窗口和视景体高、宽
GLsizei wh = 500, ww =500;void drawSquare(GLint x, GLint y){y = wh - y;// 将所有点绘制成凸多边形glBegin(GL_POLYGON);glVertex3f(x + size, y + size, 0);glVertex3f(x - size, y + size, 0);glVertex3f(x - size, y - size, 0);glVertex3f(x + size, y - size, 0);glEnd();
}void myDisplay(void)
{glClear(GL_COLOR_BUFFER_BIT);     //通过预设的值清空色彩缓存区glColor3f(1.0,1.0,1.0);           //白色drawSquare(x,y);glutSwapBuffers();   //双缓冲技术中,交换两个缓冲区的指针glutPostRedisplay(); //更新画面}void init(){glClearColor(0.0, 0.0, 0.0, 1.0); //预设颜色缓冲区的值:红色、绿色、蓝色、alpha
}void myReshape(GLint w, GLint h){// 设置视区:x,y,width,height。其中,(x,y)表示视区矩形左下角的坐标,width分别表示视区矩形的宽度和高度glViewport(0,0,w,h);// 投影视图声明流程(一堆看不懂的)glMatrixMode(GL_PROJECTION);  // 将当前矩阵指定为投影矩阵glLoadIdentity();             // 然后把矩阵设为单位矩阵glOrtho(0,w,0,h,-1.0,1.0);    // 创建窗口大小的视景体/*创建视景体 glOrtho(left, right, bottom, top, near, far), left表示视景体左面的坐标,right表示右面的坐标,bottom表示下面的,top表示上面的,near前面,far后面。简单来说就是创建一个三维的小盒子,把物体放在小盒子的中心,小盒子的左下角对齐视区的左下角*/glMatrixMode(GL_MODELVIEW);   //GL_MODELVIEW 模型视图(没了这行会报错,不知道为什么)}void myMouse(GLint button, GLint state, GLint wx, GLint wy){// 逻辑AND运算符:&&/*第一个参数表明哪个鼠标键被按下或松开,这个变量可以是下面的三个值中的一个:GLUT_LEFT_BUTTONGLUT_MIDDLE_BUTTONGLUT_RIGHT_BUTTON*/ /*第二个参数表明,函数被调用发生时,鼠标的状态,也就是是被按下,或松开,可能取值如下:GLUT_DOWNGLUT_UP*/// 鼠标当前位置(wx,wy)if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)exit(0);if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){// 修改矩形中心的位置x = wx;y = wy;}}int main(int argc,char *argv[])
{glutInit(&argc,argv);                          //初始化glut  (可不写默认)glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);   //显示模式初始化 RGB显示模式,双缓冲模式glutInitWindowPosition(400, 400);              //窗口窗口位置  (可不写默认)glutInitWindowSize(500, 500);                  //窗口大小  (可不写默认)glutCreateWindow("click to display square");   //窗口名称init();                                        //自定义颜色缓冲区初始化glutDisplayFunc(&myDisplay);                   //自定义函数绘图glutReshapeFunc(&myReshape);glutMouseFunc(&myMouse);glutMainLoop();                                //消息循环相应return 0;
}

实验总结见源代码注释


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部