第一个OpenGL程序之绘制一个红色矩形

用OpenGL绘制一个红色矩形

实现思路:

利用OPENGL实现图形绘制

1、头文件包含
因为OPENGL没有包含窗口系统,所以需要通过头文件引入窗口系统

#include <Windows.h>    //in windows operation system
//#include <gl/GL.h>  
//#include <gl/GLU.h>     
//can use #include <gl/glut.h> to replace the two lines above as follows
#include <gl/glut.h> 

2、使用GLUT库实现窗口管理

glutInit(&argc, argv);   //init glut

1)创建窗口之前使用该函数设定窗口的显示模式,包括缓存和颜色模型

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);   //使用单缓存和RGB颜色模型

2)创建窗口时,系统可使用默认值设定显示窗口的大小和位置,也可通过如下方式实现自定义

    glutInitWindowSize(400, 300);
    glutInitWindowPosition(100,120);

3)创建窗口

glutCreateWindow("窗口名");   

4)定义窗口显示的内容 显示窗口的图形因为屏幕的刷新而不断地被重绘

 glutDisplayFunc(Display);  

//glutDisplayFunc指定了Display函数作为每次窗口重绘时调用的函数,因此也将Display函数称为显示回调函数

5)使得窗口框架运行起来,使设置的显示回调函数开始工作,直到用户终止程序为止

    glutMainLoop();

3、使用OpenGL绘图
1)指定窗口的背景颜色,下面指定窗口的背景色为白色。

  glClearColor(1.0f,1.0f,1.0f,1.0f); 

//前三个变量指定颜色的红绿蓝三个颜色分量,最后一个参数是颜色的Alpha成分,用于指定颜色混合后的特殊效果,如 半透明效果。
//当该参数(最后一个参数)被激活时,Alpha值为0.0表示对象是完全透明的,1.0表示对象是完全不透明的。由于没有使用混合参数,所以这个值不起作用,可以简单的设为1.0

2)用glClearColor函数中的指定的值设定为颜色缓存中的值

   glClear(GL_COLOR_BUFFER_BIT);  //即将窗口中每个像素的颜色设为背景颜色

3)除了设定背景颜色,还可以使用glColor()函数设定绘制图形的颜色,其参数与glClearColor()相似

4)绘制图形前需要一个投影过程将三维图形投影到显示窗口中,下面语句设定投影参数

    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0.0, 200.0, 0.0, 150.0);//指定使用正投影将x(0,200)y(0,150)这样一个矩形坐标区域投影到窗口内

5)利用函数绘制矩形

   glRectf(50.0f, 100.0f, 150.0f, 50.0f);    //绘制一个左上角在(50,100)右下角在(150,50)的矩形

将这三个过程组合起来,将所有的初始化过程及只需要调用一次的函数放在函数Initial()中,将图形绘制过程放在Display()中

完整的程序:

#include <Windows.h>
#include <gl/glut.h>

void Initial(void)
{
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0.0f, 200.0f, 0.0f, 150.0f);
}

void Display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0f,0.0f,0.0f);       //设定绘制图形的颜色
    glRectf(50.0f,100.0f,150.0f,50.0f);
    glFlush();   //用于清空OPENGL命令缓冲区,强制执行命令缓冲区中所有的OPENGL函数
}

int main(int argc , char* argv[])
{
    glutInit(&argc , argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(400, 300);
    glutInitWindowPosition(100, 120);
    glutCreateWindow("redRect");             //要放到glutDisplayFunc(Display)的前面
    glutDisplayFunc(Display);
    Initial();
    glutMainLoop();
    return 0;
}

遇到的问题描述:

自己遇到了一个问题,就是将 glutCreateWindow(“redRect”); 放到了glutDisplayFunc(Display); 后面,
然后就导致了这样的异常
在这里插入图片描述

原因分析:

其实这个是个很小的问题,只要细致一点就不会出错,绘制函数自然要放到窗口创建之后才合适

解决方案:

调换过来即可

程序的运行效果如下:

在这里插入图片描述

总结:

自己通过学习案例,终于写出了第一个OpenGL程序,真的很开心,也希望能给新学这个的人有一些微小的帮助,存在着许多不足,希望大家批评指正,感谢大家的阅读。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值