PowerPoint Presentation

Size: px
Start display at page:

Download "PowerPoint Presentation"

Transcription

1 高级计算机图形学 计算机学院黄章进

2 第三章 OpenGL 编程 3.1 OpenGL 简介 3.2 完整程序 3.3 着色器基础 3.4 图元与属性 3.5 三维程序 2

3 3.1 OpenGL 简介 图形 API 的发展 OpenGL 的体系结构 OpenGL 的函数 一个简单例子 安装编译说明 3

4 GKS(1980s) IFIPS (1973) 组织了两个委员会建立图形 API 的标准 GKS(Graphical Kernel System) 二维, 同时包含很好的工作站模型 Core: 同时应用于二维和三维 GKS 成为 ISO 标准, 稍后成为 ANSI 标准 (1980s) GKS 很难推广到三维 (GKS-3D) 远远落后于硬件的发展 IFIPS: International Federation of Information Processing Societies 4

5 PHIGS(1990s) 程序员层次交互式图形系统 (Programmers Hierarchical Interactive Graphics System) 来自于 CAD 团体的 3D 图形 API 保留模式 : 绘制前在数据库里保存场景的层次结构 基本几何图元和网格模型 不支持光照 PHIGS+ NURBS 曲面 支持光照, 但不支持纹理 PHIGS 和 PHIGS+ 都是 ANSI 标准和 ISO 标准 5

6 PHIGS 与 X X Window 系统 ( 也常称为 X11 或 X)R 年 DEC/MIT 的雅典娜计划 Data Equipment Company 数据设备公司 图形用户界面 (GUI) 环境底层框架, 硬件无关 客户端 - 服务器 (client-server) 架构模型 GNONE KDE PEX( PHIGS Extension to X ) 把两者组合 不易应用 6

7 IRIS GL Silicon Graphics(SGI: ) Stanford 的 Jim Clark 博士带领 7 个研究生创办 Geometry Engine( 几何引擎 ): 硬件 (VLSI) 实现几何流水线, 极大改良了图形工作站 IRIS GL(Integrated Raster Imaging System Graphics Library) 立即模式绘制 可非常简单地设计出三维交互图形应用程序 7

8 OpenGL 1992 年 SGI 领导的 OpenGL Architectural Review Board(OpenGL ARB) 发布 1.0 版 平台无关的 API 易于使用 与硬件非常贴近, 从而可以充分发挥其性能 着重在于渲染 (rendering) 没有提供窗口和输入接口, 从而避免依赖于具体的窗口系统 8

9 OpenGL 的发展 早期是由 ARB 掌控其发展 成员包括 SGI, Microsoft, Nvidia, HP, 3DLabs, IBM, 相对稳定 2.1(2006.7)/3.3(2010.3)/4.6(2017.7) 发展反映了新的硬件能力 3D 纹理映射和纹理对象 (1.2, 1998) 顶点着色器 片段着色器 (2.0, 2004) 几何着色器 (3.2, 2009) Tessellator(4.1, 2011) Compute Shader(4.3, 2012) 通过扩展支持平台相关的特性 2006 年,ARB 被 Khronos 工作组取代 9

10 OpenGL 的发展 10

11 现代 OpenGL 利用 GPU 而不是 CPU 来获得性能提升 通过称为着色器 (shader) 的程序来控制 应用程序的工作就是把数据发送到 GPU GPU 执行所有的渲染任务 11

12 OpenGL 3.1 完全基于 shader 没有缺省的 shader 每个应用程序必须提供 vertex shader 和 fragment shader 取消立即模式 (immediate mode) 状态变量减少 函数废弃机制 非向后兼容 12

13 其他版本 OpenGL ES 嵌入式系统 1.0 版 : 简化的 OpenGL 版 : 简化的 OpenGL 3.1 Shader based 3.2 版 : 简化的 OpenGL 4.5 WebGL 1.0 版 :OpenGL ES 2.0 的 Javascript 实现 2.0 版 :OpenGL ES 3.0 的 Javascript 实现 被新版本的网络浏览器支持 OpenGL 4.6 (2017) 支持 geometry shaders tessellator 和 compute shaders 等 13

14 Direct3D DirectX: 微软开发的多媒体编程接口 Direct3D: DirectX 的 3D 图形 API 1.0: : Windows 95 OSR2& NT 4.0, c: Windows Xp SP2, : Windows Vista SP1, : Windows 7&Vista, : Windows 8, : Windows 8.1, : Windows 10,

15 OpenGL vs Direct3D OpenGL 跨平台的开放式标准 API 可扩展机制 可硬件加速的 3D 渲染系统 底层实现 ( 驱动 ) 管理硬件 专业图形应用 科研 跨平台, 可移植 适合图形学教学 Direct3D Windows 平台的专利 API 一致性好 3D 硬件接口 应用程序管理硬件资源 计算机游戏 高性能硬件存取能力 Direct3D 7.0 能匹敌, 8.0 (2001) 开始胜出 15

16 3.1 OpenGL 简介 图形 API 的发展 OpenGL 的体系结构 OpenGL 的函数 一个简单例子 安装编译说明 16

17 OpenGL 库 OpenGL 核心库 (OpenGL Core Library) 函数名 gl 开头 Windows: opengl32.dll (WINDOWS\SYSTEM32) Windows Xp 支持 OpenGL 1.1,Vista 支持 1.4 Direct3D 的封装, 需安装驱动来实现硬件加速 大多数 Unix/Linux 系统 :GL 库 (libgl.a) OpenGL 实用库 (OpenGL Utility Library, GLU) OpenGL 的一部分, 函数名以 glu 开头 Windows: glu32.dll 利用 OpenGL 核心库提供一些功能, 避免重复编写代码 二次曲面 NURBS 多边形网格化等 只能与旧代码工作 17

18 OpenGL 库 与窗口系统的连接 X Window 系统 :GLX Windows: WGL Macintosh: AGL 粘合 OpenGL 和窗口系统 18

19 GLUT OpenGL 实用工具库 (OpenGL Utility Toolkit Library, GLUT) 提供所有窗口系统的共同功能 创建窗口 从鼠标和键盘获取输入 菜单 事件驱动 代码可以在平台间移植, 但是 GLUT 缺乏一些现代 GUI 的控件和功能 无滚动条 可用 FLTK SDL 19

20 freeglut GLUT 库已经很久没有更新 可以和 OpenGL 3.1 一起使用 有些功能不能使用, 因为需要废弃的函数 Freeglut 是类似 GLUT 的开源扩展 增加的功能 上下文检查 20

21 GLEW OpenGL Extension Wrangler Library: 跨平台的开源 OpenGL 扩展加载库 使得调用特定系统支持的 OpenGL 扩展更简单 对于 windows 代码来说, 避免直接调用实体入口 应用程序只需要包含 glew.h 头文件, 并调用 glewinit() 即可 21

22 软件组织 应用程序 等 软件和 / 或硬件 22

23 软件组织 X window 系统下,OpenGL 函数库的组织 GLUT 会使用 GLX 和 X 库 23

24 OpenGL 流水线架构 立即模式 几何流水线 多项式求值器 逐顶点操作与图元装配 显示列表 光栅化 逐片段操作 帧缓冲区 纹理内存 像素操作 24

25 3.1 OpenGL 简介 图形 API 的发展 OpenGL 的体系结构 OpenGL 的函数 一个简单例子 安装编译说明 25

26 OpenGL 的函数 图元函数 (primitive) what 系统可以显示的低级对象或最基本的实体, 包括点 线段 多边形 像素 文本和各种曲线 / 曲面等 属性函数 (attribute) how 控制图元在显示器上显示的方式 : 线段颜色 多边形填充模式 图标题文本的字体等 视图函数 (viewing) 设置虚拟照相机的位置 朝向和镜头参数等 变换函数 (transformation) 对对象进行诸如平移 旋转和缩放等变换操作 输入函数 (input) GLUT 处理来自键盘 鼠标等设备的输入 控制函数 (control) GLUT 与窗口系统通信, 初始化程序, 处理运行时的错误等 查询函数 (query) 确定特定系统或设备的性能参数, 查询相机参数 帧缓冲区等 API 相关的信息 26

27 OpenGL 的状态 OpenGL 是一个有限状态机 (state machine) 的黑盒 状态 : 持续性参数, 如颜色 线型 材质属性等 来自应用程序的输入改变 machine 的状态或者产生可见的输出 OpenGL 函数有两种类型 定义图元 如果图元可见, 则被输出 顶点如何被处理以及图元的外观由状态控制 改变状态 属性函数 视图函数 变换函数 在 3.1 以后版本, 大部分状态变量由应用程序定义并发送到着色器 27

28 面向对象方面的缺陷 OpenGL 不是面向对象的, 因此逻辑上的一个函数却对应着多个 OpenGL 函数 : gluniform3f gluniform2i gluniform3dv 内在存储模式是相同的 在 C++ 中很容易创建重载函数, 但效率却成为主要问题 28

29 OpenGL 函数名称的 格式 函数的功能 属于 GL 库 GLU 库 :glu GLUT 库 :glut gluniform3f(x, y, z) 2 - (x,y) 3 - (x,y,z) 4 - (x,y,z,w) 维度或参数个数 x, y, z 为 float gluniform3fv(p) b - char ub - unsigned char s - short us - unsigned short i - int ui - unsigned int f - float d - double 注意每部分的大小写 p 为指向 float 的指针 29

30 OpenGL 常量和数据 类型 头文件 gl.h, glu.h 和 glut.h 中定义大量的常量 例如 : glenable(gl_depth_test); glclear(gl_color_buffer_bit); 注意 :#include <GL/glut.h> 自动将其他两个头文件包含到程序中 头文件中定义了 OpenGL 数据类型 : GLfloat, GLdouble, 30

31 OpenGL 和 GLSL 基于着色器的 OpenGL 与其说是状态机模型, 不如说是数据流模型 大部分状态变量 属性和相关的 3.1 前的 OpenGL 函数被弃用 由着色器负责渲染任务 应用程序只需把数据传输到 GPU 32

32 GLSL OpenGL Shading Language :OpenGL 着色语言 类 C 语言 2 到 4 维的矩阵和向量类型 重载的运算符 类 C++ 的构造函数 类似于 Nvidia 的 Cg 和 Microsoft 的 HLSL 代码以源代码的形式发送到着色器 通过 OpenGL 函数编译 链接和发送信息到着色器 33

33 3.1 OpenGL 简介 图形 API 的发展 OpenGL 的体系结构 OpenGL 的函数 一个简单例子 安装编译说明 34

34 一个简单程序 在黑色背景上画一个白色矩形 35

35 simple.c #include <GL/glut.h> void display(){ glclear(gl_color_buffer_bit); glbegin(gl_quad); glvertex2d(-0.5, -0.5); glvertex2d(-0.5, 0.5); glvertex2d(0.5, 0.5); glvertex2d(0.5, -0.5); glend(); glflush(); } int main(int argc, char* argv[]) { glutinit(&argc, argv); glutcreatewindow( simple"); glutdisplayfunc(display); glutmainloop(); } 36

36 有何问题? 例子中的大部分 OpenGL 函数被弃用 大量使用不再存在的状态变量默认值 视图 颜色 窗口参数 后面的版本将显式指定一些默认值 但处理循环还是一样的 38

37 simple.c #include <GL/glut.h> void display(){ glclear(gl_color_buffer_bit); // need to fill in this part // and add in shaders } int main(int argc, char** argv){ glutinit(&argc, argv); glutcreatewindow("simple"); glutdisplayfunc(display); glutmainloop(); } 39

38 事件循环 注意在程序中定义了一个显示回调函数 (display callback): void display() 每个 GLUT 程序都必须有一个显示回调函数 只要 OpenGL 确定显示内容要被刷新时, 显示回调函数就会被调用 : 例如, 当窗口被打开的时候 main 函数是以程序进入事件循环做为结束 40

39 3.1 OpenGL 简介 图形 API 的发展 OpenGL 的体系结构 OpenGL 的函数 一个简单例子 安装编译说明 41

40 安装编译说明 Windows 7 & 8,Office 2007/2010/2013 下载 42

41 安装编译说明 Visual Studio 2005/2008/2010/2012 下载 OpenGL+GLUT 配置编译见课程主页 43

42 安装编译说明 Visual Studio 2005/2008/2010 下 GLUT 库的配置和编译可参考 : n/howto/winglut.html FreeGLUT 库下载 : GLEW 库下载 : FreeGLUT 库和 GLEW 库的安装配置类似于 GLUT 库 44

43 第三章 OpenGL 编程 3.1 OpenGL 简介 3.2 完整程序 3.3 着色器基础 3.4 图元与属性 3.5 三维程序 45

44 OpenGL 程序结构 绝大多数 OpenGL 程序具有类似的结构, 包含下述函数 main(): 注册回调函数 打开一个或多个具有指定属性的窗口 进入事件循环 ( 最后一条可执行语句 ) init(): 设置数据 着色器和状态变量 视图 属性 InitShader(): 读入 编译并链接着色器 回调函数 显示函数 display() 输入和窗口函数 46

45 3.2 完整程序 主函数 main() 初始化 init() 渲染 display() 48

46 main() #include <GL/glew.h> #include <GL/glut.h> // 自动包含了 gl.h int main( int argc, char **argv ) { // 初始化 GLUT 库, 设置窗口属性, 并创建显示窗口 glutinit( &argc, argv ); glutinitdisplaymode( GLUT_RGBA ); glutinitwindowsize( 512, 512 ); glutinitcontextversion( 3, 2 ); glutinitcontextprofile( GLUT_CORE_PROFILE ); glutcreatewindow( "Square" ); glewinit(); // 初始化 GLEW 库 init(); // 设置 OpenGL 状态, 初始化 shaders } glutdisplayfunc( display ); glutmainloop(); // 注册显示回调函数 // 无穷事件循环 49

47 创建 GLUT 渲染窗口 初始化 GLUT 库 glutinit() 设置窗口显示模式 glutinitdisplaymode() 设置窗口大小和位置 glutinitwindowsize() 和 glutinitwindowposition() 设置 OpenGL 环境 glutinitcontextversion() 和 glutinitcontextprofile() 创建窗口 glutcreatewindow() 50

48 GLUT 窗口管理 void glutinit(int argc, char **argv); 初始化 GLUT 库 必须是应用程序调用的第一个 GLUT 函数, 它负责设置其他 GLUT 函数所需的数据结构 处理向程序输入的命令行函数 void glutinitwindowsize(int width, int height); void glutinitwindowposition(int x, int y); 设置窗口的初始大小和位置 width 和 height : 指定窗口的宽度和宽度和高度, 单位为像素, 缺省 300x300 x 和 y : 窗口左上角相对于屏幕左上角的位置, 单位为像素, 缺省 (0,0) 51

49 GLUT 窗口管理 void glutinitdisplaymode(unsigned int mode); 指定窗口的显示模式 颜色模型 :GL_RGB/GL_RGBA RGB 颜色 ( 默认 ) ;GL_INDEX 索引颜色 缓冲区类型 :GL_SINGLE 单缓冲区 ( 默认 ); GL_DOUBLE 双缓冲 mode 属性选项按逻辑或组合在一起 int glutcreatewindow(char *name); 根据设置的属性 ( 显示模式 宽度 高度等 ) 创建标题为 name 的窗口 调用 glutmainloop() 之前, 窗口不会被显示 返回整型的窗口标识符, 用于同一应用程序对多窗口的管理 52

50 窗口 窗口 : 显示器上的一块矩形区域 窗口内的位置用窗口坐标来指定, 单位是像素 科学和工程中, 左下角是原点 (0,0) 光栅显示器按照从上到下, 从左到右的顺序进行扫描, 所以左上角是原点 OpenGL 命令假定原点在左下角 窗口系统返回的信息 ( 例如鼠标位置 ) 假定原点在左上角 53

51 宽高比 宽高比 (aspect ratio): 矩形的宽度与高度之比 如果裁减窗口和 glutinitwindowsize 设置的显示窗口的宽高比不同, 引起对象变形 保证宽高比 54

52 视口 可在当前显示窗口中定义视口用来显示图像 : void glviewport(glint x, GLint y, GLint w, GLint h) 左下角为 (x,y), 以像素为单位 ( 窗口坐标 ) 通过调节视口的高度和宽度来匹配裁剪矩形的宽高比 视口也是状态的一部分 55

53 初始化 OpenGL 上下文 void glutinitcontextversion(int majorversion, int minorversion); 指定创建渲染环境使用的 OpenGL 实现的主版本和次版本 使用 OpenGL 3.0 或更高版本时, 需要在调用 glutcreatewindow() 前调用这个函数 void glutinitcontextprofile(int profile); 指定要创建的上下文的模式 : GLUT_CORE_PROFILE 核心模式 GLUT_COMPATIBILITY_PROFILE 兼容模式 56

54 GLUT 事件处理 void glutmainloop(void); GLUT 事件处理循环 无穷循环 : 当有事件发生时, 调用相应的回调函数 ; 否则, 处于等待状态 main() 函数是以程序进入事件循环做为结束 void glutdisplayfunc(void (*func)(void)); 指定当窗口内容需要重绘时要调用的函数 窗口首次被打开 窗口移动 glutpostredisplay() 被显式地调用 每个 GLUT 程序都必须有一个显示回调函数

55 GLUT 回调函数 GLUT 使用回调函数机制来进行事件处理 窗口重绘 glutdisplayfunc(void (*func)(void)) 窗口改变大小 glutreshapefunc() 键盘输入 glutkeyboardfunc() 鼠标按键 glutmousefunc() 鼠标移动 glutmotionfunc() 空闲函数 glutidlefunc() 58

56 3.2 完整程序 主函数 main() 初始化 init() 渲染 display() 59

57 init() const int NumPoints = 6; void init( void ) { // Specifiy the vertices for two triangles vec2 points[numpoints] = { vec2( -0.5, -0.5 ), vec2( 0.5, -0.5 ), vec2( -0.5, 0.5 ), vec2( -0.5, 0.5 ), vec2( 0.5, -0.5 ), vec2( 0.5, 0.5 ) }; // Create a vertex array object GLuint vao; glgenvertexarrays( 1, &vao ); glbindvertexarray( vao ); // Create and initialize a buffer object GLuint buffer; glgenbuffers( 1, &buffer ); glbindbuffer( GL_ARRAY_BUFFER, buffer ); glbufferdata( GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW ); 60

58 init() 续 // Load shaders and use the resulting shader program GLuint program = InitShader( "vshader21.glsl","fshader21.glsl" ); gluseprogram( program ); // Initialize the vertex position attribute from the vertex shader GLuint loc = glgetattriblocation( program, "vposition" ); glenablevertexattribarray( loc ); glvertexattribpointer( loc, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) ); } glclearcolor( 1.0, 1.0, 1.0, 1.0 ); // white background 61

59 3.2.2 初始化 init() 初始化顶点数组对象 分配顶点缓冲区对象 将数据载入缓冲区对象 初始化顶点和片段着色器 着色管线装配 62

60 正方形 顶点为 (-0.5, -0.5), (0.5, -0.5), (0.5,0.5), (-0.5,0.5) 的单位正方形要先剖分为两个三角形 vec.h 定义了二维 三维和四维 GLfloat 向量类 vec2, vec3 和 vec4, 并重载了运算符 const int NumPoints = 6; // Specifiy the vertices for two triangles vec2 points[numpoints] = { vec2( -0.5, -0.5 ), vec2( 0.5, -0.5 ), vec2( -0.5, 0.5 ), vec2( -0.5, 0.5 ), vec2( 0.5, -0.5 ), vec2( 0.5, 0.5 ) }; 63

61 顶点数组对象 VAO 顶点有多种属性值 位置 颜色 纹理坐标 应用程序数据 顶点数组包含了这些数据 OpenGL 中用顶点数组对象 (VAO) 打包了所有的顶点数据 ( 位置 颜色等 ) 生成顶点数组对象的标识符 ( 或名字 ) 然后绑定 64

62 产生顶点数组对象名 void glgenvertexarrays(glsizei n, GLuint *arrays); 返回 n 个当前未被使用的顶点数组对象名到数组 arrays 名字类似于 C 中的指针, 只有指向已分配的内存才有意义 OpenGL 中的分配方式称为对象绑定 65

63 绑定顶点数组对象 void glbindvertexarray(gluint array); 当 array 首次使用的从 glgenvertexarrays() 返回的非零值时, 创建一个新的顶点数组对象并赋以该名字 当绑定到已创建的顶点数组对象时, 该对象变成当前活动对象 当绑定到零值时,OpenGL 停止使用应用程序分配的顶点数组对象并返回到顶点数组的默认状态 66

64 删除顶点数组对象 void gldeletevertexarrays(glsizei n, const GLuint * arrays); 删除 arrays 中指定的 n 个顶点数组对象, 使得这些名字可被重用 如果一个当前绑定的顶点数组对象被删除, 该顶点数组的绑定变为 0, 并且默认顶点数组成为当前活动对象 相当于执行 glbindvertexarray(0) 67

65 查询顶点数组对象名 GLboolean glisvertexarray(gluint array); 查询 array 是否对应到一个顶点数组对象 返回 GL_TRUE, 如果 array 是一个之前 glgenvertexarrays() 产生的顶点数组对象名, 且后来未被删除 返回 GL_FALSE, 如果 array 是 0, 或者一个非顶点数组对象名的非零值 68

66 3.2.2 初始化 init() 初始化顶点数组对象 分配顶点缓冲区对象 将数据载入缓冲区对象 初始化顶点和片段着色器 着色管线装配 69

67 顶点缓冲区对象 VBO 顶点的各种数据存储在缓冲区对象中, 并由当前绑定的顶点数组对象 VAO 所管理 缓冲区对象是由 GPU 分配并管理的内存 创建 绑定 传送 ( 或更新 ) 数据 70

68 产生缓冲区对象名 void glgenbuffers(glsizei n, GLuint *buffers); 返回 n 个当前未被使用的缓冲区对象名到数组 buffers 返回的名字不必是连续的 缓冲区对象名是无符号整数,0 是保留值 ( 即不可能被返回 ) 71

69 绑定缓冲区对象 void glbindbuffer(glenum target, GLuint buffer); target : 缓冲区对象的类型, 有如下 9 种 : GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER, GL_PIXEL_PACK_BUFFER, GL_PIXEL_UNPACK_BUFFER, GL_TEXTURE_BUFFER, GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, GL_UNIFORM_BUFFER, GL_TRANSFORM_FEEDBACK_BUFFER buffer : 要绑定的缓冲区对象名称 当 buffer 是首次使用的从 glgenbuffers() 返回的非零值时, 创建一个新的缓冲区对象并赋以该名字 当绑定到以前创建的缓冲区对象时, 该对象变成当前活动对象 当绑定到零值时,OpenGL 停止使用 target 类型的缓冲区对象 72

70 删除缓冲区对象 void gldeletebuffers(glsizei n, const GLuint * buffers); 删除 buffers 中指定的 n 个缓冲区对象, 使得这些名字可被重用 如果一个当前绑定的缓冲区对象被删除, 该对象的绑定重置为默认缓冲区对象 相当于执行 glbindbuffer(target, 0) 如果试图删除不存在的缓冲区对象或者 0 时, 将忽略该操作 ( 不会产生错误 ) 73

71 查询缓冲区对象名 GLboolean glisbuffer(gluint buffer); 查询 buffer 是否对应到一个缓冲区对象 返回 GL_TRUE, 如果 buffer 是一个已经分配且后来未被删除的缓冲区对象的名称 返回 GL_FALSE, 如果 buffer 是 0, 或者一个不是缓冲区对象名的非零值 74

72 3.2.2 初始化 init() 初始化顶点数组对象 分配顶点缓冲区对象 将数据载入缓冲区对象 初始化顶点和片段着色器 着色管线装配 75

73 加载数据到缓冲区对象 void glbufferdata(glenum target, GLsizeiptr size, const GLvoid * data, GLenum usage); 为 target 类型的当前绑定缓冲区对象分配 size 字节的服务器内存, 并用 data 指向的数据来初始化 以前与当前绑定对象关联的数据都将删除 size 是存储相关数据所需的内存数量, 通常是数据元素的个数乘以各自的字节大小 data 可以是指向客户机内存的指针或 NULL 如果是有效指针, size 字节的数据从客户机复制到服务器 ; 如果是 NULL, 只分配 size 字节的服务器内存 usage 指定数据存储区的使用方式, 取值 : GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY, GL_STATIC_DRAW, GL_STATIC_READ, GL_STATIC_COPY, GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, or GL_DYNAMIC_COPY. 76

74 更新缓冲区对象数据 void glbuffersubdata(glenum target, GLintprt offset, GLsizeiptr size, const GLvoid * data); 用 data 指向的数据更新 target 类型的当前绑定缓冲区对象中从 offset 字节开始的 size 字节的数据 如果 size 或 offset 小于零, 或者它们的和大于缓冲区对象创建时所指定的大小时, 报错 GL_INVALID_VALUE 77

75 示例代码 // Create a vertex array object GLuint vao; glgenvertexarrays( 1, &vao ); glbindvertexarray( vao ); // Create and initialize a buffer object GLuint buffer; glgenbuffers( 1, &buffer ); glbindbuffer( GL_ARRAY_BUFFER, buffer ); glbufferdata( GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW ); 78

76 传送数据到 GPU 产生顶点数组对象 (vertex-array object, VAO) 的标识符 glgenvertexarrays 绑定 ( 创建 ) 顶点数组对象 glbindvertexarray 产生缓冲区对象的标识符 glgenbuffers 绑定 ( 创建 ) 缓冲区对象 glbindbuffer 为缓冲区对象分配存储空间, 并传送数据 glbufferdata 更新缓冲区对象的数据 glbuffersubdata 79

77 3.2.2 初始化 init() 初始化顶点数组对象 分配顶点缓冲区对象 将数据载入缓冲区对象 初始化顶点和片段着色器 着色管线装配 80

78 着色器 着色器是使用 OpenGL 着色语言 (GLSL) 编写的小型程序 每一个使用 OpenGL 3.1 以后版本的程序都需要指定至少两个着色器 : 顶点着色器 片段着色器 81

79 创建着色器 以字符串的形式提供 GLSL 着色器给 OpenGL, 但一般将着色器字符串保存在文件, 使用辅助函数 InitShader() 来读取文件和创建 OpenGL 着色器程序 // Load shaders and use the resulting shader program GLuint program = InitShader( "vshader21.glsl","fshader21.glsl" ); gluseprogram( program ); 82

80 简单顶点着色器 #version 150 in vec4 vposition; void main(void) { input from application gl_position = vposition; } must link to variable in application built in variable 83

81 传递着色器 这是一个传递着色器 (pass-through shader) 的例子, 只负责将输入数据拷贝到输出数据中 第一行 #version 150 指定了我们使用的 OpenGL 着色语言的版本 150 表示我们使用 OpenGL 3.2 对应的 GLSL 1.5, 这与之前 glutinitcontextversion() 设置的版本一致 每个着色器的第一行都应该设置 #version, 否则系统会假设使用

82 着色器变量 in vec4 vposition; 定义一个着色器变量 着色器变量是着色器与外部的联系所在 我们必须自己完成着色管线的装配, 这样应用程序的数据才能与不同的着色阶段相关联 vposition 变量名, 前缀 v 表示顶点属性 vec4 GLSL 四维浮点数向量类型,(x,y,0,1) in 限定符指定了数据流入着色器的方向 85

83 main() 函数 void main(void) { gl_position = vposition; } OpenGL 的所有着色器, 无论是处于哪个着色阶段, 都会有一个 main() 函数 对于这个着色器, 它所实现的就是将输入的顶点位置复制到顶点着色器特定输出 gl_position 着色器内置变量以 gl_ 作为前缀 86

84 简单片段着色器 #version 150 out vec4 fcolor; void main(void) { fcolor = vec4(1.0, 0.0, 0.0, 1.0); } 变量 fcolor 使用 out 限定符 着色器将通过 fcolor 输出片段的颜色 f 前缀表示片段属性 设定片段颜色为四维向量表示的 RGBA 颜色 87

85 3.2.2 初始化 init() 初始化顶点数组对象 分配顶点缓冲区对象 将数据载入缓冲区对象 初始化顶点和片段着色器 着色管线装配 88

86 着色管线装配 将应用程序的数据与着色器中的变量关联起来 顶点属性 uniform 变量 init() 最后指定了顶点着色器中的变量与存储在顶点缓冲区对象中数据的关系 // Initialize the vertex position attribute from the vertex shader GLuint loc = glgetattriblocation( program, "vposition" ); glenablevertexattribarray( loc ); glvertexattribpointer( loc, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) ); 89

87 顶点属性变量 顶点属性是顶点着色器中定义的 in 变量 链接器生成一张属性变量的索引表 应用程序从表中查询属性变量的索引值, 并关联到应用程序中的变量 90

88 获取属性变量的索引 GLint glgetattriblocation(gluint program, const GLchar *name); 返回与链接过的着色器程序 program 中属性变量 name 相关联的索引 如果 name 不是 program 的一个活动属性变量, 或是内置属性变量 ( 以 gl_ 开头 ), 返回 -1 如果 name 是矩阵属性变量, 返回矩阵第一列的索引 后一列的索引为前一列的索引加 1 91

89 顶点属性数组 void glvertexattribpointer(gluint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); 为索引值为 index 的顶点属性变量的数组指定位置 pointer 和数据格式 size 每个顶点属性的分量个数, 为 1,2,3,4 或 GL_RGBA, 初始值为 4 type 数组元素的数据类型, 初始为 GLfloat normalized 指定浮点数据值是否要规范化 stride 数组中相邻元素的偏移字节,0 表示数据连续存储 pointer 指定顶点属性数组的第一个分量在当前绑定的 GL_ARRAY_BUFFER 缓冲区对象中的偏移量 92

90 启用 / 禁用顶点属性数 组 void glenablevertexattribarray(gluint index) void gldisablevertexattribarray(gluint index) 启用 / 禁用属性 index 的顶点属性数组 index 必须是一个介于 0 到 GL_MAX_VERTEX_ATTRIBS - 1 之间的值 启用后, 就可用 gldrawarrays() 等来为顶点属性变量加载值 93

91 示例代码 #define BUFFER_OFFSET( offset ) ((GLvoid*) (offset)) GLuint loc = glgetattriblocation( program, "vposition" ); glenablevertexattribarray( loc ); glvertexattribpointer( loc, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) ); BUFFER_OFFSET 宏来指定数据在缓冲区对象中偏移量 不能设置一个指向应用程序内存块的指针 94

92 3.2 完整程序 主函数 main() 初始化 init() 渲染 display() 95

93 display() void display( void ) { glclear( GL_COLOR_BUFFER_BIT ); // clear the window gldrawarrays( GL_TRIANGLES, 0, NumPoints ); // draw the triangles glflush(); } 96

94 清除缓冲区 void glclear(glbitfield mask); 用当前的缓冲区清除值清除指定的缓冲区 mask 值是如下值得位逻辑 OR 组合 GL_COLOR_BUFFER_BIT 颜色缓冲区 GL_DEPTH_BUFFER_BIT 深度缓冲区 GL_STENCIL_BUFFER_BIT 模板缓冲区 void glclearcolor(glclampf red, GLclampf green, GLclampf blue, GLclampf alpha); 设置颜色缓冲区的清除颜色, 默认为黑色 97

95 绘制图元 可以调用 glbindvertexarray() 来选择作为顶点数据使用的顶点数组 调用 gldrawarrays() 来实现顶点数据向 OpenGL 管线的传输 void gldrawarrays(glenum mode, GLint first, GLsizei count); 用当前绑定的顶点数组的从 first 开始到 first+count-1 结束的数组元素创建一个几何图元序列 mode 指定图元类型, 可以是 GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, 等 98

96 强制绘图 void glflush(void); 强制之前的 OpenGL 命令立即执行, 这样可保证它们在有限时间内完成 立即返回, 不会等到所有命令完成 void glfinish(void); 强制所有当前的 OpenGL 命令立即执行, 并且等待它们全部完成 影响程序的整体性能, 最好只在开发阶段使用 99

97 第三章 OpenGL 编程 3.1 OpenGL 简介 3.2 完整程序 3.3 着色器基础 3.4 图元与属性 3.5 三维程序 100

98 3.3 着色器基础 GLSL 1.50 简介 着色器编译 101

99 GLSL 出现在 OpenGL 2.0 以后版本 高级的类 C 语言 新的数据类型 矩阵 向量 采样器 从 OpenGL 3.1 开始的核心版本, 应用程序必须提供着色器 102

100 GLSL OpenGL Shading Language :OpenGL 着色语言 1.10:OpenGL :OpenGL :OpenGL :OpenGL :OpenGL :OpenGL

101 基础知识 GLSL 的语法来自于 C/C++ 字符集, 记号 (tokens), 标识符 (identifiers) 分号, 大括号嵌套 控制流 :if-else, switch-case, for, while, do-while 关键字 注释 :// 和 /* */ 入口函数 :void main() #version 150 void main() { // Your code goes here } 105

102 数据类型 标量 float 浮点型,IEEE754 单精度 字面浮点常数的后缀 f 或 F 是可选的 OpenGL 4.0 之后支持双精度浮点类型 double int/uint 整型, 至少 16 位精度 [-65535,65535] 十进制 八进制 十六进制 : 42, 052, 0x2A 不支持长整型, 不支持按位运算 精度为 32 位, 字面整型常数后缀 u 或 U 表示无符号整数 int i, j = 42; // default integer literal type is int uint k = 3u; // u establishes the type as uint bool 布尔型 :true/false 关系运算和逻辑运算产生布尔型 条件跳转表达式 (if, for,?:, while, do-while) 只接受布尔型 106

103 数据类型 向量 二维到四维的 float int uint bool 型 vec2 vec3 vec4 ivec2 ivec3 ivec4 uvec2 uvec3 uvec4 bvec2 bvec3 bvec4 分量访问 (x, y, z, w) 位置或方向 (r, g, b, a) 颜色 (s, t, p, q) 纹理坐标 107

104 数据类型 矩阵 2 2, 2 3, 2 4, 3 2, 3 3, 3 4, 4 2, 4 3, 和 4 4 浮点矩阵 mat2, mat3, mat4 mat2x2, mat2x3, mat2x4 mat3x2, mat3x3, mat3x4 mat4x2, mat4x3, mat4x4 第一个数指定列数, 第二个数指定行数 列优先 例如 4 列 3 行矩阵 :mat4x3 M; M[2] 是第 3 列, 类型 vec3;m[3][1] 是第 4 列第 2 行元素 108

105 数据类型 采样器 (sampler) 着色器访问纹理的不透明句柄 sampler[1,2,3]d 访问 1D,2D,3D 纹理 samplercube 访问立方图纹理 sampler[1,2]dshadow 访问 1D,2D 阴影图 例子 : uniform sampler2d Grass; vec4 color = texture2d(grass, coord); 109

106 数据类型 - 结构 结构成员可以是基本类型和数组 隐式地定义一个构造函数 struct light { float intensity; vec3 position; } lightvar; light lightvar2; 不支持嵌套的匿名结构 不支持嵌入的结构定义 struct S { float f; }; struct T { S; // Error: 匿名结构 struct {... }; // Error: 嵌套 S s; // Okay }; 110

107 数据类型 数组 可以声明基本类型和结构的数组 除了作为函数参数外, 声明时可以不指定大小 只能声明一维数组 可用 length 方法来查询数组的大小 有构造函数, 可以作为函数的参数和返回类型 float coeff[3]; // an array of 3 floats float[3] coeff; // same thing int indices[]; // unsized. Redeclare later with a size const int numindices = 5; int indices[numindices]; 111

108 数据类型 void 声明函数不返回任何值 没有缺省的函数返回值 除了再用于空的函数形参或实参列表外, 不能用于其他声明 void main() { } 112

109 初始化和构造函数 变量可以在声明的时候初始化 整型常量可以用八进制 十进制和十六进制 浮点值必须包括一个小数点, 除非是用科学计数法, 如 3E-7, 后缀 f 或 F 可选 布尔型为 true 或 false 聚合类型 ( 向量 矩阵 数组和结构 ) 必须用构造函数进行初始化 113

110 构造函数 vec4 color = vec4(0.0, 1.0, 0.0, 1.0); vec4 rgba = vec4(1.0); // sets each component to 1.0 vec3 rgb = vec3(color); // drop the 4th component mat2 m = mat2(1.0, 2.0, 3.0, 4.0); struct light { float intensity; vec3 position; }; light lightvar = light(3.0, vec3(1.0, 2.0, 3.0)); const float c[3] = float[3](5.0, 7.2, 1.1); const float d[3] = float[](5.0, 7.2, 1.1); 114

111 访问向量元素 可以用 [] 或者选择运算符 (.) 逐个索引向量的元素 x, y, z, w 位置或方向数据 r, g, b, a 颜色数据 s, t, p, q 纹理坐标 a[2], a.b, a.z, a.p 是一样的 混合 (Swizzling) 运算符可以用来操纵每个分量 vec4 a; a.yz = vec2(1.0, 2.0); 115

112 混合操作 各分量名称可打乱顺序, 但只能使用同一组名称, 且长度不能大于 4 右值中名称可以重复, 左值不可以 vec4 v4; v4.rgb; // is a vec3 v4.xgba; // is illegal vec4 pos = vec4(1.0, 2.0, 3.0, 4.0); vec4 dup = pos.xxyy; // dup = (1.0, 1.0, 2.0, 2.0) pos.xw = vec2(5.0, 6.0); // pos = (5.0, 2.0, 3.0, 6.0) pos.xx = vec2(3.0, 4.0); // illegal - 'x' used twice 116

113 隐式类型转换 只支持以下整型到浮点型的隐式转换 int -> float uint -> float ivec[2,3,4] -> vec[2,3,4] uvec[2,3,4] -> vec[2,3,4] 不支持数组和结构的隐式转换 int 数组不能隐式转换为 float 数组 无符号整型和有符号整型间无隐式转换 利用转换构造函数进行显式类型转换 float f = 10.0; int ten = int(f); 118

114 变量作用域 GLSL 的作用域规则和 C++ 相似 在所有函数定义之外声明的变量具有全局作用域 花括号内声明的变量作用域在花括号内 while 测试和 for 语句中声明的变量作用域限于循环体内 if 语句不允许声明新变量 for (int i = 0; i < 10; ++i) { // loop body } 119

115 存储限定符 声明变量时可以在类型前指定存储限定符 < none: default > 局部读写或函数输入参数 const 只读的编译时常量或函数参数 in 变量为着色器阶段的一个输入 out 变量为着色器阶段的一个输出 uniform 应用程序传递给着色器的每图元数据 120

116 存储限定符 全局变量可以指定为限定符 const in out 和 uniform 中的一个 局部变量只能使用 const 限定符 函数参数只能使用 const 限定符 函数返回值和结构字段不能使用限定符 缺省限定符 没有限定符的全局或局部变量不能和应用程序和其他着色器交换信息 121

117 const 限定符 const 变量必须在声明时初始化 const vec3 zaxis = vec3 (0.0, 0.0, 1.0); 结构变量可以声明为 const, 但结构的字段不能限定为 const 122

118 in 限定符 in 限定符用来限定一个着色器阶段的输入 : 顶点着色器的顶点属性或者前一阶段的输出变量 顶点着色器中的输入变量接收来自应用程序的每顶点数据 片段着色器中的输入变量接收来自插值前一阶段输出的每片段数据 如果没有几何着色器, 那么顶点着色器输出变量和片段着色器的同名输入变量的类型必须匹配 float 标量内部存储为 vec4 123

119 out 限定符 out 限定符用来限定一个着色器阶段的输出 全局变量, 顶点着色器可读写, 片段着色器只读 顶点着色器输出每顶点数据 片段着色器输出每片段数据 124

120 uniform 限定符 unifrom 用于声明在图元处理时保持不变的全局变量 由应用程序在着色器执行前赋值, 在着色器中只读 任何类型的变量, 包括结构和数组 125

121 运算符 GLSL 中使用的运算符优先级和结合性和 C 是一致的 ! 算术运算符 : * / + - 关系运算符 :< > <= >= 逻辑运算符 : ==!= && ^^( 异或 ) 选择运算符 :?: 赋值 := += -= *= /= 126

122 逐分量运算 一般地, 向量和矩阵运算是逐分量进行的 例外情形 : 矩阵乘向量 向量乘矩阵以及矩阵相乘按线性代数运算规则 vec4 v, u; float f; v = u + f; // v = (u.x + f, u.y + f, u.z + f, u.w + f); mat4 m; v * u; // 逐分量乘, 不是内积 v * m; // 行向量乘矩阵 m * v; // 矩阵乘列向量 m * m; // 矩阵相乘 127

123 流控制 GLSL 的流控制和 C++ 非常相似, 着色器的入口点是 main 函数 循环结构 :for while 和 do-while,for 循环允许在初始化子句中声明循环迭代变量, 作用域持续到循环结束 break 和 continue 同 C 选择结构 :if if-else 和 switch-case-default, 只是 if 语句不能声明变量 还有选择操作符 (?:) discard 仅用在片段着色器中丢弃片段 128

124 函数 函数的使用和 C++ 类似, 函数名可以通过参数个数和类型进行重载 函数声明 : returntype functionname (type0 arg0, type1 arg1,..., typen argn); 函数定义 : returntype functionname (type0 arg0, type1 arg1,..., typen argn) { // do some computation return returnvalue; } 129

125 参数限定符 GLSL 按值 - 返回 (value-return) 调用函数 参数类型 typen 必须指定类型和可选的参数限定符 < none: default > 同 in in 复制到函数中 const in 复制到函数中, 函数内只读 out 返回时从函数中复制出来 inout 复制进函数并在返回时复制出来 130

126 参数和返回值类型 参数和返回值可以是任意类型 数组必须显式指定大小 数组传入或返回时只需使用变量名, 且大小和函数声明中匹配 函数必须声明返回值类型, 无返回值时声明为 void 输入参数从左往右求值 函数不能递归调用 131

127 内置函数 角度和三角函数 : 逐分量 指数函数 : 逐分量 常用函数 : 逐分量 几何函数 : 向量 矩阵函数 向量关系函数 纹理访问函数 片段处理函数 : 只在片段着色器使用 噪声函数 几何着色器函数 132

128 简单顶点着色器 #version 150 in vec4 vposition; void main(void) { input from application gl_position = vposition; } must link to variable in application built in variable 133

129 执行模型 Vertex data Shader Program GPU Application Program gldrawarrays Vertex Shader Vertex Primitive Assembly 134

130 简单着色器程序 #version 150 out vec4 fcolor; void main(void) { fcolor = vec4(1.0, 0.0, 0.0, 1.0); } 135

131 执行模型 Application Shader Program Rasterizer Fragment Shader Frame Buffer Fragment Fragment Color 136

132 3.3 着色器基础 GLSL 1.50 简介 着色器编译 137

133 着色器的编译 编写 OpenGL 程序所使用的着色器类似于使用一种类 C 的基于编译器的语言 编译成目标代码 链接生成可执行程序 编译器和链接器是 OpenGL API 的一部分 138

134 着色器编译命令序列 139

135 着色器编译步骤 140

136 着色器对象 创建着色器对象 加载着色器源代码 编译着色器对象 验证是否成功编译 141

137 创建着色器对象 GLuint glcreateshader(glenum type); 创建一个空的着色器对象 着色器对象维护定义着色器的源代码字符串 type 可取值为 GL_VERTEX_SHADER: 顶点着色器 GL_FRAGMENT_SHADER: 片段着色器 GL_GEOMETRY_SHADER: 几何着色器 返回非零整数, 出错时返回零 142

138 加载着色器源代码 void glshadersource(gluint shader, GLsizei count, const CLchar **string, const GLint *length); 把存储在字符串数组 string 中的源代码加载到着色器对象 shader, 之前存储在着色器对象里的源代码将被完全替换 count 字符串的个数 length NULL( 每个字符串都是以 null 结束 ) 或字符串长度的数组 ( 若有长度为负值, 表示该字符串以 null 结束 ) 143

139 编译着色器对象 void glcompileshader(gluint shader); 编译着色器对象 shader 的源代码 可以调用 glgetshaderiv() 函数以 GL_COMPILE_STATUS 为参数查询编译结果 可以调用 glgetshaderinfolog() 函数查看编译信息日志 144

140 着色器程序 创建着色器程序 把着色器对象连接到着色器程序 链接着色器程序 验证链接是否成功 使用着色器 145

141 创建着色器程序 GLuint glcreateprogram(void); 创建一个空的着色器程序 返回非零整数, 出错时返回零 OpenGL 用着色器程序来封装管理可执行着色器 可创建多个着色器程序, 并可在渲染时切换以使用不同的着色器 146

142 连接着色器对象 void glattachshader(gluint program, GLuint shader); 把着色器对象 shader 连接 (attach) 到着色器程序 program 着色器对象可在任何时候连接到着色器程序, 例如可在加载源代码或编译前 一个着色器对象可连接到多个着色器程序 147

143 链接程序 void gllinkprogram(gluint program); 对连接到着色器程序 program 的所有着色器对象进行处理, 生成一个完整的着色器程序 链接前, 连接到程序对象的着色器对象必须已成功编译 可以调用 glgetprogramiv() 函数以 GL_LINK_STATUS 为参数查询链接结果 可以调用 glgetprograminfolog() 函数查看链接信息日志 148

144 使用程序 void gluseprogram(gluint program); 使用着色器程序 program 进行渲染 program 为 0 时, 不使用任何着色器 当着色器程序在使用中时, 可以连接新的着色器对象或分离之前连接的着色器对象 ; 还可以重新链接 : 如果链接成功, 新的成功链接的着色器程序就会取代原先的活动程序 ; 如果链接失败, 当前绑定的着色器程序仍然活动, 不会被替换, 除非用 gluseprogram() 指定一个新的程序, 或者这个程序被成功地重新链接 149

145 清理函数 void gldeleteshader(gluint shader); 删除着色器对象 shader 如果着色器对象没有连接到任何着色器程序, 立即删除 ; 否则, 标记为删除 void gldetachshader(gluint program, GLuint shader); 把着色器对象 shader 从着色器程序 program 分离 如果着色器标记为删除, 且分离后没有连接到其他着色器, 则被删除 150

146 清理函数 void gldeleteprogram(gluint program); 如果着色器程序 program 当前并未在使用的渲染环境中使用, 立即删除 ; 否则, 标记为删除, 当它不再使用时再进行实际删除 当程序对象被删除时, 所有连接的着色器对象将被分离出来 编程技巧 : 一旦将着色器对象连接到着色器程序后就删除它们, 从而在删除着色器程序时, 所连接的着色器对象将自动分离并删除 151

147 查询函数 void glgetshaderiv(gluint shader, GLenum pname, GLint *params); 返回着色器对象 shader 参数为 pname 的属性值 pname params GL_SHADER_TYPE 着色器类型 :GL_VERTEX_SHADER GL_FRAGMENT_SHADER 或 GL_GEOMETRY_SHADER GL_DELETE_STATUS 删除状态 :GL_TRUE 当前标记为删除 GL_COMPILE_STATUS GL_INFO_LOG_LENGTH GL_SHADER_SOURCE_ LENGTH 编译状态 :GL_TRUE 之前的编译成功 信息日志的长度 ( 含 null),0 表示无日志 串联的源代码字符串的长度 ( 含 null 字符 ), 0 表示没加载源代码 152

148 查询函数 void glgetprogramiv(gluint program, GLenum pname, GLint *params); 返回着色器程序 program 参数为 pname 的属性 pname GL_DELETE_STATUS GL_LINK_STATUS GL_VALIDATE_STATUS GL_INFO_LOG_LENGTH GL_ATTACHED_SHADERS GL_ACTIVE_ATTRIBUTES GL_ACTIVE_UNIFORMS params 删除状态 :GL_TRUE 当前标记为删除 链接状态 :GL_TRUE 之前的链接成功 验证状态 :GL_TURE 之前的验证成功 信息日志的长度 ( 含 null),0 表示无日志 连接的着色对象的个数 活动属性变量的个数 活动一致变量的个数 153

149 查询函数 void glgetshaderinfolog(gluint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog); void glgetprograminfolog(gluint program, GLsizei bufsize, GLsizei *length, GLchar *infolog); infolog 返回着色器对象 shader 最后一次编译或着色器程序 program 最后一次链接的信息日志 缓冲区 infolog 的大小为 bufsize, 实际返回的日志字符数存放在 length 中 信息日志的字符数可由 glgetshaderiv() 或 glgetprogramiv() 查询得到 154

150 查询函数 void glgetshadersource(gluint shader, GLsizei bufsize, GLsizei *length, GLchar *source); source 返回着色器对象 shader 的源代码字符串 缓冲区 source 的大小为 bufsize, 实际的源代码字符数存放在 length 中 源代码字符串的长度可用 glgetshaderiv() 查询得到 155

151 查询函数 GLboolean glisshader(gluint shader); GLboolean glisprogram(gluint program); 检查 shader 或 program 是否是着色器对象或着色器程序的名称 void glvalidateprogram(gluint program); 验证着色器程序 program 是否可以在当前 OpenGL 环境中运行 如果验证通过, 着色器程序 program 的 GL_VALIDATE_STATUS 值置为 GL_TURE 156

152 着色器程序 创建程序对象 把着色器对象连接到程序对象 链接程序 验证链接是否成功 使用着色器 GLuint program = InitShader( "vshader21.glsl", "fshader21.glsl" ); gluseprogram( program ); 157

153 InitShader 函数 // Create a GLSL program object from vertex and fragment shader files GLuint InitShader(const char* vshaderfile, const char* fshaderfile) { struct Shader { const char* filename; GLenum type; GLchar* source; } shaders[2] = { { vshaderfile, GL_VERTEX_SHADER, NULL }, { fshaderfile, GL_FRAGMENT_SHADER, NULL } }; 158

154 InitShader 函数 ( 续 ) GLuint program = glcreateprogram(); for ( int i = 0; i < 2; ++i ) { Shader& s = shaders[i]; s.source=readshadersource(s.filename); if ( shaders[i].source == NULL ) { std::cerr << "Failed to read " << s.filename << std::endl; exit( EXIT_FAILURE ); } GLuint shader = glcreateshader(s.type); glshadersource( shader, 1, (const GLchar**) &s.source, NULL ); glcompileshader( shader ); if (!compiled ) { std::cerr << s.filename << " failed to compile:" << std::endl; GLint logsize; glgetshaderiv( shader, GL_INFO_LOG_LENGTH, &logsize ); char* logmsg = new char[logsize]; glgetshaderinfolog( shader, logsize, NULL, logmsg ); std::cerr << logmsg << std::endl; delete [] logmsg; exit( EXIT_FAILURE ); } GLint compiled; glgetshaderiv( shader, GL_COMPILE_STATUS, &compiled ); } delete [] s.source; glattachshader( program, shader ); 159

155 InitShader 函数 ( 续 ) /* link and error check */ gllinkprogram(program); GLint linked; glgetprogramiv( program, GL_LINK_STATUS, &linked ); if (!linked ) { std::cerr << "Shader program failed to link" << std::endl; GLint logsize; glgetprogramiv( program, GL_INFO_LOG_LENGTH, &logsize); char* logmsg = new char[logsize]; glgetprograminfolog( program, logsize, NULL, logmsg ); std::cerr << logmsg << std::endl; delete [] logmsg; } exit( EXIT_FAILURE ); /* use program object */ gluseprogram(program); return program; } 160

156 着色器源码读取函数 #include <stdio.h> char* readshadersource(const char* shaderfile) { FILE* fp = fopen(shaderfile, "r"); if (fp==null) return NULL; fseek(fp, 0L, SEEK_END); /* end of file */ long size = ftell(fp); fseek(fp, 0L, SEEK_SET); /* start of file */ char * buf = new char[size+1]; fread(buf, 1, size, fp); buf[size] = '\0'; /* null termination */ fclose(fp); return buf; } 161

157 第三章 OpenGL 编程 3.1 OpenGL 简介 3.2 完整程序 3.3 着色器基础 3.4 图元与属性 3.5 三维程序 162

158 3.4 图元与属性 图元 属性 视图 163

159 图元 最小系统观点 线段 多边形和文本 ( 字符串 ), 可硬件高效生成 复杂图元观点 圆 曲线 曲面和实体等复杂图元 OpenGL 核心库 : 点 线 多边形 GLU: 二次曲面 NURBS 曲面 GLUT: 笔划字符 点阵字符 164

160 图元 几何图元 : 点 线段 多边形 曲线和曲面 几何流水线 : 变换 裁剪 光栅化 图像图元 / 光栅图元 : 像素阵列 像素流水线 165

161 坐标系 最初的图形系统要求用户直接按照显示设备的单位来确定所有的信息 设备无关图形学 顶点坐标在对象坐标系或世界坐标系中定义 顶点坐标最终映射成窗口坐标或屏幕坐标 166

162 OpenGL 的几何图元 点 :GL_POINTS 线段 :GL_LINES 开折线 :GL_LINE_STRIP 闭合折线 :GL_LINE_LOOP 167

163 多边形 多边形的显示方式 : 绘制边 用单色或模式填充 确保正确显示的多边形 简单的 凸的 平面的 168

164 定义多边形的限制条件 简单性 : 边除顶点外不相交 凸性 : 对于多边形中任意两点, 连接这两点的线段完全在多边形内 平面性 : 所有顶点在同一平面上 三角形满足上述所有限制条件 169

165 多边形测试 用户自己确保上述条件满足 如果不满足上述要求,OpenGL 也会有输出, 只是结果看起来与期望的不同 多边形的简单性和凸性概念上简单, 但检测的代价很高 大部分图形系统要求应用程序来完成检验 170

166 OpenGL 中的多边形 三角形是现代 OpenGL 支持的唯一多边形, 满足上述所有限制条件 三种绘制模式 点模式 :GL_POINT 线模式 :GL_LINE 填充模式 :GL_FILL, 默认 使用 glpolygonmode 函数指定绘制模式 171

167 OpenGL 中的三角形 三角形 :GL_TRIANGLES, 相邻的三个顶点组合在一起被解释为一个三角形 三角形带 :GL_TRIANGLE_STRIP, 每个顶点和之前两个顶点定义一个三角形 三角形扇 :GL_TRIANGLE_FAN, 第一个顶点是公共顶点 172

168 OpenGL 几何图元 173

169 球面的多边形近似 单位球面的参数表达 : x(θ,φ)=sinθ cosφ y(θ,φ)=cosθ cosφ z(θ,φ)=sinφ 其中 0 θ 2π, 0 φ π 中间四边形带 -> 三角形带 两极处三角形扇 174

170 三角剖分 当前的 OpenGL 版本只绘制三角形 对一般多边形, 应用程序必须把它剖分成一组三角形 OpenGL 4.1 引入 tessellator 175

171 三角形的质量 狭长的三角形会导致差的绘制效果 等边三角形绘制效果好 最大化最小角 对无结构点集,Delaunay 三角剖分算法能得到一组最优的三角形 176

172 凸多边形的三角剖分 递归的方式进行剖分 177

173 曲线与曲面 图元都是由顶点来定义的 使用已有的图元来近似曲线和曲面 正 n 边形来近似圆 三角形和四边形来近似球面 多边形网格来近似曲面 从数学定义出发, 编写图形函数来生成 二次曲面 NURBS 曲线 / 曲面 OpenGL 中,GLU 库和 GLUT 库提供了对常见曲面的一些近似 178

174 文本 笔划文本 : 矢量字体, 字符轮廓是线段或曲线 几何图元, 变换和观察操作 光栅文本 : 点阵字体, 字符定义为 0 和 1 的矩形阵列 光栅图元 GLUT 库提供预定义好的笔划字符集和光栅字符集 179

175 3.4 图元与属性 图元 属性 视图 180

176 属性 属性 (attribute) 决定图元将如何绘制,OpenGL 状态的一部分 点 : 颜色 大小 线段 : 颜色 宽度 模式 ( 实线 虚线 ) 多边形 : 绘制模式 填充模式 笔划文本 : 字体 字号 方向 181

177 点的属性 默认情况下, 点被画成屏幕上的 1 个像素 点本身没有面积,OpenGL 通过显示屏幕 ( 或绘制缓存 ) 上的一个四边形区域来模拟 如果某个采样值落入窗口坐标系中以点位置为中心的四边形中, 则该采样值被点所覆盖 四边形区域的边长等于点的大小 void glpointsize(glfloat size); 设置被渲染点的大小, 以像素为单位 size 必须大于 0.0, 默认值为 1.0 如果开启了 GL_PROGRAM_POINT_SIZE 状态, 使用着色器内置变量 gl_pointsize 的值 182

178 线段的属性 void gllinewidth(glfloat width); 以像素为单位设置线段的固定宽度, 默认值是 1.0 width 参数必须大于 0.0 如果线段宽度大于 1, 那么线段将被水平或垂直复制 width 次 如果线段为 y 主序 ( 斜率大于 1), 那么水平方向复制 ; 如果 x 主序, 则垂直方向复制 如果开启反走样 glenable(gl_line_smooth), 那么线段将被视为沿着线方向对齐的矩形块, 其宽度等于当前设置的线宽 183

179 多边形的属性 多边形有正面和背面两个面 取决于哪一面朝向观察者, 渲染结果可能是不一样的 void glpolygonmode(glenum face, GLenum mode); 控制多边形正面和背面的绘制模式, 默认为正面和背面的绘制都使用填充模式 face 必须是 GL_FRONT_AND_BACK mode 可以是 GL_POINT, GL_LINE 或 GL_FILL, 表示多边形被画成点 轮廓还是填充形式, 默认值为 GL_FILL 184

180 多边形的正面 按照约定, 多边形的正面在屏幕上应该是逆时针方向排列的 void glfrontface(glenum mode); 控制多边形正面的判断方式 mode 默认为 GL_CCW, 表示窗口坐标上投影多边形的顶点顺序为逆时针方向的面为正面 如果 mode 为 GL_CW, 顶点顺序为顺时针方向 (clockwise) 的面被认为是正面 185

181 多边形的剔除 对于一个由方向一致的不透明多边形组成的完全闭合的模型表面, 所有的背面多边形都是不可见的, 因为它们总是被正面多边形所遮挡 如果观察者位于模型的外侧, 可以启用剔除功能来丢弃 OpenGL 认为是背面的多边形 类似地, 如果观察者位于模型内部, 那么只有背面多边形是可见的 186

182 多边形的剔除 void glcullface(glenum mode); 指定哪类多边形在转换到屏幕坐标之前应该剔除 mode 可以是 GL_FRONT, GL_BACK 或 GL_FRONT_AND_BACK, 分别表示正面 背面或所有多边形 默认为 GL_BACK mode 为 GL_FRONT_AND_BACK 时, 没有多边形会被绘制, 但会绘制点和线段图元 使用 glenable(gl_cull_face) 来开启剔除功能, 使用 gldisable(gl_cull_face) 来关闭 187

183 RGB 颜色 颜色的每个分量在帧缓冲区中是分开存储的 在缓冲区中通常每个分量占用 8 位字节 颜色值用 float 表示的变化范围是从 0.0( 无 ) 到 1.0( 全部 ), 而用 unsigned byte 表示的变化范围是从 0 到

184 RGBA 颜色 第四个分量 (A 或者 α) 是不透明度或透明度 完全透明 :A=0.0 完全不透明 :A=1.0 和 RGB 值一样存储在帧缓冲区中 用于图像融合 设置清屏颜色 ( 背景色 ), 默认黑色 : glclearcolor(0.0, 0.0, 0.0, 1.0); 189

185 索引颜色 由一组 RGB 值构成一张表, 颜色 是表中项的索引 需要更少的帧缓存 索引通常只有 8 位 现在重要性下降 内存价格下降 需要更多的颜色 190

186 着色模型 默认状态是平滑着色 OpenGL 根据多边形顶点的颜色插值出来内部的颜色 另一种状态是平面着色 第一个顶点的颜色确定填充颜色 在着色器中处理 191

187 设置颜色 颜色最终在片段着色器中被设定, 但可以由着色器或应用程序来设置 应用程序颜色 : 以 uniform 变量或顶点属性的形式传送到顶点着色器 顶点着色器颜色 : 以 out 变量的形式传到片段着色器 片段颜色 : 可通过着色器代码修改 192

188 3.4 图元与属性 图元 属性 视图 193

189 视图 ( 观察 ) 虚拟照相机模型 : 对象与照相机独立 应用程序只需关心对象和照相机的参数设置 OpenGL 默认视图 : 正交投影 镜头焦距无限大, 无限远离对象 极限情形下, 投影线彼此平行, 投影中心变为投影方向 194

190 OpenGL 中的照相机 照相机被放置在对象坐标系的原点, 指向 z 轴的负方向 默认的视景体是一个中心在原点, 边长为 2 的立方体 正交投影可以对位于照相机后面的对象成像 195

191 正交视图 在正交视图 (OpenGL 默认视图 ) 中, 点沿着 z 轴投影到 z=0 的平面上 z=0 196

192 二维视图 二维图形是三维图形的特殊情形 三维视景体退化为视图矩形或裁减矩形 视图矩形 平面 z=0 197

193 变换与视图 在 OpenGL 中投影是利用投影矩阵乘法 ( 变换 ) 进行的 变换函数也用于坐标系的改变 OpenGL 3.0 之前版本有一套变换函数, 目前已被弃用 现在有三种方式来设置变换 : 应用程序代码 GLSL 函数 vec.h 和 mat.h 198

194 第三章 OpenGL 编程 3.1 OpenGL 简介 3.2 完整程序 3.3 着色器基础 3.4 图元与属性 3.5 三维程序 199

195 3.5 三维图形程序 Sierpinski 镂垫 隐藏面消除 200

196 三维图形应用程序 在 OpenGL 中二维应用程序是三维应用程序的特殊情形 要得到三维图形应用程序 只需对前面程序进行很小的修改 使用 vec3, gluniform3f 等 必须考虑多边形绘制的顺序或者启用隐藏面消除功能 201

197 Sierpinski 镂垫 (2D) 给定一个三角形, 构造过程如下 : 1. 在三角形内随机选择一个初始点 p(x,y,0) 2. 随机选择三个顶点之一 3. 找出 p 和随机选择的顶点连线的中点 q 4. 把中点 q 显示出来 5. 用中点 q 替换 p 6. 转到步骤

198 绘制程序 在白色背景上绘制红色的点 203

199 init() 函数 const int NumPoints = 5000; void init( void ) { vec2 points[numpoints]; // Specifiy the vertices for a triangle vec2 vertices[3] = { vec2( -1.0, -1.0 ), vec2( 0.0, 1.0 ), vec2( 1.0, -1.0 ) }; // Select an arbitrary initial point inside of the triangle points[0] = vec2( 0.25, 0.50 ); 204

200 init() 函数 // compute and store N-1 new points for ( int i = 1; i < NumPoints; ++i ) { int j = rand() % 3; // pick a vertex at random } // Compute the point halfway between the selected vertex and the previous point points[i] = ( points[i - 1] + vertices[j] ) / 2.0; // Create a vertex array object // Create and initialize a buffer object // Load shaders and use the resulting shader program // Initialize the vertex position attribute from the vertex shader } glclearcolor( 1.0, 1.0, 1.0, 1.0 ); // white background 205

201 display() 函数 void display( void ) { glclear( GL_COLOR_BUFFER_BIT ); // clear the window gldrawarrays( GL_POINTS, 0, NumPoints ); // draw the points glflush(); } main() 函数和以前的例子完全相同 206

202 Sierpinski 镂垫 (2D) 递归方法 从一个三角形开始 连接三边的中点并去掉中间的三角形 重复上述过程 207

203 五次细分后的结果 208

204 分形 考虑黑色填充区域的面积与周长 ( 即包含填充区域的所有线段总长 ) 当持续细分时 面积趋向于零 但周长趋向于无穷 因此无穷细分后的结果不是通常的几何形状 它的维数既不是一维的, 也不是二维的 我们称之为分形 ( 分数维 1.585) 209

205 init() 函数 const int NumTimesToSubdivide = 5; const int NumTriangles = 243; // 3^5 triangles generated const int NumVertices = 3 * NumTriangles; vec2 points[numvertices]; int Index = 0; void init( void ) { vec2 vertices[3] = { vec2( -1.0, -1.0 ), vec2( 0.0, 1.0 ), vec2( 1.0, -1.0 ) }; } // Subdivide the original triangle divide_triangle( vertices[0], vertices[1], vertices[2], NumTimesToSubdivide );... glclearcolor( 1.0, 1.0, 1.0, 1.0 ); /* white background */ 210

206 三角形细分 void divide_triangle( const vec2& a, const vec2& b, const vec2& c, int count ) { if ( count > 0 ) { vec2 v0 = ( a + b ) / 2.0; vec2 v1 = ( a + c ) / 2.0; vec2 v2 = ( b + c ) / 2.0; divide_triangle( a, v0, v1, count - 1 ); divide_triangle( c, v1, v2, count - 1 ); divide_triangle( b, v2, v0, count - 1 ); } else { triangle( a, b, c ); // draw triangle at end of recursion } } 211

207 绘制三角形 void triangle( const vec2& a, const vec2& b, const vec2& c ) { points[index++] = a; points[index++] = b; points[index++] = c; } void display( void ) { glclear( GL_COLOR_BUFFER_BIT ); // clear the window gldrawarrays( GL_TRIANGLES, 0, NumPoints ); // draw the triangles glflush(); } main() 函数和以前的例子完全相同 212

208 改变到三维的情形 通过下述修改, 可以很容易地把程序生成三维图形 : vec3 vertices[3] 但这并不没有多大实质性改变 (2D!) 下面从四面体开始迭代 213

209 三维镂垫 - 随机方法 随机方法 : 4 个顶点定义四面体 显示与某顶点连线的中点 214

210 产生新点 const int NumPoints = 10000; void init( void ) { vec3 points[numpoints]; // Specifiy the vertices for a tetrahedron vec3 vertices[] = { vec3( -0.5, -0.5, -0.5 ), vec3( 0.5, -0.5, -0.5 ), vec3( 0.0, 0.5, 0.0 ), vec3( 0.0, -0.5, 0.5 ) }; // Select an arbitrary initial point inside of the triangle points[0] = vec3( 0.0, 0.0, 0.0 ); // compute and store N-1 new points for ( int i = 1; i < NumPoints; ++i ) { int j = rand() % 4; // pick a vertex at random // Compute the point halfway between the selected vertex and the previous point points[i] = ( points[i - 1] + vertices[j] ) / 2.0; }... } 215

211 着色器 #version 150 in vec4 vposition; out vec4 color; void main() { color = vec4( vposition.x, vposition.y, vposition.z, 1.0 ); gl_position = vposition; } #version 150 in vec4 color; out vec4 fcolor; void main() { fcolor = color; } 216

212 结果 217

213 三维镂垫 - 迭代方法 细分四面体的四个面 看起来好像是把四面体的中心移走, 留下四个小四面体 218

214 面细分 vs 体细分 在前面的例子中, 我们对每个表面进行细分 也可以利用相同的中点对体进行细分 各边中点以及四面体的中点定义了四个小四面体, 每个小四面体与大四面体的一个顶点对应 保留这四个小四面体, 把其它的去掉 219

215 体细分 220

216 绘制四面体 void tetra( const vec3& a, const vec3& b, const vec3& c, const vec3& d ) { triangle( a, b, c, 0 ); triangle( a, c, d, 1 ); triangle( a, d, b, 2 ); triangle( b, d, c, 3 ); } 221

217 绘制三角形 vec3 points[numvertices]; vec3 colors[numvertices]; int Index = 0; void triangle( const vec3& a, const vec3& b, const vec3& c, const int color ) { // 每个面赋以一种颜色 static vec3 base_colors[] = { vec3( 1.0, 0.0, 0.0 ), vec3( 0.0, 1.0, 0.0 ), vec3( 0.0, 0.0, 1.0 ), vec3( 0.0, 0.0, 0.0 ) }; } points[index] = a; colors[index] = base_colors[color]; Index++; points[index] = b; colors[index] = base_colors[color]; Index++; points[index] = c; colors[index] = base_colors[color]; Index++; 222

218 细分代码 void divide_tetra( const vec3& a, const vec3& b, const vec3& c, const vec3& d, int count ) { if ( count > 0 ) { vec3 v0 = ( a + b ) / 2.0; vec3 v1 = ( a + c ) / 2.0; vec3 v2 = ( a + d ) / 2.0; vec3 v3 = ( b + c ) / 2.0; vec3 v4 = ( c + d ) / 2.0; vec3 v5 = ( b + d ) / 2.0; divide_tetra( a, v0, v1, v2, count - 1 ); divide_tetra( v0, b, v3, v5, count - 1 ); divide_tetra( v1, v3, c, v4, count - 1 ); divide_tetra( v2, v4, v5, d, count - 1 ); } else { tetra( a, b, c, d ); // draw tetrahedron at end of recursion } } 223

219 顶点数据和颜色数据 // Create a vertex array object GLuint vao; glgenvertexarrays( 1, &vao ); glbindvertexarray( vao ); // Create and initialize a buffer object GLuint buffer; glgenbuffers( 1, &buffer ); glbindbuffer( GL_ARRAY_BUFFER, buffer ); // First, we create an empty buffer of the size we need by passing a NULL pointer for the data values glbufferdata( GL_ARRAY_BUFFER, sizeof(points) + sizeof(colors), NULL, GL_STATIC_DRAW ); // Next, we load the real data in parts. glbuffersubdata( GL_ARRAY_BUFFER, 0, sizeof(points), points ); glbuffersubdata( GL_ARRAY_BUFFER, sizeof(points), sizeof(colors), colors ); 224

220 顶点数据和颜色数据 ); // Load shaders and use the resulting shader program GLuint program = InitShader( "vshader24.glsl", "fshader24.glsl" gluseprogram( program ); // Initialize the vertex position attribute from the vertex shader GLuint vposition = glgetattriblocation( program, "vposition" ); glenablevertexattribarray( vposition ); glvertexattribpointer( vposition, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) ); // Likewise, initialize the vertex color attribute. GLuint vcolor = glgetattriblocation( program, "vcolor" ); glenablevertexattribarray( vcolor ); glvertexattribpointer( vcolor, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(points)) ); 225

221 着色器 #version 150 #version 150 in vec4 vposition; in vec3 vcolor; out vec4 color; void main() { gl_position = vposition; color = vec4( vcolor, 1.0 ); } in vec4 color; out vec4 fcolor; void main() { fcolor = color; } 226

222 结果 五次迭代后 227

223 3.5 三维图形程序 Sierpinski 镂垫 隐藏面消除 230

224 问题 由于三角形是按照在程序中定义的顺序画出的, 本来在前面的三角形并不是显示在位于它后面的三角形的前面 231

225 隐藏面消除 只想见到那些位于其它面前面的曲面或平面片 OpenGL 采用称为 z 缓冲区算法进行隐藏面消除, 在 z 缓冲区中存贮着对象的深度信息, 从而只有前面的对象出现在图像中 232

226 Z 缓冲区算法 该算法创建专门的缓冲区 ( 称为 z 缓冲区 ), 当几何体经过流水线各步骤时, 存储着该几何体的深度信息 启用该算法的要素 在 main() 中, 显示模式初始化语句改为 glutinitdisplaymode(glut_single GLUT_RGB GLUT_DEPTH); 在 init() 中激活 Z-Buffer 隐藏面消除算法 glenable(gl_depth_test); 在显示回调函数中清空深度缓冲区 glclear(gl_color_buffer_bit GL_DEPTH_BUF FER_BIT); 233

计算机图形学

计算机图形学 高级计算机图形学 中国科学技术大学计算机学院 黄章进 [email protected] 第十章之第二节 GLSL(I) 内容 着色器应用程序 顶点着色器 片段着色器 着色器编程 OpenGL 端的着色语言 API 顶点着色器应用 顶点的移动 变形 (morphing) 波动 分形 光照 更真实的模型 卡通着色器 片段着色器应用 逐片段进行光照计算 逐顶点光照计算 逐片段光照计算 片段着色器应用

More information

Microsoft PowerPoint - cg_ch09_02

Microsoft PowerPoint - cg_ch09_02 2011-2012 2012 年度第二学期 00106501 计算机图形学 童伟华管理科研楼 1205 室 E-mail: [email protected] 中国科学技术大学数学科学学院 http://math.ustc.edu.cn/ 第二节 GLSL(I) 2 顶点着色器应用 顶点的移动 变形 (morphing) 波动 分形 光照 更真实的模型 卡通着色器 3 片段着色器应用 逐片段进行光照计算

More information

슬라이드 1

슬라이드 1 2018-2019 年度第二学期 00106501 计算机图形学 童伟华管理科研楼 1205 室 E-mail: [email protected] 中国科学技术大学数学科学学院 http://math.ustc.edu.cn/ 第二节 GLSL(I) 2 顶点着色器应用 顶点的移动 变形 (morphing) 波动 分形 光照 更真实的模型 卡通着色器 3 片段着色器应用 逐片段进行光照计算 逐顶点光照计算

More information

Microsoft PowerPoint - cg_ch02_01

Microsoft PowerPoint - cg_ch02_01 2011-2012 2012 年度第二学期 00106501 计算机图形学 童伟华管理科研楼 1205 室 E-mail: [email protected] 中国科学技术大学数学科学学院 http://math.ustc.edu.cn/ 第二章 图形编程简介 (OpenGL) 2 第一节 图形编程接口发展简史 3 GKS(1980s 1980s) IFIPS (1973) 组织了两个委员会建立图形

More information

PowerPoint Presentation

PowerPoint Presentation 计算机图形学 计算机学院黄章进 [email protected] 第三章 OpenGL 编程 3.1 OpenGL 简介 3.2 完整的程序 3.3 三维图形程序 2 3.1 OpenGL 简介 3.1.1 图形 API 的发展 3.1.2 OpenGL 的体系结构 3.1.3 OpenGL 的函数 3.1.4 一个简单例子 3.1.5 安装编译说明 3 GKS(1980s) IFIPS (1973)

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

高级计算机图形学

高级计算机图形学 高级计算机图形学 讲授 : 董兰芳研究方向 : 科学计算可视化图形 图像处理模式识别 Telephone:0551-3603484 Email:[email protected] Homepage: http://staff.ustc.edu.cn/~lfdong 中国科学技术大学视觉计算与可视化实验室 1 第二章图形学编程 2.1 OpenGL 简介 2.2 Siepinski 镂垫 2.3 编写二维图形应用程序

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

OpenGL Render

OpenGL Render Outline 一般繪圖方式 硬體加速繪圖方式 Display List Vertex Array 序列式 : gldrawarrays 索引式 : gldrawelements Vertex Buffer Object (VBO) 序列式 索引式 Callback Function 2014/12/18 2 一般繪圖方式 glbegin(gl_triangles); for(int i = 0;

More information

概述

概述 OPC Version 1.6 build 0910 KOSRDK Knight OPC Server Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9 OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOS_Init...5 2.2.2 KOS_InitB...5 2.2.3

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: [email protected] 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: [email protected] 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

Outline 三角網格資料結構 一般繪圖方式 硬體加速繪圖方式 Display List Vertex Array 序列式 :gldrawarrays 索引式 :gldrawelements Vertex Buffer Object 序列式 索引式

Outline 三角網格資料結構 一般繪圖方式 硬體加速繪圖方式 Display List Vertex Array 序列式 :gldrawarrays 索引式 :gldrawelements Vertex Buffer Object 序列式 索引式 Chapter 11 It s all about the pipeline: Faster geometry throughput Outline 三角網格資料結構 一般繪圖方式 硬體加速繪圖方式 Display List Vertex Array 序列式 :gldrawarrays 索引式 :gldrawelements Vertex Buffer Object 序列式 索引式 三角網格資料結構

More information

绘制OpenCascade中的曲线

绘制OpenCascade中的曲线 在 OpenSceneGraph 中绘制 OpenCascade 的曲线 Draw OpenCascade Geometry Curves in OpenSceneGraph [email protected] 摘要 Abstract: 本文简要说明 OpenCascade 中几何曲线的数据, 并将这些几何曲线在 OpenSceneGraph 中绘制出来 关键字 KeyWords:OpenCascade Geometry

More information

chap02_part2

chap02_part2 第二章繪圖程式 Chapter 2: Graphics Programming 1 WebGL 程式設計步驟 Step 1: 程式初始化 Step 2: 計算頂點座標與色彩 Step 3: 座標處理 - Step 3.1: 將座標資料送至 GPU - Step 3.2: 通知 shader 取得座標資料方式 Step 4: 色彩處理 - Step 4.1: 將色彩資料送至 GPU - Step 4.2:

More information

高级计算机图形学

高级计算机图形学 高级计算机图形学 讲授 : 董兰芳研究方向 : 科学计算可视化图形 图像处理模式识别 Telephone:0551-3603484 Email:[email protected] Homepage: http://staff.ustc.edu.cn/~lfdong 中国科学技术大学视觉计算与可视化实验室 1 第四章几何对象和变换 (3)( 4.9 变换的级联 4.10 OpenGL 变换矩阵 4.11

More information

C++ 程式設計

C++ 程式設計 C C 料, 數, - 列 串 理 列 main 數串列 什 pointer) 數, 數, 數 數 省 不 不, 數 (1) 數, 不 數 * 料 * 數 int *int_ptr; char *ch_ptr; float *float_ptr; double *double_ptr; 數 (2) int i=3; int *ptr; ptr=&i; 1000 1012 ptr 數, 數 1004

More information

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc References (Section 5.2) Hsuan-Tien Lin Deptartment of CSIE, NTU OOP Class, March 15-16, 2010 H.-T. Lin (NTU CSIE) References OOP 03/15-16/2010 0 / 22 Fun Time (1) What happens in memory? 1 i n t i ; 2

More information

Microsoft PowerPoint - OpenGL简介.ppt [兼容模式]

Microsoft PowerPoint - OpenGL简介.ppt [兼容模式] OpenGL 简介 刘世光 天津大学计算机学院 OpenGL 简介 1 简介 2 OpenGL 基本程序结构 3 OpenGL 程序设计入门 1 简介 1.1 什么是 OpenGL? OpenGL 是一个功能强大的开放图形库 (Open Graphics Library) 其前身是 SGI 公司为其图形工作站开发的 IRIS GL 为使其能够更加容易地移植到不同的硬件和操作系统,SGI 开发了 OpenGL

More information

OpenGL三维图形编程

OpenGL三维图形编程 OpenGL 三维图形编程基础 OpenGL 概述 主讲 : 李胜 参考书 OpenGL 编程指南, 机械工业出版社, 俗称 OpenGL 红宝书 第三章 OpenGL 概述 OpenGL 发展历史 OpenGL 基本特点 OpenGL 与 DirectX OpenGL 基本功能 OpenGL 语法特点 OpenGL 状态机制 OpenGL 渲染流水线 OpenGL 相关函数库 使用 GLUT 函数库

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2 PowerBuilder 9 PowerBuilder Native Interface(PBNI) PowerBuilder 9 PowerBuilder C++ Java PowerBuilder 9 PBNI PowerBuilder Java C++ PowerBuilder NVO / PowerBuilder C/C++ PowerBuilder 9.0 PowerBuilder Native

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

6-1 Table Column Data Type Row Record 1. DBMS 2. DBMS MySQL Microsoft Access SQL Server Oracle 3. ODBC SQL 1. Structured Query Language 2. IBM

6-1 Table Column Data Type Row Record 1. DBMS 2. DBMS MySQL Microsoft Access SQL Server Oracle 3. ODBC SQL 1. Structured Query Language 2. IBM CHAPTER 6 SQL SQL SQL 6-1 Table Column Data Type Row Record 1. DBMS 2. DBMS MySQL Microsoft Access SQL Server Oracle 3. ODBC SQL 1. Structured Query Language 2. IBM 3. 1986 10 ANSI SQL ANSI X3. 135-1986

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; Memory & Pointer [email protected] 2.1 2.1.1 1 int *p int a 0x00C7 0x00C7 0x00C7 2.1.2 2 int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; 2.1.3 1. 2. 3. 3 int A,

More information

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式] 指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! C++

More information

C 1

C 1 C homepage: xpzhangme 2018 5 30 C 1 C min(x, y) double C // min c # include # include double min ( double x, double y); int main ( int argc, char * argv []) { double x, y; if( argc!=

More information

untitled

untitled Ogre Rendering System http://antsam.blogone.net [email protected] geometry systemmaterial systemshader systemrendering system API API DirectX OpenGL API Pipeline Abstraction API Pipeline Pipeline configurationpipeline

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

概述

概述 OPC Version 1.8 build 0925 KOCRDK Knight OPC Client Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9 OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOC_Init...5 2.2.2 KOC_Uninit...5 2.3...5

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

第四章 102 图 4唱16 基于图像渲染的理论基础 三张拍摄图像以及它们投影到球面上生成的球面图像 拼图的圆心是相同的 而拼图是由球面图像上的弧线图像组成的 因此我 们称之为同心球拼图 如图 4唱18 所示 这些拼图中半径最大的是圆 Ck 最小的是圆 C0 设圆 Ck 的半径为 r 虚拟相机水平视域为 θ 有 r R sin θ 2 4畅11 由此可见 构造同心球拼图的过程实际上就是对投影图像中的弧线图像

More information

Microsoft PowerPoint - string_kruse [兼容模式]

Microsoft PowerPoint - string_kruse [兼容模式] Strings Strings in C not encapsulated Every C-string has type char *. Hence, a C-string references an address in memory, the first of a contiguous set of bytes that store the characters making up the string.

More information

计算机图形学

计算机图形学 高级计算机图形学 中国科学技术大学计算机学院 黄章进 [email protected] 第十章之第四节 GLSL(III) 2 内容 OpenGL 与着色器的通信 attribute 变量 uniform 变量 着色器示例 顶点着色器 片段着色器 3 连接着色器与 OpenGL 调用 glcreateshader 创建着色器对象 调用 glshadersource 为着色器加载源代码 调用 glcompileshader

More information

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式] 函数 Function 如何重用代码 How to reuse code 3 4 = 3*3*3*3 3 4,6 5 : 拷贝 - 粘帖代码 (Copy-paste code) 3 4,6 5,12 10 : 拷贝 - 粘帖代码 (Copy-paste code) Bad! 使用函数 (with a function) 使用函数 (with a function) 使用函数 (with a function)

More information

新版 明解C++入門編

新版 明解C++入門編 511!... 43, 85!=... 42 "... 118 " "... 337 " "... 8, 290 #... 71 #... 413 #define... 128, 236, 413 #endif... 412 #ifndef... 412 #if... 412 #include... 6, 337 #undef... 413 %... 23, 27 %=... 97 &... 243,

More information

mvc

mvc Build an application Tutor : Michael Pan Application Source codes - - Frameworks Xib files - - Resources - ( ) info.plist - UIKit Framework UIApplication Event status bar, icon... delegation [UIApplication

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: [email protected] 9 [P.11] : Dev C++ [P.12] : http://c.feis.tw [P.13] [P.14] [P.15] [P.17] [P.23] Dev C++ [P.24] [P.27] [P.34] C / C++ [P.35] 10 C / C++ C C++ C C++ C++ C ( ) C++

More information

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo [email protected] https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

高级计算机图形学

高级计算机图形学 高级计算机图形学 讲授 : 董兰芳研究方向 : 科学计算可视化图形 图像处理模式识别 Telephone:0551-3603484 Email:[email protected] Homepage: http://staff.ustc.edu.cn/~lfdong 中国科学技术大学视觉计算与可视化实验室 1 第三章输入和交互 (2)( 3.8 拾取 3.9 CAD 示例 3.10 建立交互模型 3.11

More information

Microsoft Word - 3D手册2.doc

Microsoft Word - 3D手册2.doc 第 一 章 BLOCK 前 处 理 本 章 纲 要 : 1. BLOCK 前 处 理 1.1. 创 建 新 作 业 1.2. 设 定 模 拟 控 制 参 数 1.3. 输 入 对 象 数 据 1.4. 视 图 操 作 1.5. 选 择 点 1.6. 其 他 显 示 窗 口 图 标 钮 1.7. 保 存 作 业 1.8. 退 出 DEFORMTM3D 1 1. BLOCK 前 处 理 1.1. 创 建

More information

高级计算机图形学

高级计算机图形学 高级计算机图形学 讲授 : 董兰芳研究方向 : 科学计算可视化图形 图像处理模式识别 Telephone:0551-3603484 Email:[email protected] Homepage: http://staff.ustc.edu.cn/~lfdong 中国科学技术大学视觉计算与可视化实验室 1 高级计算机图形学 目标 计算机图形学的理论和算法 OpenGL 学习 建立真实感计算机图形预修知识

More information

untitled

untitled 2006 6 Geoframe Geoframe 4.0.3 Geoframe 1.2 1 Project Manager Project Management Create a new project Create a new project ( ) OK storage setting OK (Create charisma project extension) NO OK 2 Edit project

More information

untitled

untitled A, 3+A printf( ABCDEF ) 3+ printf( ABCDEF ) 2.1 C++ main main main) * ( ) ( ) [ ].* ->* ()[] [][] ** *& char (f)(int); ( ) (f) (f) f (int) f int char f char f(int) (f) char (*f)(int); (*f) (int) (

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN:978-7-302-13599-9, 红色封面 答案制作时间 :2011 年 2 月 -5 月 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p=&a 2. 设已定义 int x,*p=&x;, 则下列表达式中错误的是 :B)&*x 3. 若已定义 int a=1,*b=&a;,

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 [email protected] C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

3.1 num = 3 ch = 'C' 2

3.1 num = 3 ch = 'C' 2 Java 1 3.1 num = 3 ch = 'C' 2 final 3.1 final : final final double PI=3.1415926; 3 3.2 4 int 3.2 (long int) (int) (short int) (byte) short sum; // sum 5 3.2 Java int long num=32967359818l; C:\java\app3_2.java:6:

More information

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx 运算符重载 Operator Overloading class Point { public: ; double x_, y_; Why Operator Overloading? Point (double x =0, double y = 0):x_(x),y_(y) { int main(){ Point a(1., 2), b(3,4); Point c = a + b; return 0;

More information

epub 94-3

epub 94-3 3 A u t o C A D L AY E R L I N E T Y P E O S N A P S T Y L E X R E F - AutoLISP Object ARX A u t o C A D D C L A u t o C A D A u t o d e s k P D B D C L P D B D C L D C L 3.1 Wi n d o w s A u t o C A D

More information

untitled

untitled 1 DBF (READDBF.C)... 1 2 (filetest.c)...2 3 (mousetes.c)...3 4 (painttes.c)...5 5 (dirtest.c)...9 6 (list.c)...9 1 dbf (readdbf.c) /* dbf */ #include int rf,k,reclen,addr,*p1; long brec,erec,i,j,recnum,*p2;

More information

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO Car DVD New GUI IR Flow User Manual V0.1 Jan 25, 2008 19, Innovation First Road Science Park Hsin-Chu Taiwan 300 R.O.C. Tel: 886-3-578-6005 Fax: 886-3-578-4418 Web: www.sunplus.com Important Notice SUNPLUS

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

科学计算的语言-FORTRAN95

科学计算的语言-FORTRAN95 科 学 计 算 的 语 言 -FORTRAN95 目 录 第 一 篇 闲 话 第 1 章 目 的 是 计 算 第 2 章 FORTRAN95 如 何 描 述 计 算 第 3 章 FORTRAN 的 编 译 系 统 第 二 篇 计 算 的 叙 述 第 4 章 FORTRAN95 语 言 的 形 貌 第 5 章 准 备 数 据 第 6 章 构 造 数 据 第 7 章 声 明 数 据 第 8 章 构 造

More information

新・明解C言語入門編『索引』

新・明解C言語入門編『索引』 !... 75!=... 48 "... 234 " "... 9, 84, 240 #define... 118, 213 #include... 148 %... 23 %... 23, 24 %%... 23 %d... 4 %f... 29 %ld... 177 %lf... 31 %lu... 177 %o... 196 %p... 262 %s... 242, 244 %u... 177

More information

untitled

untitled MODBUS 1 MODBUS...1 1...4 1.1...4 1.2...4 1.3...4 1.4... 2...5 2.1...5 2.2...5 3...6 3.1 OPENSERIAL...6 3.2 CLOSESERIAL...8 3.3 RDMULTIBIT...8 3.4 RDMULTIWORD...9 3.5 WRTONEBIT...11 3.6 WRTONEWORD...12

More information

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p NOWOER.OM /++ 程师能 评估. 单项选择题 1. 下 描述正确的是 int *p1 = new int[10]; int *p2 = new int[10](); p1 和 p2 申请的空间 的值都是随机值 p1 和 p2 申请的空间 的值都已经初始化 p1 申请的空间 的值是随机值,p2 申请的空间 的值已经初始化 p1 申请的空间 的值已经初始化,p2 申请的空间 的值是随机值 2.

More information

c_cpp

c_cpp C C++ C C++ C++ (object oriented) C C++.cpp C C++ C C++ : for (int i=0;i

More information

劳动保护与医疗保健 第 二 章 止标志共 23 个 劳 动 安 全 技 术 22 2 警告标志 由于三角形引人注目 故用作 警告 标志 警告人们注意可能发生的多种危险 三角的背景使用黄色 三角图形和三角内的图像均用黑色描 绘 黄色是有警告含义的颜色 在对比色黑色的衬托下 绘成的 警告标志 就更引人注目 3 指令标志 在圆形内配上指令含义的颜色 蓝 色 并用白色绘制必须执行的图形符号 构成 指令标志

More information

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C 40 30 10 Project 30 C Project 3 60 Project 40

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C 40 30 10 Project 30 C Project 3 60 Project 40 C C [email protected] C C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C 40 30 10 Project 30 C Project 3 60 Project 40 Week3 C Week5 Week5 Memory & Pointer

More information

TX-NR3030_BAS_Cs_ indd

TX-NR3030_BAS_Cs_ indd TX-NR3030 http://www.onkyo.com/manual/txnr3030/adv/cs.html Cs 1 2 3 Speaker Cable 2 HDMI OUT HDMI IN HDMI OUT HDMI OUT HDMI OUT HDMI OUT 1 DIGITAL OPTICAL OUT AUDIO OUT TV 3 1 5 4 6 1 2 3 3 2 2 4 3 2 5

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac)

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) 复习 面向对象编程 将实际问题分解成不同的对象 不的对象提供不同的服务 对象之间可以传递消息 例子小李深夜

More information

目 录(目录名)

目  录(目录名) 目录 目录...1-1 1.1 域名解析配置命令... 1-1 1.1.1 display dns domain... 1-1 1.1.2 display dns dynamic-host... 1-1 1.1.3 display dns server... 1-2 1.1.4 display ip host... 1-3 1.1.5 dns domain... 1-4 1.1.6 dns resolve...

More information

基于UML建模的管理管理信息系统项目案例导航——VB篇

基于UML建模的管理管理信息系统项目案例导航——VB篇 PowerBuilder 8.0 PowerBuilder 8.0 12 PowerBuilder 8.0 PowerScript PowerBuilder CIP PowerBuilder 8.0 /. 2004 21 ISBN 7-03-014600-X.P.. -,PowerBuilder 8.0 - -.TP311.56 CIP 2004 117494 / / 16 100717 http://www.sciencep.com

More information

Learning Java

Learning Java Java Introduction to Java Programming (Third Edition) Prentice-Hall,Inc. Y.Daniel Liang 2001 Java 2002.2 Java2 2001.10 Java2 Philip Heller & Simon Roberts 1999.4 Java2 2001.3 Java2 21 2002.4 Java UML 2002.10

More information

epub 33-8

epub 33-8 8 1) 2) 3) A S C I I 4 C I / O I / 8.1 8.1.1 1. ANSI C F I L E s t d i o. h typedef struct i n t _ f d ; i n t _ c l e f t ; i n t _ m o d e ; c h a r *_ n e x t ; char *_buff; /* /* /* /* /* 1 5 4 C FILE

More information

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha CYPOK CYPOK 1 UltraEdit Project-->Install Language Tool: Language Suite----->hi-tech picc Tool Name ---->PICC Compiler Executable ---->c:hi-picinpicc.exe ( Command-line Project-->New Project-->File Name--->myc

More information

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3 浙江大学 C 程序设计及实验 试题卷 2002-2003 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:30-10:30 注意 : 答题内容必须写在答题卷上, 写在本试题卷上无效 一. 单项选择题 ( 每题 1 分, 共 10 分 ) 1. 下列运算符中, 优先级最低的是 A.

More information

高级计算机图形学

高级计算机图形学 高级计算机图形学 讲授 : 董兰芳研究方向 : 科学计算可视化图形 图像处理模式识别 Telephone:0551-3603484 Email:[email protected] Homepage: http://staff.ustc.edu.cn/~lfdong 中国科学技术大学视觉计算与可视化实验室 1 第四章几何对象和变换 (3)( 4.5 OpenGL 中的标架 4.6 建模一个彩色立方体

More information

在挑选合适的 SDK 的时候需要注意, 标准 windows 平台应用选择 FBX SDK VS2015,windows 应用商店和全平台通用的不用考虑 windows 全平台通用的应用是 windows10 新推出的功能, 可以打通 windows phone windows s

在挑选合适的 SDK 的时候需要注意, 标准 windows 平台应用选择 FBX SDK VS2015,windows 应用商店和全平台通用的不用考虑 windows 全平台通用的应用是 windows10 新推出的功能, 可以打通 windows phone windows s FBX SDK 安装配置 访问 FBX 网址 :http://www.autodesk.com/products/fbx/overview, 如下 : 点击 GET FBX SDK 进入 SDK 下载页面 ( 网址为 : http://usa.autodesk.com/adsk/servlet/pc/item?siteid=123112&id=25408427): 在挑选合适的 SDK 的时候需要注意,

More information

高级计算机图形学

高级计算机图形学 高级计算机图形学 讲授 : 董兰芳研究方向 : 科学计算可视化图形 图像处理模式识别 Telephone:0551-3603484 Email:[email protected] Homepage: http://staff.ustc.edu.cn/~lfdong 中国科学技术大学视觉计算与可视化实验室 1 第三章输入和交互 (2)( 3.8 拾取 3.9 CAD 示例 3.10 建立交互模型 3.11

More information

C/C++ 语言 - 循环

C/C++ 语言 - 循环 C/C++ Table of contents 7. 1. 2. while 3. 4. 5. for 6. 8. (do while) 9. 10. (nested loop) 11. 12. 13. 1 // summing.c: # include int main ( void ) { long num ; long sum = 0L; int status ; printf

More information

Converting image (bmp/jpg) file into binary format

Converting image (bmp/jpg) file into binary format RAiO Image Tool 操作说明 Version 1.0 July 26, 2016 RAiO Technology Inc. Copyright RAiO Technology Inc. 2013 RAiO TECHNOLOGY INC. www.raio.com.tw Revise History Version Date Description 0.1 September 01, 2014

More information

Panaboard Overlayer help

Panaboard Overlayer help Panaboard Overlayer Image Capture Software for Electronic Whiteboard (Panaboard) ... 3... 5... 6... 13...14 Panaboard Overlayer 1. 2. 3. 4. 4-1. 4-2. [ / ] ( ) 4-3. 5. 6. 6-1. 6-2. [ / ] ( ) 7. Panaboard

More information

nooog

nooog C : : : , C C,,, C, C,, C ( ), ( ) C,,, ;,, ; C,,, ;, ;, ;, ;,,,, ;,,, ; : 1 9, 2 3, 4, 5, 6 10 11, 7 8, 12 13,,,,, 2008 1 1 (1 ) 1.1 (1 ) 1.1.1 ( ) 1.1.2 ( ) 1.1.3 ( ) 1.1.4 ( ) 1.1.5 ( ) 1.2 ( ) 1.2.1

More information

幻灯片 1

幻灯片 1 次 世 代 手 游 的 探 讨 Speaker Kevin BY Art Director & idreamsky 第 一 部 分 次 世 代 手 游 的 探 索 和 制 作 1.Shader 2.Mesh 3.Animation 4.Lightmap 1.Shader 1.1Normal Map( 法 线 贴 图 ) 1.2Specular Mapping( 高 光 贴 图 ) 1.3Cube Map(

More information

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 Java V1.0.1 2007 4 10 1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 6.2.10 6.3..10 6.4 11 7.12 7.1

More information

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1 21 , 7, Windows,,,, : 010-62782989 13501256678 13801310933,,,, ;,, ( CIP) /,,. : ;, 2005. 11 ( 21 ) ISBN 7-81082 - 634-4... - : -. TP316-44 CIP ( 2005) 123583 : : : : 100084 : 010-62776969 : 100044 : 010-51686414

More information

《C语言程序设计》第2版教材习题参考答案

《C语言程序设计》第2版教材习题参考答案 教材 C 语言程序设计 ( 第 2 版 ) 清华大学出版社, 黄保和, 江弋编著 2011 年 10 月第二版 ISBN:978-7-302-26972-4 售价 :35 元 答案版本 本习题答案为 2012 年 2 月修订版本 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p = &a A. *p = *a B. p = *a C.p = &a D. *p =

More information

Move Component Object selection Component selection UV Maya Hotkeys editor Maya USING MAYA POLYGONAL MODELING 55

Move Component Object selection Component selection UV Maya Hotkeys editor Maya USING MAYA POLYGONAL MODELING 55 3 55 62 63 Move Component 63 70 72 73 73 Object selection Component selection UV Maya Hotkeys editor Maya 55 USING MAYA POLYGONAL MODELING Maya: Essentials Maya Essentials F8 Ctrl F9 Vertex/Face F9 F10

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 使用 OpenGL 4.x 为移动游戏 开发图形特效 曹家音内容技术开发工程师英伟达 (NVIDIA) 摘要 OpenGL 和 Tegra K1 简介 OpenGL4 的初始化 OpenGL4 带来的新特性 OpenGL4 高级优化技巧 Tegra K1 Demo 总结 OpenGL 的现状 OpenGL 最新版本为 4.4 过去几年中,OpenGL 产生了很大的变化 发布了 5 个以上的版本 发布了

More information

AN INTRODUCTION TO PHYSICAL COMPUTING USING ARDUINO, GRASSHOPPER, AND FIREFLY (CHINESE EDITION ) INTERACTIVE PROTOTYPING

AN INTRODUCTION TO PHYSICAL COMPUTING USING ARDUINO, GRASSHOPPER, AND FIREFLY (CHINESE EDITION ) INTERACTIVE PROTOTYPING AN INTRODUCTION TO PHYSICAL COMPUTING USING ARDUINO, GRASSHOPPER, AND FIREFLY (CHINESE EDITION ) INTERACTIVE PROTOTYPING 前言 - Andrew Payne 目录 1 2 Firefly Basics 3 COMPONENT TOOLBOX 目录 4 RESOURCES 致谢

More information

全国计算机技术与软件专业技术资格(水平)考试

全国计算机技术与软件专业技术资格(水平)考试 全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 ) 考 试 2008 年 上 半 年 程 序 员 下 午 试 卷 ( 考 试 时 间 14:00~16:30 共 150 分 钟 ) 试 题 一 ( 共 15 分 ) 阅 读 以 下 说 明 和 流 程 图, 填 补 流 程 图 中 的 空 缺 (1)~(9), 将 解 答 填 入 答 题 纸 的 对 应 栏 内 [ 说 明

More information