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. 1 Spring MVC 原理

    1. 注解式  Spring MVC 响应流程: 重要的接口和类的简单说明: DispatcherServlet:前端控制器,用于接收请求. HandlerMapping接口:用于处理请求的映射. D ...

  2. 浅谈HTTP协议(下)

    下面来讲响应消息.响应消息也分为响应起始行.响应头部.CRLF.响应主体. 响应起始行包括协议版本.响应状态码.原因短句.这里的重点就是响应状态码,它一共分为5类,状态码准确的说是一个三位数. 1xx ...

  3. 【CSS3】标签使用说明

    转换(transform):改变元素的形状.大小和位置. transform:rotate(20deg):顺时针旋转20° rotate()用来2D旋转改变角度.支持负数,表示逆时针. transfo ...

  4. oracle中schema指的是什么?

    看来有的人还是对schema的真正含义不太理解,现在我再次整理了一下,希望对大家有所帮助. 我们先来看一下他们的定义:A schema is a collection of database obje ...

  5. JavaScipt 源码解析 回调函数

    函数是第一类对象,这是javascript中的一个重要的概念,意味着函数可以像对象一样按照第一类管理被使用,所以在javascript中的函数: 能"存储"在变量中,能作为函数的实 ...

  6. 读<jquery 权威指南>[7]-性能优化与最佳实践

    一.优化选择器执行速度 1. 优先使用ID选择器和标记选择器 使用选择器时应该首选ID选择器($("#id")),其次是标记选择器($("div")),最后再选 ...

  7. mysql 数据导出 常用总结

    mysqldump -t 数据库名 -uroot -p > xxx.sql 总结:上面的导出形式默认表结构和数据: -d表结构; -t数据;   -c, --complete-insert使用完 ...

  8. java 解决汉诺塔问题

    //汉诺塔问题//HanYang 2016/10/15 import java.util.Scanner; //输出public class Hanuota { public static void ...

  9. kernel source reading notepad

    __init ,标记内核启动时所用的初始化代码,内核启动完成后就不再使用.其所修饰的内容被放到.init.text section中 __exit,标记模块退出代码,对非模块无效 to be cont ...

  10. Data storage on the batch layer

    4.1 Storage requirements for the master dataset To determine the requirements for data storage, you ...