【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;
}
实验总结见源代码注释
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
