配置开发环境
本文用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初识
main.cpp
#include <glut.h>
void myDisplay(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0); //预设颜色缓冲区的值:红色、绿色、蓝色、alpha
glClear(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 <glut.h>
#include <stdlib.h>
// 四字节精度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_BUTTON
GLUT_MIDDLE_BUTTON
GLUT_RIGHT_BUTTON
*/
/*
第二个参数表明,函数被调用发生时,鼠标的状态,也就是是被按下,或松开,可能取值如下:
GLUT_DOWN
GLUT_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;
}
实验总结见源代码注释