슬라이드 1

Similar documents
Microsoft PowerPoint - cg_ch09_02

计算机图形学

PowerPoint Presentation

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

计算机图形学

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

Microsoft PowerPoint - cg_ch02_01

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

《计算概论》课程 第十九讲 C 程序设计语言应用

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

01

Microsoft Word 養生與保健_中山大學_講義


萬里社區老人健康照護手冊

Microsoft Word - 強制汽車責任保險承保及理賠作業處理辦法 doc

Microsoft Word - 06.Understanding of Pregnancy and Birth.doc

範本檔

附 件 一 : 办 理 集 中 式 银 期 转 账 业 务 网 点 名 单 序 号 地 区 网 点 名 称 地 址 联 系 人 电 话 23 工 商 银 行 安 徽 省 铜 陵 百 大 支 行 铜 陵 市 长 江 东 路 50 号 鲁 桂 珍 工 商 银 行 安 徽

2. 二 年 級 吳 毓 秀 老 師 : 感 謝 午 餐 公 司 平 時 均 能 準 時 送 餐, 但 希 望 能 不 要 使 用 加 工 品, 且 學 生 反 映 希 望 能 多 加 蛋 品 的 食 物 3. 三 年 級 柯 阿 青 老 師 : 雞 肉 有 血 水 味, 請 午 餐 公 司 能 調

人 物 春 秋 杨 永 泰 将 其 削 藩 策 略 概 括 为 : 以 经 济 方 法 瓦 解 冯 玉 祥 的 第 二 集 团 军, 以 政 治 方 法 解 决 阎 锡 山 的 第 3 集 团 军, 以 军 事 方 法 解 决 李 宗 仁 的 第 四 集 团 军, 以 外 交 方 法 对 付 张 学

糖尿病食譜

,,,,,,, (,, ),,,,,,,,,,,,,,, ,,, 4 11,, ( ),,,, ( ), :, ( ),,, 1995, 66 ; ( ),, 1996, , 3-4,,

(➂)11. 炎 炎 夏 日, 即 使 下 起 滂 沱 大 雨, 都 消 除 不 了 令 人 心 煩 的 暑 氣 這 句 話 主 要 想 表 達 什 麼? ➀ 夏 日 裡 經 常 下 著 滂 沱 大 雨, 令 人 心 煩 ➁ 下 著 滂 沱 大 雨 的 日 子, 可 以 消 除 暑 氣 ➂ 夏 日

高雄市立五福國民中學九十四學年度第一學期第三次段考二年級本國語文學習領域試題卷

台北老爺校外實地參訪結案報告


<4D F736F F D20C540A468BAC2BFEFB3F8A657B6B7AABE2E646F63>

PowerPoint 演示文稿

}; "P2VTKNvTAnYNwBrqXbgxRSFQs6FTEhNJ", " " string imagedata; if(0!= read_image("a.jpg",imagedata)) { return -1; } string rsp; ytopen_sdk m_sd

OpenGL Render

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

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7.

Guava学习之Resources

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

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

北京大学

5B_sasaki.pdf

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

01

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

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony

fvalue = (pdata[y][i] + pdata[y][i + 1]) / 2; pdata[y][nhalfw + i] -= fvalue; fvalue = (pdata[y][nhalfw - 1] + pdata[y][nhalfw - 2]) / 2; pdata[y][nwi

Microsoft PowerPoint - string_kruse [兼容模式]

PowerPoint 演示文稿

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

chap02_part2

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

ExcelUtility 类库使用说明 ( 续 ) 开发 / 设计 : 左文俊 第一个新增功能, 列宽自适应, 当超过 30 个字符则将单元格内容设为换行 任意一个无模板的导出方法均支持该功能, 示例代码如下 : /// <summary> /// 测试方法

슬라이드 1

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

春季:山藥炒蝦仁 

<4D F736F F D20B2C4A447A6B8BFD4B8DFA965ADFBB77CB77CC4B3ACF6BFFD2E646F63>

Microsoft Word - 第3章.doc

目 录(目录名)

基于 SIMATIC IOT2040 的 Node-red S7 通信 1. 主要目标 基于 Node-red S7 通信, 实现 SIMATIC IOT2040 读写 Siemens S7-300/400/1200/1500 或 S7-200 Smart PLC 中的数据 2. Node-red

CC213

F515_CS_Book.book

C/C++ - 文件IO

C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

概述


Microsoft Word - 認識減重手術 注意後遺症.doc

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

PTR89 应用程序编程接口 V1.00

新・解きながら学ぶJava


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

第 14 行调用 of_demo_controller_register 注册 demo controller 驱动,xlate 函数设置的都是 of_demo_simple_xlate, 这个函数完成对 user 传来的参数的处理 1. int of_demo_controller_registe

投影片 1

壹、

25.( 0 在 進 行 水 溫 與 溶 解 量 的 實 驗 時, 每 一 匙 糖 都 要 刮 平 的 主 要 目 的 為 何? 1 避 免 一 次 溶 解 太 多 糖 2 可 以 增 加 溶 解 糖 的 次 數 3 控 制 加 入 的 每 一 匙 糖 都 一 樣 多 4 可 以 減 少 溶 解 量

提问袁小兵:

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1

Ps22Pdf

C/C++ 语言 - 循环

概述

H1428

C/C++语言 - 运算符、表达式和语句

Transcription:

2018-2019 年度第二学期 00106501 计算机图形学 童伟华管理科研楼 1205 室 E-mail: tongwh@ustc.edu.cn 中国科学技术大学数学科学学院 http://math.ustc.edu.cn/

第二节 GLSL(I) 2

顶点着色器应用 顶点的移动 变形 (morphing) 波动 分形 光照 更真实的模型 卡通着色器 3

片段着色器应用 逐片段进行光照计算 逐顶点光照计算 逐片段光照计算 4

片段着色器应用 典型应用 : 纹理映射 光滑明暗处理环境映射凹凸映射 5

着色器的编程语言 OpenGL Shading Language 的缩写 OpenGL 4.6 的一部分 高级类 C 语言 引进新的数据类型 矩阵 向量 采样器 (Samplers) OpenGL 的状态通过内置变量传递 6

可编程流水线 利用 GLSL 语言编写着色器 (Shader), 用于替代固定流水线中顶点处理子流水线及片元处理子流水线 另外, 最新版本的 OpenGL 还提供了细分着色器, 几何着色器, 计算着色器等, 来提供更丰富的绘制功能 7

一个简单的顶点着色器 //filename: vgl_simple.vert #version 330 core layout(location = 0) in vec4 aposition; uniform mat4 ModelViewMatrix; uniform mat4 ProjectionMatrix; void main(void) { gl_position = ProjectionMatrix * ModelViewMatrix * aposition; } 8

一个简单的片元着色器 //filename: fgl_simple.frag #version 330 core layout(location = 0) out vec4 fcolor; void main (void) { fcolor = vec4(0.0f, 0.0f, 1.0f, 1.0f); } 9

GLSL 的基本语法 与 C 语言类似, 着色器从 main( ) 函数开始运行 ; 可自定义函数 ; 注释方式相同 不同之处 : #version 330 core: 指定所用的 OpenGL 语言版本, 什么模式 uniform: 变量修饰符, 指变量为用户应用程序传递给着色器的数据, 它对于给定的图元而言是一个常量 in: 变量修饰符, 指这个变量为着色器的输入变量 out: 变量修饰符, 指这个变量为着色器的输出变量 layout: 布局限定符, 指定变量的布局规范 10

GLSL 的代码编写与命名 GLSL 的代码有两种编写方式 利用 C/C++ 语言的字符串数组 ( 优点 : 不需要进行文件读写 ) 例如 : Const char *vshader = { }; #version 330 core layout(location = 0) in vec4 aposition; 利用文本编辑器编写, 然后利用文件读写载入程序中 ( 优点 : 代码修改方便 ) 若采用文本编辑器,GLSL 代码的文件后缀建议使用.vert: 顶点着色器.frag: 片元着色器.tesc,.tese: 细分控制 / 求值着色器.geom: 几何着色器.comp: 计算着色器 11

顶点着色器的数据输入与输出 输入逐顶点变量的基本步骤 : 初始化顶点数组对象 :glgenvertexarrays, glbindvertexarray 等 分配顶点缓存对象 :glgenbuffers,glbindbuffer 等 将数据载入缓存对象 :glbufferdata( 或 glbuffersubdata) 等 将顶点数据与顶点着色器的 in 变量关联 : glgetattriblocation, glvertexattribpointer,glenablevertexattribarray 等 输入 uniform 变量的基本步骤 : 查询 uniform 变量的索引 :glgetuniformlocation 等 设置 uinform 变量的值 :gluniform, gluniformmatria 等 ( 根据类型选择合适的函数 ) 利用 out 修饰变量, 在片元着色器可接收经过插值的相应变量 利用 transform feedback 机制, 可将数据回传至缓存中 12

片元着色器的输入输入与输出 利用 in 修饰变量, 可从顶点着色器获取经过插值的数据 利用 out 修饰变量, 将数据输出至帧缓存中 ; 位置可由 layout 指定 ; 输出到哪个颜色缓存可通过 gldrawbuffer 或 gldrawbuffers 指定 13

连接着色器与 OpenGL 14

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

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

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

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

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

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

连接着色器对象 void glattachshader(gluint program, GLuint shader); 把着色器对象 shader 连接 (attach) 到程序对象 program 可在加载源代码或编译前, 把着色器对象连接到程序对象 可连接顶点 / 片段着色器对, 或只连接一类 可连接多个同一类的着色器对象到程序对象, 但只能有一个着色器对象有 main 函数 一个着色器对象可连接到多个程序对象 21

链接程序 void gllinkprogram(gluint program); 链接程序对象 program, 生成可执行程序 链接前, 连接到程序对象的着色器对象必须已成功编译 可以调用 glgetprogramiv() 函数以 GL_LINK_STATUS 为参数查询链接结果 可以调用 glgetprograminfolog() 函数查看链接信息日志 22

使用程序 void gluseprogram(gluint program); 安装可执行程序 program 作为 OpenGL 渲染状态机的一部分进行顶点和 / 或片段处理 program 为 0 时, 使用固定功能流水线 程序对象在使用中时, 应用程序可以随意修改甚至删除程序对象, 而不会影响作为当前状态机一部分的可执行代码 gllinkprogram() 成功重链接使用中的程序对象后, 将安装生成的可执行代码作为当前渲染状态机的一部分 23

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

清理函数 void gldeleteprogram(gluint program); 删除程序对象 program 如果程序对象不是正在使用的渲染状态机的一部分, 立即删除 ; 否则, 标记为删除 当程序对象被删除时, 所有连接的着色器对象将被分离出来 25

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

查询函数 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 表示无日志连接的着色对象的个数活动属性变量的个数活动一致变量的个数 27

查询函数 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() 查询得到 28

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

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

Thanks for your attention! 31