[OpenGL]第一个OpenGL程序

说起计算机图形编程,学过TC的都会想起来graphics.h吧,但是现在无论是PC游戏,还是移动端游戏中那些绚丽的换面仅仅凭借着TC那640*480的分辨率是做不到的。所以OpenGL作为当下主流的图形API之一,能在一些场景中具有比DirectX更优秀的特性。


为什么要学OpenGL,按照惯例,我们先来吹一波:
- 强大的可移植性:没错OpenGL除了适用于Windows,还适用于Linux/Unix等操作系统。在各个领域中都有应用。并且OpenGL的基本命令都做到了无关于平台以及硬件。
- 与C语言精密结合:OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。
- 高性能的图形渲染:OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。
总之OpenGL是个很强大的图形接口。


吹完之后,我们开始写我们第一个OpenGL程序,首先你要搭建环境,网上相关资料还是不少的,请自行查找。下面来看代码:

#include "stdafx.h"
#include<gl/glew.h>
#include <gl/freeglut.h>

#include<stdio.h>

static void RenderScreenColor()
{
    //清除缓冲区内视图
    glClear(GL_COLOR_BUFFER_BIT);
    //交换两个缓冲区指针
    glutSwapBuffers();
}
int _tmain(int argc, char* argv[])
{


    //初始化glut
    glutInit(&argc,argv);;

    //设置双缓存
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);

    glutInitWindowSize(800,600);
    glutInitWindowPosition(100,100);
    glutCreateWindow("Tutorial");


    GLenum res=glewInit();

    if(res!=GLEW_OK){
        fprintf(stderr,"Error:%s",glewGetErrorString(res));
        return 1;
    }

    //回调函数,显示时调用
    glutDisplayFunc(RenderScreenColor);

    //回调函数,用于空闲时绘图
    glutIdleFunc(RenderScreenColor);

    //清除屏幕颜色
    glClearColor(0.0f,1.0f,0.0f,0.0f);

    //开始仿真循环,在循环中逐帧渲染,窗口关闭时才会返回

    glutMainLoop();



    return 0;



}

这段代码的作用就是显示一个被渲染成绿色,窗体名为Tutorial的窗口。下面来对各行语句进行说明。


首先包含的头文件#include<gl/glew.h>
include <gl/freeglut.h>

这是GLUT的头文件,这用的时freeGLUT是GLUT的一个变种,GLUT已经不再更新。从上面的代码中我们可以看出OpenGL中的函数都是由gl开头的,那些glut开头的都来自GLUT(OpenGL Utility Toolkit)。
看main函数:
- glutInit,这个函数是对GLUT进行初始化的,这个函数必须在其他函数前调用一次。格式也比较唯一,一般就是glutInit(&argc,argv)。
- glutDisplayMode,设置显示方式,其中GLUT_DOUBLE表示使用双缓冲,与之对应的还有GLUT_SINGLE(单缓冲)。对于双缓冲和单缓冲可以自己Google一下,或者跳到后面,会有介绍。GLUT_RGB就表示使用RGB颜色喽。
- glutInitWindowSize,这里就是初始化窗口的大小
- glutInitWindowPosition,这个是初始化窗口的位置,和上面一样,比较简单。
- glutCreateWindow,根据前面设置的信息创建窗口。参数将被作为窗口的标题。注意:窗口被创建后,并不立即显示到屏幕上。需要调用glutMainLoop才能看到窗口。
- glutDisplayFunc,这是一个回调函数,其参数是一个函数指针,需要进行画图显示时,这个函数就会被调用
- glutMainLoop,可以理解为逐帧渲染屏幕,只有当窗体被关闭的时候才会返回。
- glClearColor,表示把清除颜色设为某种颜色,比如参数为(0.0f,0.0f,0.0f)就表示把颜色设置为黑色。


在glutDisplayFunc函数中,设置了当需要画图的时候调用RenderScreenColor函数。看一下里面的函数:
- glClear,表示调用当前缓冲区清除值,这里就是glClearColor设置的颜色。参数表示需要被清除的缓冲区。
- glutSwapBuffers,交换两个缓存区的指针


这里有必要介绍一下双缓冲:

我们知道在现实生活中的动画都是我们把关键帧画完然后再进行播放,但是在计算机中不同,计算机是画完一张用一张,当要用另一张的时候再画,但是当我们要进行十分复杂的画图操作的时候,可能就会有明显的闪烁或者卡顿现象了,解决这个问题就要用到双缓冲技术。
所谓的双缓冲技术,其实就是使用两个缓冲区,前台缓冲和后台缓冲。前台缓冲是我们看到的,后台缓冲则是再内存中的。每次的画图操作都是再后台缓冲中进行,然后复制到屏幕中。这样就不会因为频繁刷新而出现闪烁了。
在OpenGL中实现双缓冲的一种方式就如上面的代码一样:

  • 在调用glutInitDisplayMode函数时, 开启GLUT_DOUBLE。
  • . 调用glutDisplayFunc(display)注册回调函数时, 在回调函数中所有绘制操作完成后调用glutSwapBuffers()交换两个缓冲区指针。
  • 调用glutIdleFunc注册一个空闲时绘制操作函数, 注册的这个函数再调用display函数

其实刚开始学OpenGL的时候难免会觉的优点晦涩难懂,这也是不可避免的,其实编程就是这样,写多了之后就会发现其中的乐趣

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值