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. [Oracle] SQL*Loader 详细使用教程(4)- 字段列表

    在上一篇中我们介绍了SQL*Loader中最重要的文件——控制文件,而本篇要介绍控制文件中最重要的部分——字段列表,字段列表的作用是把数据文件中的记录和数据库中表的列对应起来,下面是字段列表的一个例子 ...

  2. webform简单控件

    表单元素: 文本类: text password textarea hidden text,password,textarea实现控件:textbox   textmode属性选择password或m ...

  3. TCP/IP协议学习(四) 协议概述

    生活中有舒适区,借口成为懒惰的护身符,学习也有舒适区,逃避便是阻止进步的最大障碍. 经过半年多嵌入式方面的工作和学习,我提高了很多,但同时我也对自己所面临的问题逐渐清晰: 1. 偏于实践,理论基础不牢 ...

  4. linux 真·随笔

    复制操作 命令行模式下输入 6,9 co 12 复制第6行到第9行之间的内容到第12行后面. vim如何删除文件中所有东西 ggdG :%d 移动光标到指定行的行尾 $:移动光标到行尾 n$:移动到第 ...

  5. Centos 关闭后台进程 .sh 等

    命令后加 & 符号可以让其在后台运行 如: node app.js & 想要关闭分两步: ps aux | grep app.js 查看app.js  所运行的进程号 kill 进程号 ...

  6. Js获取后台集合List的值并操作html

    功能:将后台传到前端JSP的List中的float型数值转换为百分比显示 HTML代码: <s:iterator value="colorConfigList" status ...

  7. jQuery 源码中的 camelCase

    先看一下源码 //65-72行 // Matches dashed string for camelizing //匹配连字符 ‘-’ 和其后的第一个字母或数字,如果是字母,则替换为大写,如果是数字, ...

  8. SRM 657 DIV2

    -------一直想打SRM,但是感觉Topcoder用起来太麻烦了.题目还是英文,不过没什么事干还是来打一打好了.但是刚注册的号只能打DIV2,反正我这么弱也只适合DIV2了.. T1: 题目大意: ...

  9. kvm虚拟机安装

    KVM虚拟化技术介绍 概述 KVM是基于内核的虚拟化技术(Kernel-based Virtual Machine),于2007年的Linux 2.6.20被合并进Linux内核.KVM要求CPU支持 ...

  10. qt 程序启动参数 -qws  (转至 MrTXK

    运行嵌入式程序 在嵌入式QT版本中,程序需要服务器或自己作为服务器程序.服务器程序构造的方法是构造一个QApplication::GuiServe类型的QApplication对象.或者使用-qws命 ...