高级计算机图形学 讲 授:董兰芳 研究方向:科学计算可视化 图形、图像处理 模式识别 Telephone:

Slides:



Advertisements
Similar presentations
第五节 函数的微分 一、微分的定义 二、微分的几何意义 三、基本初等函数的微分公式与微分运算 法则 四、微分形式不变性 五、微分在近似计算中的应用 六、小结.
Advertisements

第五章 二次型. 第五章 二次型 知识点1---二次型及其矩阵表示 二次型的基本概念 1. 线性变换与合同矩阵 2.
Tool Command Language --11级ACM班 金天行.
第三章 数据类型和数据操作 对海量数据进行有效的处理、存储和管理 3.1 数据类型 数据源 数据量 数据结构
第八章 GIS产品的输出设计 第一节 GIS输出形式 第二节 GIS图形输出系统设计 第三节 GIS的可视化与虚拟现实.
Oracle数据库 Oracle 子程序.
第十章 真实感图形绘制 基本概念 简单光照模型 基于简单光照模型的多边形绘制.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
Chapter2 Constants, Variables, and Data Types
高级计算机图形学 讲 授:董兰芳 研究方向:科学计算可视化 图形、图像处理 模式识别 Telephone:
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
Hadoop I/O By ShiChaojie.
Computer Graphics 计算机图形学基础 张 赐 Mail: CSDN博客地址:
物体识别 3D建图 semantic mapping
管理信息结构SMI.
走进编程 程序的顺序结构(二).
辅导课程六.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
ICG 2018 Fall Homework1 Guidance
第一章 函数 函数 — 研究对象—第一章 分析基础 极限 — 研究方法—第二章 连续 — 研究桥梁—第二章.
数学模型实验课(三) 插值与三维图形.
第二章 Java语言基础.
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
第七章 操作符重载 胡昊 南京大学计算机系软件所.
工业机器人技术基础及应用 主讲人:顾老师
第一章 函数与极限.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C语言程序设计 主讲教师:陆幼利.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
VisComposer 2019/4/17.
OpenGL几何变换程序.
第二章 补充知识 2.1 总线和三态门 一、总线(BUS) 三总线结构 数据总线DB(Data Bus)
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第4章 Excel电子表格制作软件 4.4 函数(一).
实验三 16位算术逻辑运算实验 不带进位控制的算术运算 置AR=1: 设置开关CN 1 不带进位 0 带进位运算;
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
复习: 若A(x1,y1,z1) , B(x2,y2,z2), 则 AB = OB - OA=(x2-x1 , y2-y1 , z2-z1)
第九节 赋值运算符和赋值表达式.
iSIGHT 基本培训 使用 Excel的栅栏问题
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
_13简单的GDI绘图操作 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
Chapter 18 使用GRASP的对象设计示例.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
ASP.NET实用教程 清华大学出版社 第4章 C#编程语言 教学目标 教学重点 教学过程 2019年5月5日.
魏新宇 MATLAB/Simulink 与控制系统仿真 魏新宇
《工程制图基础》 第五讲 投影变换.
2019/5/21 实验一 离散傅立叶变换的性质及应用 实验报告上传到“作业提交”。 11:21:44.
本节内容 结构体.
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
基本知识 数据类型、变量、常量、运算符.
第四节 向量的乘积 一、两向量的数量积 二、两向量的向量积.
第8章 创建与使用图块 将一个或多个单一的实体对象整合为一个对象,这个对象就是图块。图块中的各实体可以具有各自的图层、线性、颜色等特征。在应用时,图块作为一个独立的、完整的对象进行操作,可以根据需要按一定比例和角度将图块插入到需要的位置。 2019/6/30.
第三节 数量积 向量积 混合积 一、向量的数量积 二、向量的向量积 三、向量的混合积 四、小结 思考题.
光照模型 计算机科学与技术系.
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
纹理映射.
§4.5 最大公因式的矩阵求法( Ⅱ ).
顺序结构程序设计 ——关于“字符串”和数值.
<编程达人入门课程> 本节内容 有符号数与无符号数 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
编译原理实践 6.程序设计语言PL/0.
第二章 简单数据类型 §2.1 数据类型概述 §2.2 变量和常量 §2.3 简单数据类型 §2.4 简单数据类型的相互转换
学习目标 1、什么是列类型 2、列类型之数值类型.
Presentation transcript:

高级计算机图形学 讲 授:董兰芳 研究方向:科学计算可视化 图形、图像处理 模式识别 Telephone:0551-3603484 2019/1/3 高级计算机图形学 讲 授:董兰芳 研究方向:科学计算可视化 图形、图像处理 模式识别 Telephone:0551-3603484 Email:lfdong@ustc.edu.cn Homepage: http://staff.ustc.edu.cn/~lfdong 中国科学技术大学 视觉计算与可视化实验室

第九章 可编程着色器 9.6 GLSL语言 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 计算机图形学 2019/1/3 第九章 可编程着色器 9.6 GLSL语言 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 9.11 基于可编程着色器的光照计算 9.12 Sampler变量类型 9.13 立方体贴图 1.计算机图形就是计算机生成的图片. 2

9.6 GLSL语言 基础知识 GLSL的语法来自于C/C++字符集、记号(tokens) 、标识符(identifiers) 嵌套结构 计算机图形学 2019/1/3 9.6 GLSL语言 基础知识 GLSL的语法来自于C/C++字符集、记号(tokens) 、标识符(identifiers) 嵌套结构 控制流:if-else, for, while, do-while 关键字 注释://…和/*…*/ 入口函数:void main() 1.计算机图形就是计算机生成的图片. 3

9.6 GLSL语言 数据类型-标量 float 浮点型,IEEE754单精度不支持双精度,字面浮点常数的后缀f或F是可选的。 计算机图形学 2019/1/3 9.6 GLSL语言 数据类型-标量 float 浮点型,IEEE754单精度不支持双精度,字面浮点常数的后缀f或F是可选的。 int 整型,至少16位精度[-65535,65535] 十进制、八进制、十六进制:42, 052, 0x2A,不支持长整型,不支持按位运算;GLSL1.5精度为32位,支持无符号整型uint。 bool布尔型:true/false关系运算和逻辑运算产生布尔型。 条件跳转表达式(if, for, ?:, while, do-while)只接受布尔型。 1.计算机图形就是计算机生成的图片. 4

9.6 GLSL语言 数据类型-向量 二维到四维的float、int、bool型, vec2、vec3、vec4 计算机图形学 2019/1/3 9.6 GLSL语言 数据类型-向量 二维到四维的float、int、bool型, vec2、vec3、vec4 ivec2、ivec3、ivec4 bvec2、bvec3、bvec4 其中的元素可以通过下面的索引下标来获取: (x, y, z, w) 位置或方向 (r, g, b, a) 颜色 (s, t, p, q) 纹理坐标 1.计算机图形就是计算机生成的图片. 5

9.6 GLSL语言 数据类型-矩阵 2×2, 2×3, 2×4, 3×2, 3×3, 3×4, 4×2, 4×3, 和4×4浮点矩阵 计算机图形学 2019/1/3 9.6 GLSL语言 数据类型-矩阵 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行元素。 1.计算机图形就是计算机生成的图片. 6

9.6 GLSL语言 数据类型-采样器(sampler) 纹理的不透明句柄 sampler[1,2,3]D 访问1D 、 2D 、 3D纹理 计算机图形学 2019/1/3 9.6 GLSL语言 数据类型-采样器(sampler) 纹理的不透明句柄 sampler[1,2,3]D 访问1D 、 2D 、 3D纹理 samplerCube 访问立方图纹理 例子: uniform sampler2D Grass; vec4 color = texture2D(Grass, coord); 1.计算机图形就是计算机生成的图片. 7

9.6 GLSL语言 存储限定符 声明变量时可以在类型前指定存储限定符。 例:const 只读。 计算机图形学 2019/1/3 9.6 GLSL语言 存储限定符 声明变量时可以在类型前指定存储限定符。 例:const 只读。 attribute 应用程序传递给顶点着色器的每顶点数据。 uniform 应用程序传递给着色器的图元数据。 varying 顶点着色器经光栅化器传递给片段着色器的 插值数据。 1.计算机图形就是计算机生成的图片. 8

9.6 GLSL语言 attribute限定符 OpenGL用attribute变量向顶点着色器传递每顶点 的数据。 计算机图形学 2019/1/3 9.6 GLSL语言 attribute限定符 OpenGL用attribute变量向顶点着色器传递每顶点 的数据。 在顶点着色器中声明为全局变量,只读不能在片元 着色器中声明使用。 使用OpenGL顶点API或顶点数组传递属性变量值 给顶点。 着色器类型限制为浮点标量、向量和矩阵,不能声 明为数组或结构float标量内部存储为vec4。 1.计算机图形就是计算机生成的图片. 9

9.6 GLSL语言 uniform限定符 unifrom用于声明在图元处理时保持不变的全局变量, 计算机图形学 2019/1/3 9.6 GLSL语言 uniform限定符 unifrom用于声明在图元处理时保持不变的全局变量, 不能在glBegin和glEnd间改变其值。 在顶点和片段着色器中只读任何类型的变量,包括 结构和数组。 1.计算机图形就是计算机生成的图片. 10

9.6 GLSL语言 varying限定符 varying变量是顶点和片元着色器交流数据的唯一方式。 计算机图形学 2019/1/3 9.6 GLSL语言 varying限定符 varying变量是顶点和片元着色器交流数据的唯一方式。 顶点着色器输出的每顶点数据由光栅化器插值为每片 元数据输入到片元着色器。 全局变量,顶点着色器可读写,片元着色器只读。 类型限制为浮点标量、向量和矩阵,以及这些类型的 数组,不能为结构。 1.计算机图形就是计算机生成的图片. 11

9.6 GLSL语言 内置函数 角度和三角函数 指数函数 常用函数 几何函数 矩阵函数 向量关系函数 纹理访问函数 片元处理函数 噪声函数 计算机图形学 2019/1/3 9.6 GLSL语言 内置函数 角度和三角函数 指数函数 常用函数 几何函数 矩阵函数 向量关系函数 纹理访问函数 片元处理函数 噪声函数 1.计算机图形就是计算机生成的图片. 12

9.6 GLSL语言 顶点着色器 顶点着色器必须负责如下OpenGL固定功能的逐顶点操作: 模型-视图矩阵和投影矩阵没有应用于顶点坐标。 计算机图形学 2019/1/3 9.6 GLSL语言 顶点着色器 顶点着色器必须负责如下OpenGL固定功能的逐顶点操作: 模型-视图矩阵和投影矩阵没有应用于顶点坐标。 纹理矩阵没有应用于纹理坐标。 法向量没有变换到观察坐标,且没有重新缩放或规范化。 没有对启用GL_AUTO_NORMAL执行法向规范化。 1.计算机图形就是计算机生成的图片. 13

9.6 GLSL语言 顶点着色器 没有自动生成纹理坐标 没有执行每顶点的光照计算 没有执行彩色材料计算(glColorMaterial) 计算机图形学 2019/1/3 9.6 GLSL语言 顶点着色器 没有自动生成纹理坐标 没有执行每顶点的光照计算 没有执行彩色材料计算(glColorMaterial) 没有执行彩色索引光照计算。 当设置当前光栅位置时,将应用上述所有操作。 1.计算机图形就是计算机生成的图片. 14

9.6 GLSL语言 顶点着色器 下述操作将应用到顶点着色器所得到的顶点值: 颜色钳位(clamping)和掩模(masking) 计算机图形学 2019/1/3 9.6 GLSL语言 顶点着色器 下述操作将应用到顶点着色器所得到的顶点值: 颜色钳位(clamping)和掩模(masking) 裁剪坐标的透视除法 包括深度范围缩放的视口映射 包括用户定义裁剪平面的裁剪前向面确定 平面明暗处理 颜色、纹理坐标、雾、点大小等一般属性裁剪 最终颜色处理 1.计算机图形就是计算机生成的图片. 15

9.6 GLSL语言 内置顶点属性(attribute) 应用程序提供顶点信息:位置、法向、颜色、纹理 计算机图形学 2019/1/3 9.6 GLSL语言 内置顶点属性(attribute) 应用程序提供顶点信息:位置、法向、颜色、纹理 坐标glVertex, glNormal, glColor, glTexCoord,glDrawArrays 内置顶点属性 attribute vec4 gl_Vertex; // glVertex attribute vec4 gl_Color; // glColor attribute vec4 gl_SecondaryColor; // glSecondaryColor attribute vec3 gl_Normal; // glNormal attribute vec4 gl_MultiTexCoordn;//glMultiTexCoord(n,…), n=0,…7 attribute float gl_FogCoord; // glFogCoord 1.计算机图形就是计算机生成的图片. 16

9.6 GLSL语言 特殊输出变量 gl_Position:顶点着色器必须写入的齐次裁剪坐标,将用于 图元装配、裁剪、剔除 计算机图形学 2019/1/3 9.6 GLSL语言 特殊输出变量 gl_Position:顶点着色器必须写入的齐次裁剪坐标,将用于 图元装配、裁剪、剔除 gl_PointSize:将被光栅化的点大小 gl_ClipVertex:相对于用户裁剪平面的顶点位置 vec4 gl_Position; // must be written to float gl_PointSize; // may be written to vec4 gl_ClipVertex; // may be written to 1.计算机图形就是计算机生成的图片. 17

9.6 GLSL语言 片元着色器 片元着色器取代固定功能的纹理、颜色求和、雾等。 没有应用纹理环境和纹理函数 没有执行纹理应用程序 计算机图形学 2019/1/3 9.6 GLSL语言 片元着色器 片元着色器取代固定功能的纹理、颜色求和、雾等。 没有应用纹理环境和纹理函数 没有执行纹理应用程序 没有应用颜色求和 没用应用雾化 1.计算机图形就是计算机生成的图片. 18

9.6 GLSL语言 内置常量 const int gl_MaxLights = 8; 计算机图形学 2019/1/3 9.6 GLSL语言 内置常量 const int gl_MaxLights = 8; const int gl_MaxClipPlanes = 6; const int gl_MaxTextureUnits = 2; const int gl_MaxTextureCoords = 2; const int gl_MaxVertexAttribs = 16; const int gl_MaxVertexUniformComponents = 512; const int gl_MaxVaryingFloats = 32; const int gl_MaxVertexTextureImageUnits = 0; const int gl_MaxTextureImageUnits = 2; const int gl_MaxFragmentUniformComponents = 64; const int gl_MaxCombinedTextureImageUnits = 2; const int gl_MaxDrawBuffers = 1; 1.计算机图形就是计算机生成的图片. 19

9.6 GLSL语言 内置uniform变量 uniform mat4 gl_ModelViewMatrix; 计算机图形学 2019/1/3 9.6 GLSL语言 内置uniform变量 uniform mat4 gl_ModelViewMatrix; uniform mat4 gl_ProjectionMatrix; uniform mat4 gl_ModelViewProjectionMatrix; uniform mat4 gl_TextureMatrix[gl_MaxTextureCoords]; uniform mat3 gl_NormalMatrix; uniform vec4 gl_ClipPlane[gl_MaxClipPlanes]; uniform gl_MaterialParameters gl_FrontMaterial; uniform gl_MaterialParameters gl_BackMaterial; uniform gl_LightSourceParameters gl_LightSource[gl_MaxLights]; uniform gl_LightModelParameters gl_LightModel; uniform gl_FogParameters gl_Fog; 1.计算机图形就是计算机生成的图片. 20

9.6 GLSL语言 固定功能着色器变换 // Transform vertex to clip space 计算机图形学 2019/1/3 9.6 GLSL语言 固定功能着色器变换 // Transform vertex to clip space gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; //or this: gl_Position = ftransform(); 1.计算机图形就是计算机生成的图片. 21

9.6 GLSL语言 视点坐标位置计算 下述代码把顶点位置变换为视点坐标 vec4 ecPosition; 计算机图形学 2019/1/3 9.6 GLSL语言 视点坐标位置计算 下述代码把顶点位置变换为视点坐标 vec4 ecPosition; vec3 ecPosition3; // in 3D space // Transform vertex to eye coordinates if (NeedEyePosition) {ecPosition = gl_ModelViewMatrix * gl_Vertex; ecPosition3 = (vec3(ecPosition)) / ecPosition.w; } 1.计算机图形就是计算机生成的图片. 22

9.6 GLSL语言 法向变换 在视点空间计算光照时,法向也必须变换到视点 空间。 法向规范化:glEnable(GL_NORMALIZE 计算机图形学 2019/1/3 9.6 GLSL语言 法向变换 在视点空间计算光照时,法向也必须变换到视点 空间。 法向规范化:glEnable(GL_NORMALIZE 法向缩放:缩放比例因子为内置uniform变量 gl_NormalScale normal = gl_NormalMatrix * gl_Normal; normal = normalize(normal); normal = normal * gl_NormalScale; 1.计算机图形就是计算机生成的图片. 23

9.6 GLSL语言 纹理坐标变换 OpenGL的每一个纹理单元都定义了一个纹理矩阵, 可用内置的uniform变量 计算机图形学 2019/1/3 9.6 GLSL语言 纹理坐标变换 OpenGL的每一个纹理单元都定义了一个纹理矩阵, 可用内置的uniform变量 gl_TextureMatrix访问 gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; 1.计算机图形就是计算机生成的图片. 24

第九章 可编程着色器 9.6 GLSL语言详解 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 计算机图形学 2019/1/3 第九章 可编程着色器 9.6 GLSL语言详解 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 9.11 基于可编程着色器的光照计算 9.12 Sampler变量类型 9.13 立方体贴图 9.14 凹凸映射 1.计算机图形就是计算机生成的图片. 25

9.7 GLSL程序使用 连接着色器与OpenGL 调用glCreateShader创建着色器对象 计算机图形学 2019/1/3 9.7 GLSL程序使用 连接着色器与OpenGL 调用glCreateShader创建着色器对象 调用glShaderSource为着色器加载源代码 调用glCompileShader编译每个着色器 调用glCreateProgram创建程序对象 调用glAttachShader把着色器对象连接到程序对象 调用glLinkProgram 链接程序对象,生成可执行程序 调用glUseProgram安装可执行程序替换OpengGL固定 功能流水线处理模块 用uniform和attribute变量在应用程序和着色器间通信 1.计算机图形就是计算机生成的图片. 26

9.7 GLSL程序使用 OpenGL应用程序有两种方式向着色器发送值 使用内置和用户定义的全局变量 uniform变量 计算机图形学 2019/1/3 9.7 GLSL程序使用 OpenGL应用程序有两种方式向着色器发送值 使用内置和用户定义的全局变量 uniform变量 attribute变量 纹理可解释为图像或数据数组 1.计算机图形就是计算机生成的图片. 27

9.7 GLSL程序使用 内置顶点属性 内置顶点属性gl_Color /gl_Normal 计算机图形学 2019/1/3 9.7 GLSL程序使用 内置顶点属性 内置顶点属性gl_Color /gl_Normal /gl_Vertex等glBegin/glEnd间用glColor /glNormal /glVertex等函数指定 顶点数组方式 1.计算机图形就是计算机生成的图片. 28

第九章 可编程着色器 9.6 GLSL语言详解 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 计算机图形学 2019/1/3 第九章 可编程着色器 9.6 GLSL语言详解 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 9.11 基于可编程着色器的光照计算 9.12 Sampler变量类型 9.13 立方体贴图 9.14 凹凸映射 1.计算机图形就是计算机生成的图片. 29

9.8 顶点波动 波动顶点着色器 uniform float time; 计算机图形学 2019/1/3 9.8 顶点波动 波动顶点着色器 uniform float time; uniform float xs, zs, // frequencies uniform float h; // height scale void main() { vec4 t = gl_Vertex; t.y = gl_Vertex.y + h*sin(time + xs*gl_Vertex.x) + h*sin(time + zs*gl_Vertex.z); gl_Position = gl_ModelViewProjectionMatrix*t; } attribute变量和uniform变量在顶点着色器内只读 1.计算机图形就是计算机生成的图片. 30

9.8 顶点波动 Glint timeParam; timeParam = glGetUniformLocation(program, 计算机图形学 2019/1/3 9.8 顶点波动 Glint timeParam; timeParam = glGetUniformLocation(program, "time"); void idle() { glUniform1f(timeParam, (GLfloat) glutGet(GLUT_ELAPSED_TIME)); glutPostRedisplay(); } 1.计算机图形就是计算机生成的图片. 31

第九章 可编程着色器 9.6 GLSL语言详解 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 计算机图形学 2019/1/3 第九章 可编程着色器 9.6 GLSL语言详解 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 9.11 基于可编程着色器的光照计算 9.12 Sampler变量类型 9.13 立方体贴图 9.14 凹凸映射 1.计算机图形就是计算机生成的图片. 32

9.9 二维图形渐变 渐变(morphing)效果 渐变:一个物体平滑地变换到另一个物体 假设两个物体的顶点有一一对应关系。 计算机图形学 2019/1/3 9.9 二维图形渐变 渐变(morphing)效果 渐变:一个物体平滑地变换到另一个物体 假设两个物体的顶点有一一对应关系。 顶点着色器需要输出一个由对应顶点对插 值得到的顶点。 1.计算机图形就是计算机生成的图片. 33

9.9 二维图形渐变 一个顶点通过gl_Vertex传入,对应顶点用顶点属 性变量传入。 attribute vec4 vertices2; 计算机图形学 2019/1/3 9.9 二维图形渐变 一个顶点通过gl_Vertex传入,对应顶点用顶点属 性变量传入。 attribute vec4 vertices2; uniform float time; void main() {float s = 0.5*(1.0+sin(0.001*time)); vec4 t = mix(gl_Vertex, vertices2, s); gl_Position = gl_ModelViewProjectionMatrix*t; gl_FrontColor = gl_Color;} mix(x, y, a) 返回x * (1.0-a) + y * a 1.计算机图形就是计算机生成的图片. 34

9.9 二维图形渐变 GLint vertices2Param; 计算机图形学 2019/1/3 9.9 二维图形渐变 GLint vertices2Param; vertices2Param=glGetAttribLocation(program, "vertices2"); #define N 50 GLfloat vertices_one[N][3], vertices_two[N][3]; glBegin(GL_TRIANGLES); for (int i = 0; i < N; i++) { glVertexAttrib3fv(vertices2Param, vertices_two[i]); glVertex3fv(vertices_one[i]);} glEnd(); 1.计算机图形就是计算机生成的图片. 35

第九章 可编程着色器 9.6 GLSL语言详解 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 计算机图形学 2019/1/3 第九章 可编程着色器 9.6 GLSL语言详解 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 9.11 基于可编程着色器的光照计算 9.12 Sampler变量类型 9.13 立方体贴图 9.14 凹凸映射 1.计算机图形就是计算机生成的图片. 36

9.10 非真实感着色 非真实感着色 根据光线和法向的夹角给对象赋两种颜色 根据视线和方向的夹角把对象轮廓赋为黑色 计算机图形学 2019/1/3 9.10 非真实感着色 非真实感着色 根据光线和法向的夹角给对象赋两种颜色 根据视线和方向的夹角把对象轮廓赋为黑色 const vec4 yellow = vec4(1.0, 1.0, 0.0, 1.0); const vec4 red = vec4(1.0, 0.0, 0.0, 1.0); const vec4 black = vec4(0.0, 0.0, 0.0, 1.0); if(dot(L, N) > 0.5) gl_FrontColor = yellow; else gl_FrontColor = red; if(abs(dot(E, N)) < 0.1) glFrontColor = black; 1.计算机图形就是计算机生成的图片. 37

第九章 可编程着色器 9.6 GLSL语言详解 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 计算机图形学 2019/1/3 第九章 可编程着色器 9.6 GLSL语言详解 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 9.11 基于可编程着色器的光照计算 9.12 Sampler变量类型 9.13 立方体贴图 9.14 凹凸映射 1.计算机图形就是计算机生成的图片. 38

9.11 基于可编程着色器的光照计算 Phong光照模型 I =kdIdl· n +ksIs(r· v )α+ kaIa 计算机图形学 2019/1/3 9.11 基于可编程着色器的光照计算 Phong光照模型 I =kdIdl· n +ksIs(r· v )α+ kaIa I =kdIdl· n +ksIs(n· h )β+ kaIa 1.计算机图形就是计算机生成的图片. 39

9.11 基于可编程着色器的光照计算 内置uniform变量 struct gl_LightSourceParameters 计算机图形学 2019/1/3 9.11 基于可编程着色器的光照计算 内置uniform变量 struct gl_LightSourceParameters { vec4 ambient; // Acli vec4 diffuse; // Dcli vec4 specular; // Scli vec4 position; // Ppli vec4 halfVector; // Derived: Hi vec3 spotDirection; // Sdli float spotExponent; // Srli float spotCutoff; // Crli // (range: [0.0,90.0], 180.0) float spotCosCutoff; // Derived: cos(Crli) // (range: [1.0,0.0],-1.0) float constantAttenuation; // K0 float linearAttenuation; // K1 float quadraticAttenuation; // K2}; uniform gl_LightSourceParameters gl_LightSource[gl_MaxLights]; 1.计算机图形就是计算机生成的图片. 40

9.11 基于可编程着色器的光照计算 struct gl_LightModelParameters 计算机图形学 2019/1/3 9.11 基于可编程着色器的光照计算 struct gl_LightModelParameters { vec4 ambient; // Acs }; uniform gl_LightModelParameters gl_LightModel; struct gl_MaterialParameters { vec4 emission; // Ecm vec4 ambient; // Acm vec4 diffuse; // Dcm vec4 specular; // Scm float shininess; // Srm }; uniform gl_MaterialParameters gl_FrontMaterial; uniform gl_MaterialParameters gl_BackMaterial; 1.计算机图形就是计算机生成的图片. 41

9.11 基于可编程着色器的光照计算 Phong光照 光源位置gl_LightSource[i].position在视点坐标 计算机图形学 2019/1/3 9.11 基于可编程着色器的光照计算 Phong光照 光源位置gl_LightSource[i].position在视点坐标 系中给出视点在视点坐标系的原点 N:视点坐标系中的法向量 L:视点坐标系中的顶点到光源向量(光线) E:视点坐标系中的顶点到视点向量(视线) R:视点坐标系中的理想反射向量 H:视点坐标系中L和E的中值向量 1.计算机图形就是计算机生成的图片. 42

9.11 基于可编程着色器的光照计算 void main(void) 计算机图形学 2019/1/3 9.11 基于可编程着色器的光照计算 void main(void) /* modified Phong vertex shader (without distance term) */ { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; vec4 ambient, diffuse, specular; vec4 eyePosition = gl_ModelViewMatrix * gl_Vertex; vec4 eyeLightPos = gl_LightSource[0].position; vec3 N = normalize(gl_NormalMatrix * gl_Normal); vec3 L = normalize(eyeLightPos.xyz -eyePosition.xyz); vec3 E = -normalize(eyePosition.xyz); vec3 H = normalize(L + E); 1.计算机图形就是计算机生成的图片. 43

9.11 基于可编程着色器的光照计算 改进的Phong顶点着色器II 计算机图形学 2019/1/3 9.11 基于可编程着色器的光照计算 改进的Phong顶点着色器II /* compute diffuse, ambient, and specular contributions */ float f = 1.0; float Kd = max(dot(L, N), 0.0); float Ks = pow(max(dot(N, H), 0.0), gl_FrontMaterial.shininess); if (dot(L,N) < 0.0) f = 0.0; ambient = gl_FrontLightProduct[0].ambient; diffuse = Kd*gl_FrontLightProduct[0].diffuse; specular = f*Ks*gl_FrontLightProduct[0].specular; gl_FrontColor = ambient+diffuse+specular; } 1.计算机图形就是计算机生成的图片. 44

9.11 基于可编程着色器的光照计算 基于片元的Phong光照 利用varying变量把属性从顶点着色器传递 到片元着色器法向量N 计算机图形学 2019/1/3 9.11 基于可编程着色器的光照计算 基于片元的Phong光照 利用varying变量把属性从顶点着色器传递 到片元着色器法向量N 光线向量L 视线向量E 1.计算机图形就是计算机生成的图片. 45

9.11 基于可编程着色器的光照计算 基于片元光照的顶点着色器 varying vec3 N, L, E; void main() { 计算机图形学 2019/1/3 9.11 基于可编程着色器的光照计算 基于片元光照的顶点着色器 varying vec3 N, L, E; void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; vec4 eyePosition = gl_ModelViewMatrix * gl_Vertex; vec4 eyeLightPos = gl_LightSource[0].position; N = normalize(gl_NormalMatrix * gl_Normal); L = normalize(eyeLightPos.xyz -eyePosition.xyz); E = -normalize(eyePosition.xyz); } 1.计算机图形就是计算机生成的图片. 46

9.11 基于可编程着色器的光照计算 改进Phong光照片元着色器I varying vec3 N; varying vec3 L; 计算机图形学 2019/1/3 9.11 基于可编程着色器的光照计算 改进Phong光照片元着色器I varying vec3 N; varying vec3 L; varying vec3 E; void main() { vec3 Normal = normalize(N); vec3 Light = normalize(L); vec3 Eye = normalize(E); vec3 Half = normalize(Eye + Light);} 1.计算机图形就是计算机生成的图片. 47

9.11 基于可编程着色器的光照计算 改进Phong光照片段着色器II float f = 1.0; 计算机图形学 2019/1/3 9.11 基于可编程着色器的光照计算 改进Phong光照片段着色器II float f = 1.0; float Kd = max(dot(Normal, Light), 0.0); float Ks = pow(max(dot(Half, Normal), 0.0), gl_FrontMaterial.shininess); vec4 diffuse = Kd * gl_FrontLightProduct[0].diffuse; if (dot(Normal, Light) < 0.0) f = 0.0; vec4 specular = f * Ks * gl_FrontLightProduct[0].specular; vec4 ambient = gl_FrontLightProduct[0].ambient; gl_FragColor = ambient + diffuse + specular; } 1.计算机图形就是计算机生成的图片. 48

9.11 基于可编程着色器的光照计算 效果对比 逐顶点光照 逐片段光照 49 计算机图形学 2019/1/3 逐顶点光照 逐片段光照 1.计算机图形就是计算机生成的图片. 49

第九章 可编程着色器 9.6 GLSL语言详解 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 计算机图形学 2019/1/3 第九章 可编程着色器 9.6 GLSL语言详解 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 9.11 基于可编程着色器的光照计算 9.12 Sampler变量类型 9.13 立方体贴图 9.14 凹凸映射 1.计算机图形就是计算机生成的图片. 50

9.12 采样器 采样器(Samplers) 提供对纹理对象的访问 定义了1, 2, 和3维纹理以及立方体贴图的采样器 在着色器中: 计算机图形学 2019/1/3 9.12 采样器 采样器(Samplers) 提供对纹理对象的访问 定义了1, 2, 和3维纹理以及立方体贴图的采样器 在着色器中: uniform sampler2D myTexture; vec2 texcoord; vec4 texcolor = texture2D(mytexture, texcoord); 在应用程序中: texMapLocation = glGetUniformLocation(myProg,“myTexture”); glUniform1i(texMapLocation, 0); /* assigns to texture unit 0 */ 1.计算机图形就是计算机生成的图片. 51

9.12 采样器 片元着色器的应用 纹理映射 平滑明暗 环境映射 凹凸映射 52 计算机图形学 2019/1/3 9.12 采样器 片元着色器的应用 纹理映射 1.计算机图形就是计算机生成的图片. 平滑明暗 环境映射 凹凸映射 52

第九章 可编程着色器 9.6 GLSL语言详解 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 计算机图形学 2019/1/3 第九章 可编程着色器 9.6 GLSL语言详解 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 9.11 基于可编程着色器的光照计算 9.12 Sampler变量类型 9.13 立方体贴图 9.14 凹凸映射 1.计算机图形就是计算机生成的图片. 53

9.13 立方体贴图 立方体贴图 用六张2D纹理图组成立方图纹理。 OpenGL支持立方体贴图。 GLSL通过立方图采采样器来支持。 计算机图形学 2019/1/3 9.13 立方体贴图 立方体贴图 用六张2D纹理图组成立方图纹理。 OpenGL支持立方体贴图。 GLSL通过立方图采采样器来支持。 vec4 texColor = textureCube(mycube, texcoord); 纹理坐标必须是3D的 1.计算机图形就是计算机生成的图片. 54

计算机图形学 2019/1/3 9.13 立方体贴图 立方图纹理示例 1.计算机图形就是计算机生成的图片. 55

计算机图形学 2019/1/3 9.13 立方体贴图 环境映射 用反射向量在立方图中定位纹理 1.计算机图形就是计算机生成的图片. 56

9.13 立方体贴图 用着色器实现环境映射 通常在世界坐标系中计算环境映射,由于 模型矩阵的作用,世界坐标系可能会不同 计算机图形学 2019/1/3 9.13 立方体贴图 用着色器实现环境映射 通常在世界坐标系中计算环境映射,由于 模型矩阵的作用,世界坐标系可能会不同 于对象坐标系对象的位置和法向在对象坐标系 中指定。 把模型矩阵作为uniform变量传递给着色器。 也可用于反射贴图或折射贴图(例如模拟水)。 1.计算机图形就是计算机生成的图片. 57

9.13 立方体贴图 反射贴图顶点着色器 varying vec3 R; void main(void) { 计算机图形学 2019/1/3 9.13 立方体贴图 反射贴图顶点着色器 varying vec3 R; void main(void) { gl_Position = gl_ModelViewProjectionMatrix* gl_Vertex; vec3 N = normalize(gl_NormalMatrix*gl_Normal); vec4 eyePos = gl_ModelViewMatrix*gl_Vertex; R = reflect(-eyePos.xyz, N); } 1.计算机图形就是计算机生成的图片. 58

9.13 立方体贴图 反射贴图片段着色器 varying vec3 R; uniform samplerCube texMap; 计算机图形学 2019/1/3 9.13 立方体贴图 反射贴图片段着色器 varying vec3 R; uniform samplerCube texMap; void main(void) { gl_FragColor=textureCube(texMap, R);} 1.计算机图形就是计算机生成的图片. 59

第九章 可编程着色器 9.6 GLSL语言详解 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 计算机图形学 2019/1/3 第九章 可编程着色器 9.6 GLSL语言详解 9.7 GLSL程序使用 9.8 顶点波动 9.9 二维图形渐变 9.10 非真实感着色 9.11 基于可编程着色器的光照计算 9.12 Sampler变量类型 9.13 立方体贴图 1.计算机图形就是计算机生成的图片. 60