• OpenGL编程逐步深入(一)创建一个窗口


    原文地址:http://ogldev.atspace.co.uk/
    原文中使用gnu make进行项目管理,本系列文章使用visual studio2012。在翻译过程中并非直译,加入了一些笔者个人观点。

    OpenGl官方使用规范中并没有提供创建和操作窗口的API,目前像window、linux等支持图形化界面的操作系统都支持OpenGl,提供一个与OpenGl上下文绑定的窗口系统。例如在X window中可以使用GLX创建窗口,Windows平台和MacOS平台则可以分别使用WGL、CGL。直接使用这些接口创建窗口并显示图形是非常繁琐的,通常第三方库来创建图形应用,在此系列文章中我们使用的是GLUT(OpenGl utility libray),它提供的API能够很方便的进行窗口管理、事件处理、输入输出控制等。另外GLUT的跨平台特性使得程序具有更好的移植性。

    准备工作

    freeglut为开源库,采用cmake进行项目管理,读者需要自己编译获得库文件,笔者將所需要的资源文件和库都整理好了。
    下载地址:
    http://download.csdn.net/detail/rongbo_j/8578357
    http://download.csdn.net/detail/rongbo_j/8578385
    http://download.csdn.net/detail/rongbo_j/8578405

    新建项目

    1.新建控制台应用程序,將项目所需的库文件和资源拷贝到解决方案根目录下。
    这里写图片描述
    2.在项目上点击右键,打开属性页在vc++目录中的包含目录中添加$(SolutionDir)Include路径;在库目录中添加$(SolutionDir)Lib路径。在链接器->输入->附加依赖项中添加freeglut.lib。

    这里写图片描述

    创建窗口

    /*
    
        Copyright 2010 Etay Meiri
    
        This program is free software: you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation, either version 3 of the License, or
        (at your option) any later version.
    
        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.
    
        You should have received a copy of the GNU General Public License
        along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
        Tutorial 01 - Hello Window!
    */
    #include "stdafx.h"
    #include <GL/freeglut.h>
    
    static void RenderSceneCB()
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glutSwapBuffers();
    }
    
    static void InitializeGlutCallbacks()
    {
        glutDisplayFunc(RenderSceneCB);
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        //初始化glut
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
        //设置窗口尺寸
        glutInitWindowSize(1024, 768);
        //设置窗口位置
        glutInitWindowPosition(100, 100);
        //创建窗口并显示,标题为Tutorial 01
        glutCreateWindow("Tutorial 01");
    
        InitializeGlutCallbacks();
    
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    
        glutMainLoop();
    
        return 0;
    }

    代码解读:

    glutInit(&argc, argv);

    该函数用于初始化GLUT,可以通过控制台命令行向glut传递参数,调试程序时可以输入’-gldebug’参数,还可以用来控制GLUT的一些属性,例如’-sync’。

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);

    通过这个函数我们可以配置GLUT的一些选项,GLUT_DOUBLE表示使用双缓存机制(上一帧图形显示时,下一帧图形先在缓存区中绘制), GLUT_RGBA指定使用RGBA模式的窗口。

    glutInitWindowSize(1024, 768); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow("Tutorial 01");

    这一组函数用于说明窗口创建的参数,分别指定窗口的尺寸,位置,标题。

    glutDisplayFunc(RenderSceneCB);

    由于工作在窗口系统中,大部分和程序的交互都是通过事件回调函数来完成。GLUT较为注重和底层窗口系统交互,并为我们提供了一些回调的选择,在这里我们仅仅使用一个主回调方法来完成所以的渲染工作。

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    在这里我们将会第一次接触OpenGl状态的概念。渲染是一项非常复杂的任务,无法通过调用函数,多接收几个参数就能完成,还要指定着色器,缓冲区和一些相关的标志位。而且,有时候多个渲染操作需要保持相同的配置。这就是为什么大多数渲染操作的配置都是通过设置OpenGl状态机中标志位的值来完成的原因。在调用改变状态的函数之后,一些相关配置的值保持不变,直到下一次调用改变该配置值的函数。
    此函数设置的颜色会在清除帧缓存时使用,该颜色有四个通道(RGBA),值必须在0.0和1.0之间。

    glutMainLoop();

    调用该函数开始GLUT内部循环,监听Windows系统事件,调用用户指定的回调函数。在本案例中,我们通过glutDisplayFunc注册了RenderSceneCB函数进行渲染。

    glClear(GL_COLOR_BUFFER_BIT); 
    glutSwapBuffers();

    在渲染函数中我们所做的仅仅是调用glClear函数清除帧缓存(使用glClearColor指定的颜色),glutSwapBuffers函数用于交互前台缓存区和后台缓存区,在下一轮渲染回调中后台缓存区中的图形会在屏幕中显示出来。

    编译运行

    编译运行程序发现一个黑色背景的窗口创建成功。

    这里写图片描述

    程序源码下载:
    http://download.csdn.net/detail/rongbo_j/8579603

  • 相关阅读:
    leetcode ——187. 重复的DNA序列
    leetcode——30. 串联所有单词的子串
    leetcode——520. 检测大写字母
    leetcode——686. 重复叠加字符串匹配
    leetcode——459. 重复的子字符串
    leetcode——28. 实现 strStr()
    leetcode——17. 电话号码的字母组合
    leetcode——14. 最长公共前缀
    NAT模式实现局域网物理机与虚拟机的互通访问
    .Net Core项目发布到虚拟机(三)
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6469027.html
Copyright © 2020-2023  润新知