Chinaunix首页 | 论坛 | 博客
  • 博客访问: 313862
  • 博文数量: 72
  • 博客积分: 3111
  • 博客等级: 中校
  • 技术积分: 668
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-30 15:45
个人简介

朝着心的方向前进

文章分类

全部博文(72)

文章存档

2014年(5)

2013年(1)

2012年(1)

2011年(1)

2010年(24)

2009年(40)

我的朋友

分类: WINDOWS

2009-11-18 14:22:43

OpenGL基本知识

OpenGL概述
OpenGL(全写Open Graphics Library)是近几年发展起来的一个性能卓越的三维图形标准,它是在SGI等多家世界闻名的计算机公司的倡导下,以SGIGL三维图形库为基础制定的一个通用共享的开放式三维图形标准,定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。

硬件无关,具有很强的移植性

OpenGL是个与硬件无关的软件接口,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用。由于OpenGL是图形的底层图形库,没有提供几何实体图元,不能直接用以描述场景。但是,通过一些转换程序,可以很方便地将AutoCAD、3DS/3DSMAX等3D图形设计软件制作的DXF和3DS模型文件转换成OpenGL的顶点数组。

以OpenGL为基础的衍生

在OpenGL的基础上有Open Inventor、Cosmo3D、Optimizer等多种高级图形库,适应不同应用。其中,Open Inventor应用最为广泛。该软件是基于OpenGL面向对象的工具包,提供创建交互式3D图形应用程序的对象和方法,提供了预定义的对象和用于交互的事件处理模块,创建和编辑3D场景的高级应用程序单元,有打印对象和用其它图形格式交换数据的能力。

历程

19927月,SGI公司发布了OpenGL1.0版本

1995OpenGL1.1版本面市,该版本较1.0性能提高许多,并加入了一些新的功能。包括提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。

2003年的728日,SGIARB公布了OpenGL 1.5OpenGL 1.5中包括OpenGL ARB的正式扩展规格绘制语言“OpenGL Shading Language”。OpenGL 1.5的新功包括:顶点Buffer ObjectShadow功能、隐蔽查询、非乘方纹理等

20048月,OpenGL2.0版本发布~OpenGL 2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3Dlabsopengl2.0支持OpenGL Shading Language、新的shader扩展特性以及其他多项增强特性。

20088月初Khronos工作组在Siggraph 2008大会上宣布了OpenGL 3.0图形接口规范,增加了新版本的shader语言GLSL 1.30
20093月又公布了升级版新规范OpenGL 3.1,也是这套跨平台免费API有史以来的第九次更新。OpenGL 3.1将此前引入的OpenGL着色语言“GLSL”从1.30版升级到了1.40版,通过改进程序增强了对最新可编程图形硬件的访问,还有更高效的顶点处理、扩展的纹理功能、更弹性的缓冲管理等等。宽泛地讲,OpenGL 3.13.0版的基础上对整个API模型体系进行了简化,可大幅提高软件开发效率。

20098Khronos小组发布了OpenGL 3.2,这是一年以来OpenGL进行的第三次重要升级。该版本仍然延续了OpenGL发展的方向让图形程序开发者能在多种操作系统和平台下更好的利用新的GPU功能。OpenGL3.2版本提升了性能表现、改进了视觉质量、提高了几何图形处理速度,而且使Direct3D程序更容易移植为OpenGL。除OpenGL之外,Khronos还将其开发的其它标准进行了协调改进,以求可以在更广泛的领域提供强大的图形功能和计算生态系统,这些标准包括用于并行计算的OpenCL、用于移动3D图形开发的OpenGL ES和用于网络3D开发的WebGL

OpenGL特点及功能

  OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以与Visual C++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;OpenGL使用简便,效率高。它具有七大功能:
  1.建模:OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。
  2.变换:OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换。其变换方法有利于减少算法的运行时间,提高三维图形的显示速度。
  3.颜色模式设置:OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Index)。
  4.光照和材质设置:OpenGL光有辐射光(Emitted Light)、环境光(Ambient Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。
  5:纹理映射(Texture Mapping)。利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。
  6:位图显示和图象增强图象功能除了基本的拷贝和像素读写外,还提供融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图象效果处理。以上三条可使被仿真物更具真实感,增强图形显示的效果。
  7:双缓存动画(Double Buffering)双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。
此外,利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion Blur)等特殊效果。从而实现了消隐算法。

Open GL现状
  
  Open GL仍然是唯一能够取代微软对3D图形技术的完全控制的API。具有很强的生命力,Direct3D目前还不能支持高端的图形设备和专业应用;Open GL在这些领域占据着统治地位。最后,开放源码社区(尤其是Mesa项目)一直致力于为任何类型的计算机(无论它们是否使用微软的操作系统)提供Open GL支持。

Linux操作系统平台的大力推广,基于Linux的各种应用软件也不断壮大,因此基于跨平台图形库的跨平台三维游戏开发也越来越受重视。OpenGL(open graphics library)是一种独立的平台无关的三维图形开发库,在各种语言下进行主框架开发并结合应用OpenGL函数都可以开发出三维游戏。但是由于框架开发的平台相关性使游戏无法跨平台编译运行,因此glutOpenGL的方式成了一种很好的选择。但是在对复杂框架和各种媒体的支持方面,glut并不理想。在Linux下可以采用FLTK等框架平台技术实现包括按钮在内的比较复杂的框架功能,但是需要专门的Linux开发环境,众多的Window环境下的KDE爱好者明显对此无法适从。

OpenGL 3.1公布后,业界图形厂商很快予以了大力支持。AMD OpenGL主管Suki Samra表示:“AMD全面用户OpenGL API,会在今后的RadeonFirePro产品驱动程序中支持OpenGL 3.1。”NVIDIA市场营销副总裁Dan Vivoli表示:“NVIDIA承诺尽快部署OpenGL 3.1,我们也很自豪地在规范公布同一天放出了自己的测试版驱动程序。”
  市场调研机构Jon Peddie Research预测,OpenGL 3.1规范图形硬件的安装规模将超过1亿。AMDNVIDIAS3 Graphics的显卡驱动目前都已经支持OpenGL 3.0

VC6.0做一个Demo演示
首先新建一个空工程Win32 Console Application,

添加一个源文件,复制以下代码
// GLOS.H
//////////////////////////////////////////////////////////
// This is an OS specific header file
//判别操作系统的基本头文件

#include "windows.h"

// disable data conversion warnings

#pragma warning(disable : 4244)     // MIPS
#pragma warning(disable : 4136)     // X86
#pragma warning(disable : 4051)     // ALPHA
//////////////////////////////////////////////////////////
//opengl.cpp
//主程序
//#include "windows.h"
#include
#include
//#include "windows.h"

void main(void)
{
        /*初始化:*/
    auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
        //窗口显示单缓存和RGB(彩色)模式
        auxInitPosition(0,0,1000,1000);
        //大小x=1000 y=1000(0,0)是屏幕左上点
        auxInitWindow("sample1");
        //窗口初始化,参数是标题
        glClearColor(0.0,0.0,0.0,0.0);
    //将窗口清为黑色
        glClear(GL_COLOR_BUFFER_BIT);
    //将颜色缓存清为glClearColor命令所设置的颜色
        //即背景色

        /*绘图*/
        glColor3f(1.0,1.0,0.0);
        //选颜色(R,G,B),参数0        glRectf(-0.5,-0.5,0.5,0.5);
        //glRectanglef(-0.5,-0.5,0.5,0.5);
        //画个方块

        glFlush();
        //强制绘图,不驻留缓存
        _sleep(1000);
        //windows函数,显示1秒(单位是毫秒)
}
project--settings...--link卡中,在object/library module中加入  opengl32.lib glu32.lib glaux.lib ,中间用空格隔开

编译运行
结果如下

参考:
百度百科OpenGL
蓝色忧郁's Blog:http://blog.ednchina.com/yoyowind/117392/message.aspx

阅读(1618) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~