了解OpenGL之第一个OpenGL程序

  首先我们在使用OpenGL的时候,一般来说,在Windows操作系统之下进行开发的OpenGL代码一般应当包含以下的一些部分:


  首先,我们为了使用OpenGL创建图形,我们必须在视频屏幕上设置显示窗口(display window)。简单来说,这个显示窗口实际上就是一个屏幕上的简单矩形,而图形将在其中显示。
  因为OpenGL库中的为我们提供的函数是设备无关的函数,也就是说,我们根本无法使用OpenGL里的库函数来实现显示窗口的展示。
  但是有多个支持各种计算机上的OpenGL函数的窗口系统库,不同的系统分别有不同的接口。Mac系统则是可以使用Apple GL接口进行窗口管理操作,该库的函数名以agl为前缀。 对于Microsoft的Windows系统,WGL函数提供了/Windows到OpenGL的接口,这些函数以wgl位前缀。


一、头文件

   在windows下,我们想要展示显示窗口,那么存放WGL函数的头文件是windows.h。我们需要包含一个头文件来引入OpenGL基本库。但是需要注意的是windows.h头文件必须放在OpenGL头文件之前。因为它包含了OpenGL库的Microsoft版本所需要的宏。因此我们源文件的开头应该是:
#include <Windows.h>
#include <GL/gl.h>
#include <GL/glu.h>


   实际上,如果我们使用GLUT处理窗口管理操作,那么就不需要在引入gl.h和glu.h,因为GLUT保证了他们的正确引入。因此我们使用以下的头文件代替以上的头文件:
#include <Windows.h>
#include <GL/glut.h>


二、使用GLUT进行显示窗口管理

   我们从最简单的、最少的操作来显示一个图形开始。
  使用OpenGL使用库的第一步是进行初始化,首先需要初始化GLUT。该初始化函数也能处理任何命令行变量,完成GLUT初始化的函数语句如下:
glutInit(&argc, argv);


  紧接着,我们在显示窗口在创建的时候需要给定一个标题。这时候我们使用以下的语句实现:
glutCreateWindow("hello, my first OpenGL Program!");




  现在我们已经完成了基本框架的创建,那么下面我们将要制定显示窗口中需要显示什么内容。为此我们使用OpenGL函数创建一个图并将图的定义传递给GLUT的展示函数glutDisplayFunc,即将图赋给显示窗口。假设我们已经绘制了一条直线,那么现在我们将这条直线传递给窗口的函数:
glutDisplayFunc(lineSegment);


  但是现在图像并没有出现在屏幕上。现在知识仅仅的将这个图传递给屏幕,但是还没有进行渲染。为了完成渲染的工作,我们采用另一个GLUT函数完成:
glutMainLoop();


  该函数执行之后,所有已经创建的显示窗口连同其中的图形将被激活,将会一起被渲染到桌面上。
  注意,这个函数必须是程序之中的最后一个。他显示初始图像程序并使程序进入检查鼠标或者键盘等设备输入的无穷循环之中。


  尽管我们创建的显示窗口有默认的位置和大小,我们还是能够通过使用GLUT函数来设定这些参数。其中这些参数的远点坐标是屏幕的左上角:
glutInitWindowPosition(50, 100);
glutInitWindowSize(400, 300);


  我们还能通过使用glutInitDisplayMode函数来设定显示窗口的缓存和颜色模型等选项。


glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

三、代码以及运行效果

  以下是完整的代码:
/**
* @author:Mica_Dai
* @modify:2017.10.17
* @platform:MS VS2017
*/
#include <Windows.h>
#include <GL/glut.h>

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

void lineSegment(void) {
    glClear(GL_COLOR_BUFFER_BIT);   
    glColor3f(0.0, 0.4, 0.2);
    glBegin(GL_LINES);
    glVertex2i(180, 15);
    glVertex2i(10, 145);
    glEnd();
    glFlush();
}

int main(int argc, char *argv[]) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(50, 100);
    glutInitWindowSize(400, 300);
    glutCreateWindow("hello, my first OpenGL Program!");
    init();
    glutDisplayFunc(lineSegment);
    glutMainLoop();
    return 0;
}


  以下是上述代码的执行结果:

no


  以上!
发布了24 篇原创文章 · 获赞 32 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_36752072/article/details/78267643