原文地址: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

OpenGL编程逐步深入(一)创建一个窗口的更多相关文章

  1. 【pygame游戏编程】第一篇-----创建一个窗口

    下面我们一起来创建一个背景为蓝色的窗口作为游戏编程的开始: import sys import pygame def creat_screen(): #初始化pygame pygame.init() ...

  2. OpenGL编程(一)渲染一个指定颜色的背景窗口

    上次已经搭好了OpenGL编程的环境.已经成功运行了第一个程序.可只是照搬书上的代码,并没弄懂其中的原理.这次通过一个小程序来解释使用GLUT库编写OpenGL程序的过程. 程序的入口 与其他程序一样 ...

  3. Linux OpenGL 实践篇-2 创建一个窗口

    OpenGL 作为一个图形接口,并没有包含窗口的相关内容,但OpenGL使用必须依赖窗口,即必须在窗口中绘制.这就要求我们必须了解一种窗口系统,但不同的操作系统提供的创建窗口的API都不相同,如果我们 ...

  4. pywin32 创建一个窗口

    import win32con,win32gui class MyWindow(): def __init__(self): #注册一个窗口类 wc = win32gui.WNDCLASS() wc. ...

  5. 《苹果开发之Cocoa编程》挑战2 创建一个数据源 练习

    <苹果开发之Cocoa编程>第4版 P87 创建一个to-do list应用程序,在文本框中输入任务.当用户单击Add按钮时,添加字符串到一个变长队列,新任务就出现在list的末尾. 关键 ...

  6. C语言创建一个窗口提示

    打开Vs2012[我的是2012] /* X下面这些东西并没有什么用... 就不改了用2013 2015都一样 当然 devC++ 还有最原始的那个vc6.0也都是可以的. 编译环境遇到了相关问题网上 ...

  7. Java 创建一个窗口,使其启动时位于屏幕中间

    import java.awt.Toolkit; import javax.swing.JFrame; public class WindowInTheMiddle extends JFrame { ...

  8. (7)nehe教程1 创建一个OpenGL窗口:

    不要用那个nehe ndk了 误人子弟! 转自: 一个窗口,代码可真多啊 http://www.yakergong.net/nehe/ 在这个教程里,我将教你在Windows环境中创建OpenGL程序 ...

  9. 我的Go语言学习之旅七:创建一个GUI窗口

    在上次中,刚刚学过了  弹窗效果.这里再接着学习一下怎样创建一个窗口. 还是老路子,先上代码: package main import ( "github.com/lxn/go-winapi ...

随机推荐

  1. 第一个JavaWeb工程

    这个工程主要用来研究log4j,所以就只有一个页面,希望以后慢慢进步. java动态生成网页主要使用servlet.把请求拦截下来,处理后返回结果. 这里创建的是一个maven工程. 结构如下:

  2. HDU——T 1507 Uncle Tom's Inherited Land*

    http://acm.hdu.edu.cn/showproblem.php?pid=1507 Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

  3. Qt之图形(简笔画-绘制卡通蚂蚁)

    简述 关于简笔画的介绍很多,有动物.水果.蔬菜.交通工具等,通常会对绘制一步步进行拆分.组合.然后绘制为我们想要的结果. 下面来介绍另外的一个种类:昆虫类-卡通蚂蚁. 简述 绘制 效果 源码 绘制 效 ...

  4. oracle树操作(select .. start with .. connect by .. prior)

    oracle中的递归查询能够使用:select .. start with .. connect by .. prior 以下将会讲述oracle中树形查询的经常使用方式.仅仅涉及到一张表. star ...

  5. 物理读之LRU(近期最少被使用)的深入解析

    转载请注明出处: http://blog.csdn.net/guoyjoe/article/details/38264883 一组LRU链表包含LRU主链.LRU辅助链.LRUW主链,LRUW辅助链, ...

  6. mysql-安全管理

    一.管理用户 用户账号和信息存放在数据库中 use mysql; select user form user; mysql数据库中包含一个user的表,它包含所有用户账号. user表中右移个名为us ...

  7. Clion远程开发

    2018.3 开始Clion可以支持远程开发了   官网教程如下: https://www.jetbrains.com/help/clion/remote-projects-support.html ...

  8. tomcat到底是干什么用的?用大白话讲一下

    通俗点说他是jsp网站的服务器之一,就像asp网站要用到微软的IIS服务器,php网站用apache服务器一样,因为你的jsp动态网站使用脚本语言等写的,需要有服务器来解释你的语言吧,服务器就是这个功 ...

  9. App开发Native.js入门指南

    概述 Native.js技术,简称NJS,是一种将手机操作系统的原生对象转义,映射为JS对象,在JS里编写原生代码的技术.如果说Node.js把js扩展到服务器世界,那么Native.js则把js扩展 ...

  10. Linux Shell脚本编程-基础2

    命令退出状态码  bash每个命令,执行状态都有返回值 0表示成功 非0表示失败(1-255) $?特殊变量可以打印出上一条命令的状态返回值 脚本的状态返回值是脚本执行的最后一条命令 自定义脚本状态返 ...