1. 使用glut库画一个矩形(详细注释)

《计算机图形学》学习笔记


直接贴代码

/*  *  *  *  *  *  *  *  *  *  *  *  *  *  *
 * @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;
}

运行结果
在这里插入图片描述
改变窗口大小
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值