《计算机图形学》学习笔记
直接贴代码
/* * * * * * * * * * * * * * *
* @Author : Elan L
* @LastEditTime : 2022-05-03 22:06:31
* * * * * * * * * * * * * * */
#include "glut.h"
//设置渲染状态
void SetupRC(void)
{
//将清除颜色设置为蓝色,最后一个参数是alpha,理解为透明度
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}
//当窗口改变大小时有glut函数库调用
// w和h是当前应用程序窗口的宽和高
void ChangeSize(int w, int h)
{
GLfloat aspectratio;
if (h == 0)
h = 1; //防止divide by zero
//把视口设置为窗口的大小
/*
*接收4个参数,
前2个参数指定了窗口内部视口的左下角,通常都是0,
width和height参数指定了视口的大小(以像素为单位,视口=等于窗口内的渲染区域
*/
glViewport(0, 0, w, h);
/*
*重置坐标系统
glOrtho()函数并不建立裁剪区域,只是修改裁剪区域,如果没有该重置
在glOrtho()函数被调用之后,将会导致目标裁剪区域被破坏,甚至导致矩形无法显示
*/
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//使正方形时刻保持正方
//建立裁剪区域(左右下上近远)
aspectratio = (GLfloat)w / (GLfloat)h;
if (w <= h)
/*
*创建正投影
void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
left和right值指定了沿x轴的最小坐标值和最大坐标值
bottom和top指定了沿y轴的最小坐标值和最大坐标值,
near和far指定了沿z轴的最小坐标值和最大坐标值,负数表示沿着观察者的负方向远去
*/
glOrtho(-100.0, 100.0, -100.0 / aspectratio, 100.0 / aspectratio, -100, 100);
else
glOrtho(-100.0 * aspectratio, 100.0 * aspectratio, -100.0, 100.0, -100, 100);
//这两行代码高速opengl,以后所有的变换都将影响这个模型
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void RenderScene(void)
{
//用当前颜色清除窗口
glClear(GL_COLOR_BUFFER_BIT);
//把绘图颜色设置为红色,不需要要指定alpha参数,默认1.0表示完全不透明
glColor3f(1.0f, 0.0f, 0.0f);
//用当前颜色绘制一个填充矩形
/*
*该函数接受4个浮点类型的参数,表示了两个坐标对(x1, y1) (x2, y2);
void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
第一对坐标表示矩形的左上角,第二对坐标表示矩形的右下角
openGL通用回调函数 ChangeSize()把这些坐标映射到实际的窗口坐标,
该回调函数每当窗口大小改变(拉伸、最大化)时,就会被调用
*/
glRectf(-25.0f, 25.0f, 25.0f, -25.0f);
//刷新绘图命令
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); // RGB模式,单缓冲,另一种是双缓冲
glutInitWindowPosition(400, 200);
glutInitWindowSize(800, 800);
glutCreateWindow("第一次OpenGL作业"); //参数是窗口标题
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
SetupRC();
//这个函数在程序中只能调用一次,直到程序终止才返回
//处理所有操作系统特听的消息,击键等事件
glutMainLoop();
return 0;
}
运行结果
改变窗口大小