一、搭建OpenGL 画画框架
- 3D场景初始化
(1) 代码
void Init()
{
glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影矩阵,对投影矩阵操作
gluPerspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f);//创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵
glMatrixMode(GL_MODELVIEW); //将当前矩阵指定为模型视图矩阵,对模型视图矩阵操作
glLoadIdentity(); //把矩阵设为单位矩阵
}
(2)相关函数介绍
a. glMatrixMode 指定矩阵模式
glMatrixMode()命令将当前矩阵设置成参数所指定的模式,以满足不同绘图所需执行的矩阵变换。一般而言:
在需要绘制出对象或要对所绘制对象进行几何变换时,需要将变换矩阵设置成模型视图模式;
而当需要对绘制的对象设置某种投影方式时,则需要将变换矩阵设置成投影模式;
只有在进行纹理映射时,才需要将变换矩阵设置成纹理模式。
与glLoadIdentity()一同使用,glLoadIdentity()功能是重置当前指定的矩阵为单位矩阵。
void glMatrixMode(GLenum mode)
mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标,可选值:
GL_MODELVIEW:对模型视图矩阵堆栈应用随后的矩阵操作。可以在执行此命令后,输出自己的物体图形了。
GL_PROJECTION:对投影矩阵堆栈应用随后的矩阵操作。可以在执行此命令后,为我们的场景增加透视。
GL_TEXTURE:对纹理矩阵堆栈应用随后的矩阵操作。可以在执行此命令后,为我们的图形增加纹理贴图。
b. gluPerspective 创建透视投影矩阵
OpenGL支持两种类型的投影变换,即透视投影和正交投影。
void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar);
创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵。
参数fovy定义视野在Y-Z平面的角度,范围是[0.0, 180.0];
参数aspect是投影平面宽度与高度的比率;
参数Near和Far分别是近远裁剪面到视点(沿Z负轴)的距离,它们总为正值。
2. 绘制一个三角形
(1)代码
void Draw()
{
glClearColor(1, 1, 1, 1.0f); //白色背景
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES); //注意是逆时针绘制
glColor4ub(0, 0, 255, 255); //蓝
glVertex3f(-0.2f, -0.2f, -1.5f);
glColor4ub(255, 0, 0, 255); //红
glVertex3f(0.2f, -0.2f, -1.5f);
glColor4ub(0, 255, 0, 255); //绿
glVertex3f(0.0f, 0.2f, -1.5f);
glEnd();
}
注意:绘制完成三角形之后,需要SwapBuffers交换缓冲区,否则画面绘制不出三角形。
//...
//防止窗口一闪而过
MSG msg;
while (true)
{
if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
{
if (msg.message == WM_QUIT)
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//实时绘制
Draw();
SwapBuffers(dc); //交换缓冲区
}
//...
(2)绘制效果
默认情况下 OpenGL 会绘制正面及背面两面。 点的正面方向是逆时针方向的 , 因此绘制的时候 , 默认是逆时针绘制 , 即第一个点连接第二个点 , 第二个点连接第三个点 , 第三个点连接第一个点 , 这样绘制。
正面就是摄像机对着的那一面,即:我们人眼看时呈逆时针绘制的那一面。
绘制三角形面时 , 在 glBegin 方法中传入 GL_TRIANGLES 参数 , 然后在 glBegin 和 glEnd 之间设置多个点 , OpenGL 会自动将三个点组成一个三角形面 , 绘制出来 。其中每个点都可以设置一个颜色值 , 面上的颜色都是通过三个点的颜色差值出来的。
(3)相关函数介绍
a. glClearColor
指定刷新颜色缓冲区时所用的颜色。注意:glClearColor只起到Set的作用,并不Clear。所以要和glClear联合使用。
b. glClear
清除缓冲区颜色,并设置为预设值。有四个参数:
GL_COLOR_BUFFER_BIT | 当前为颜色写入启用的缓冲区。 |
GL_DEPTH_BUFFER_BIT | 深度缓冲区。 |
GL_ACCUM_BUFFER_BIT | 累积缓冲区。 |
GL_STENCIL_BUFFER_BIT | 模具缓冲区。 |
3.参考文档
OpenGL 简介 - Win32 apps | Microsoft Learn
OpenGL之glMatrixMode函数的用法_草上爬的博客-CSDN博客_glmatrixmode
OpenGL中涉及到的矩阵变换_-yanhui-的博客-CSDN博客_opengl变换矩阵
opengl常用头文件 - IceArrow - 博客园 (cnblogs.com)