OpenGL简介

OpenGL是图形硬件的一种软件接口。它被设计为硬件独立的接口,可用于多种不同硬件平台。OpenGL程序也可以在网络(客户端-服务器端模式)上工作,即使客户端与服务器端为不同类别的计算机。OpenGL的客户端为OpenGL程序实际运行的计算机,服务器为执行绘图操作的计算机。

OpenGL使用gl作为OpenGL核心命令的的前缀,glu作为OpenGL通用库的前缀。类似地,OpenGL常量以GL_开头,且全部使用大小字母。OpenGL也使用后缀指定传递给OpenGL的参数数量与数据类型。

glColor3f(1, 0, 0);           // 使用3个浮点数据设置显示颜色为红色
glColor4d(0, 1, 0, 0.2); // 设置颜色为带有20%不透明度的绿色(double)
glVertex3fv(vertex); // 使用指针设置x-y-z坐标值

状态机

OpenGL是一个状态机。OpenGL的模式与属性都在下次更改之前一直有效。绝大部分状态变量可以通过glEnable()与glDisable()开启与关闭。你也可以使用glIsEnabled()检测一个状态当前是否被开启或关闭。通过glPushAttrib()或glPopAttrib(),你可以保存一组状态到属性栈,或从属性栈中恢复。GL_ALL_ATTRIB_BITS参数用于保存/恢复所有状态。标准OpenGL中必须至少有16个栈。(使用glinfo检测栈的最大数量。)

glPushAttrib(GL_LIGHTING_BIT);    // 更改状态的简单方式
glDisable(GL_LIGHTING); // 因为在调用glPopAttrib()之后能够正好恢复上一次状态
glEnable(GL_COLOR_MATERIAL);
glPushAttrib(GL_COLOR_BUFFER_BIT);
glDisable(GL_DITHER);
glEnable(GL_BLEND); ... // 其他 glPopAttrib(); // 恢复GL_COLOR_BUFFER_BIT
glPopAttrib(); // 恢复GL_LIGHTING_BIT

glBegin()与glEnd()

为了在OpenGL中绘制几何图元(点、线、三角形等),你可以在glBegin()与glEnd()中指定定点数据列表。该方式为立即模式。(你可以使用其他方式绘制几何图元,如顶点列表。)

glBegin(GL_TRIANGLES);
glColor3f(1, 0, 0); // 设置颜色为红色
glVertex3fv(v1); // 使用v1、v2、v3绘制三角形
glVertex3fv(v2);
glVertex3fv(v3);
glEnd();

OpenGL中有10中图元:GL_POINTS、GL_LINES、GL_LINE_STRIP、GL_LINE_LOOP、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN、GL_QUADS、GL_QUAD_STRIP与GL_POLYGON。

注意,并不是所有OpenGL命令都能够放在glBegin()与glEnd()中。仅仅能够使用这些命令的一小部分:glVertex*()、glColor*()、glNormal*()、glTexCoord*()、glMaterial*()、glCallList()等。

glFlush()与glFinish()

类似IO缓冲操作,OpenGL命令并不是立即执行的。所有命令首先存放在缓存中,包括网络缓存与显卡加速器本身,并且在缓存未满之前一直等待执行。例如,如果应用程序在网络上运行,以单个数据包形式发送命令集合比每次在网络中发送一条命令更高效。

glFlush()清空缓存中所有命令,并且强制所有挂起命令立即执行而不必等待缓存满。因此,glFlush()确保在调用glFlush()后的有限时间内执行所有调用点之前的OpenGL命令。glFlush()并不等待先前命令执行完成,且立即返回到主程序。因此,即使先前发送的命令并未执行完成,你也可以自由发送更多命令。

glFinish()与glFlush()类似,清空缓存区且强制开始执行命令。不同的是,glFinish()阻塞其他OpenGL命令,且等待所有执行结束。因此,glFinish()在先前调用的命令完成之前并不会返回到主程序中。它可用于同步任务,或用于测量特定OpenGL命令的执行时间。

原文地址:http://www.songho.ca/opengl/gl_overview.html

OpenGL概述的更多相关文章

  1. [OpenGL红宝书]第一章 OpenGL概述

    第一章 OpenGL概述 标签(空格分隔): OpenGL 第一章 OpenGL概述 1 什么是OpenGL 2 初识OpenGL程序 3 OpenGL语法 4 OpenGL渲染管线 41 准备向Op ...

  2. 【转】OpenGL概述

    英文原文 中文译文 1. 计算机图像硬件 1.1 GPU(图像处理单元) 如今,计算机拥有用来专门做图像处理显示的GPU模块,拥有独立的图像处理储存(显存). 1.2 像素和画面 任何图像显示都是基于 ...

  3. [OpenGL]VS2010配置OpenGL开发环境

    opengl概述 OpenGL(Open Graphics Library)是一个跨编程语言.跨平台的专业图形程序接口. OpenGL是SGI公司开发的一套计算机图形处理系统,是图形硬件的软件接口,任 ...

  4. [转]CUDA和OpenGL互操作的实现及分析

    CUDA和OpenGL互操作的实现及分析刘进锋.郭雷(西北工业大学 自动化学院,陕西西安710129) 1 CUDA与OpenGL概述 OpenGL是图形硬件的软件接口,它是在SGI等多家世界著名的计 ...

  5. openGL学习进程(1)OpenGL的简介

        通过本节,我们来简要了解一下openGL.     (1)OpenGL概述: openGL(Open Graphics Library)是个专业的图形程序接口,定义了一个跨编程语言.跨平台的编 ...

  6. OpenGL官方教程——着色器语言概述

    OpenGL官方教程——着色器语言概述 OpenGL官方教程——着色器语言概述 可编程图形硬件管线(流水线) 可编程顶点处理器 可编程几何处理器 可编程片元处理器 语言 可编程图形硬件管线(流水线) ...

  7. 【转】OPENGL基本API概述

    本文信息资源来源于网络,欢迎转载!转载时请保留本文链接(http://www.shopliyang.com.cn/)! OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库. gl是核 ...

  8. OpenGL实现通用GPU计算概述

    可能比較早一点做GPU计算的开发者会对OpenGL做通用GPU计算,随着GPU计算技术的兴起,越来越多的技术出现,比方OpenCL.CUDA.OpenAcc等,这些都是专门用来做并行计算的标准或者说接 ...

  9. 【OpenGL】Shader概述

    目录(?)[-] 综述 编译一个Shader 链接一个Shader 删除一个Shader 指定使用一个Shader Program 删除一个Shader Program 备注 这篇文章讲述了Shade ...

随机推荐

  1. windows下开启mysql远程访问

    USE mysql;SELECT * FROM USER ; 直接修改user=root host=127.0.0.1为% FLUSH PRIVILEGES;

  2. 用Js+css3实现图片旋转,缩放,裁剪,滤镜

    还是前端图片的老话题,花了半天时间,东拼西凑,凑出个demo,优点在于代码少,核心代码就6行,目前刚做了旋转,缩放,裁剪,滤镜要js做,网络上也有现成的代码, 但是想做到自定义的滤镜咋办呢?这还要从底 ...

  3. Linux下安装国际版QQ (转)

    原文链接:http://www.linuxidc.com/Linux/2016-09/134923.htm 说明:一开始,我在Ubuntu 16.04下安装的QQ版本是Wineqq2013SP6-20 ...

  4. ssm(spring,springmvc,mybatis)

    1.配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version=&qu ...

  5. MySQL数据库管理用户权限

    http://blog.itpub.net/7607759/viewspace-675079/ 2.2 授予权限 前面提到了grant命令,grant的语法看起来可是相当复杂的呐: GRANT pri ...

  6. 读<jquery 权威指南>[2]-事件

    1.  事件冒泡 阻止事件冒泡的两种方式: event.stopPropagation(); return false ; 2. 绑定事件——bind(type,[data],function) ty ...

  7. Android开发--ScrollView的应用

    1.简介 当内容无法全部显示时,需要采取滚动的方式获取其与内容.其中,ScrollView为垂直滚动控件,HorizontalScrollView为水平滚动控件. 2.构建

  8. [Jquery]某宝图片轮播(无缝、带左右切换按钮)

    [效果] 左右移动(非渐隐) [思路] 1.结构与样式 ①最外层div盒子当容器,里面ul宽度无限大并且相对定位(到时候移动其实移的是ul的left) ②按钮的透明度可用background:rgba ...

  9. Servlet路径跳转2--在servlet当中,跳转到某网页时的路径写法

    课程1-13   http://www.imooc.com/video/5554 Servlet路径跳转: 绝对路径:放在任何地方都对的路径 相对路径:相对于当前资源的路径 两种方法:请求重定向,服务 ...

  10. 6、android 网络编程

    1.基于socket的用法 服务器端: 先启动一个服务器端的socket     ServerSocket svr = new ServerSocket(8989); 开始侦听请求 Socket s  ...