Python极客项目编程123: 10.3.6 渲染

AI牛丝
AI牛丝
2017年03月01日 阅读量:7108

10.3.6 渲染

代码按照以下步骤来渲染喷泉粒子系统:

1.启用顶点/片断程序;

2.设置模型视图和投影矩阵;

3.基于当前摄像机的观看方向,计算并设置公告板矩阵;

4.针对位置、时间、生命周期和颜色,设置uniform变量;

5.针对顶点、纹理坐标、时间延迟和速度,设置顶点属性数组;

6.启用纹理并绑定到粒子火花纹理;

7.禁用深度缓冲写入;

8.启用OpenGL的混合;

9.绘制几何图形。

让我们来看看实现其中一些步骤的代码片段。

计算公告板的旋转矩阵

这段代码计算公告板的旋转矩阵:

      N = camera.eye - camera.center

❶     N /= numpy.linalg.norm(N)

      U = camera.up

      U /= numpy.linalg.norm(U)

      R = numpy.cross(U, N)

      U2 = numpy.cross(N, R)

❷     bMatrix = numpy.array([R[0], U2[0], N[0], 0.0,

                  R[1], U2[1], N[1], 0.0,

                  R[2], U2[2], N[2], 0.0,

                  0.0, 0.0, 0.0, 1.0], numpy.float32)

❸     glUniformMatrix4fv(self.bMatrixU, 1, GL_TRUE, bMatrix)

你已经看到了构造一个旋转矩阵背后的理论,该矩阵让四边形保持为“公告板”,即对准观看方向(这是必需的,以便让喷泉粒子总是面对观察的方向)。在❶行,用numpy.linalg.norm()对向量规一化(这使得向量的大小等于1)。在❷行,将旋转矩阵组装为一个numpy数组,然后在❸行将它放入程序中。

主要的渲染代码

主要的渲染代码用alpha混合,让粒子系统有透明性。这种技术在OpenGL中常用于渲染半透明物体。

    # enable texture

❶   glActiveTexture(GL_TEXTURE0)

❷   glBindTexture(GL_TEXTURE_2D, self.texid)

❸   glUniform1i(self.samplerU, 0)



    # turn depth mask off

    if self.disableDepthMask:

❹      glDepthMask(GL_FALSE)



    # enable blending

    if self.enableBlend:

❺      glBlendFunc(GL_SRC_ALPHA, GL_ONE)

❻      glEnable(GL_BLEND)



    # bind VAO

❼   glBindVertexArray(self.vao)

    # draw

❽   glDrawArrays(GL_TRIANGLES, 0, 6*self.numP)

在❶行,激活第一个OpenGL纹理单元(GL_TEXTURE0)。我们只有一个纹理单元,但由于在OpenGL上下文中,同一时间可以激活多个纹理单元,所以针对每个纹理单元显式调用是良好的编程习惯。在❷行,激活纹理对象,它是在ParticalSystem的构造函数中,利用glutils.loadTexture()和火花图像创建的。

纹理利用采样在着色器中访问,在❸行,设置采样变量使用第一个纹理单元GL_TEXTURE0。然后,利用OpenGL混合切除纹理中的黑色像素,但这些“看不见”的像素仍然具有关联的深度值,可以掩盖那些在它们后面的、其他粒子的某些部分。为了避免这种情况,在❹行禁用深度缓存写入。

 注意 

 
严格来说,这是错误的绘制方式,因为如果混合这些半透明的物体和不透明的物体,它们的深度测试就不正确。渲染这样的场景,正确的做法应该是先绘制不透明的物体,然后启用混合,按深度从后到前对半透明物体排序,最后绘制它们。但是,因为有这么多运动的粒子,这个简单的近似是可以接受的,而且最后,它看起来不错,而这才是你关心的。

在❺行,设置OpenGL混合功能,以便使用从片段着色器传入的源像素的alpha值,在❻行,启用OpenGL混合。然后,在❼行绑定到创建的VAO,这启用了你建立的所有的顶点属性,在❽行,在屏幕上绘制绑定的顶点缓冲区对象。

来源: https://www.ai2news.com

推荐文章



python极客项目编程 中文pdf完整版入门到精通(视频400集

python极客项目编程 中文pdf完整版入门到精通(视频400集

3425 | 1588 | 2022-01-17
开发有趣的极客项目,掌握实用的Python编程技能 Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。通过Python 编程,我们能够解决现实生活中的很多任务。Python极客项目编程pdf适合那些想要通过 Python 编程来进行尝试和探索的读者,适合了解基本的Python 语
完整版
数据类型
学习方法
入门
精通

Python核心编程(第2版): 10.3.6 “异常参数”

Python核心编程(第2版): 10.3.6 “异常参数”

95794 | 17914 | 2008-07-01
10.3.6 “异常参数” 异常也可以有参数,异常引发后它会被传递给异常处理器。当异常被引发后参数是作为附加帮助信息传递给异常处理器的。虽然异常原因是可选的,但标准内建异常提供至少一个参数,指示异常原因的一个字符串。 异常的参数可以在处理器里忽略,但Python提供了保存这个值的语法。我们已经在上边接触到相关内容:要想访问提供的异常原因,你必须保留一个变量来保存这个参数。把这个参数放在except语句后,接在要处理的异常后面。except语句的这个语法可以被扩展为: reason将会是一个包含来自导致异常的代码的诊断信息的类实例。异常参数自身会组成一个元组,并存储为类实例(异常类
派生类
表13
类myclass
类属性
module

项目画布(123)

项目画布(123)

63521 | 45991 | 2022-04-09
自1998年以来,海尔一直在试验自组织的工作单元和内部劳动力市场,目的是减少层级和控制,提高自主和自治权。然后,在2010年,海尔在整个公司实施了一个独特的项目组织平台。第一步是取消那些战略事业部和管理层级,与产品用户零距离。该公司重组为三个项目单元: Since 1998, Haier has b
市场
产品
管理
战略
has

用第七版管理项目(123)

用第七版管理项目(123)

60409 | 37296 | 2023-05-05
定性与定量风险分析 Qualitative Versus Quantitative Risk Analysis 当在风险分析中使用数字时,很容易得出该分析是定量的结论。【不要一看到数字,就认为是定量分析 】 When numbers are employed within risk analysis
quant
管理
when
数字
are

这个极客版编程速查表,怎一个绝字了得!

这个极客版编程速查表,怎一个绝字了得!

4779 | 3033 | 2022-12-15
让我们想象一下,好用的编程速查表(小抄),它应该是什么样子?它应该有什么特点? 简洁——它应该只包含你需要的东西,没有别的。 快速——应该可以立即使用它。 全面——它应该包含每个可能问题的答案。 通用——它应该随时随地可用,无需任何准备。 不显眼——它不应该分散你对主要任务的注意力,可以润物细无声。
注意力
注意
极客
编程

牛客网-python入门-编程练习-NP11

牛客网-python入门-编程练习-NP11

96758 | 94758 | 2023-07-21
11. 牛妹正在学英语,但是背单词实在是太痛苦了,她想让你帮她写一个小程序,能够根据输入的单词,快速得到单词的长度。 str=input() b=len(str) print(b) #主要len()方法 12. 牛牛、牛妹和牛可乐都是Nowcoder的用户,某天 Nowcoder 的管理员希望将他们
len
入门
编程
编程练习
now

牛客网-python入门-编程练习-NP51

牛客网-python入门-编程练习-NP51

55806 | 21491 | 2023-07-26
51.  牛牛刚学循环语句,你能教他使用for语句创建一个从10到50的数字列表吗?请输出完整列表,并输出列表的首尾元素检验是否是从10到50. list1=[] for i in range ( 10 , 51 ): list1. append (i) print (list1) a=
append
for语句
入门
循环语句
元素

牛客网-python入门-编程练习-NP41

牛客网-python入门-编程练习-NP41

2217 | 810 | 2023-07-25
41.  Python有位运算,是直接将数字看成二进制,直接对二进制数字的每一位进行运算。现输入两个十进制整数x、y,请计算它们的位与、位或,输出按照十进制的形式。 num=input() list1=list(num.split(' ')) x=int(list1[0]) y=int(list1[
split
十进制
入门
python入门
二进制

牛客网-python入门-编程练习-NP31

牛客网-python入门-编程练习-NP31

44492 | 35037 | 2023-07-25
31.  创建一个列表group_list,其中依次包含字符串 'Tom', 'Allen', 'Jane', 'William', 'Tony' 表示这个小组成员的名字。现有三项任务需要他们去完成,根据不同任务的繁琐度和实际情况需要分别派2人、3人、2人来完成,他们决定通过对列表分片来分配任务。
分片
入门
创建
python入门
编程语言

推荐图书




推荐文章










更多...
目录

  • 版权信息 & 版权声明
  • 内容提要 & 致谢
  • 前言 & 本书的目标读者
  • 本书的内容
  • 第一部分:热身运动
  • 第二部分:模拟生命
  • 第三部分:图像之乐
  • 第四部分:走进三维
  • 第五部分:玩转硬件 & 为何选择Python
  • Python的版本 & 本书的代码
  • 第一部分 热身运动
  • 第1章 解析iTunes播放列表 & 1.1 iTunes播放列表文件剖析
  • 1.2 所需模块 & 1.3 代码 & 1.3.1 查找重复
  • 1.3.2 提取重复
  • 1.3.3 查找多个播放列表中共同的音轨
  • 1.3.4 收集统计信息
  • 1.3.5 绘制数据
  • 1.3.6 命令行选项
  • 1.4 完整代码
  • 1.5 运行程序 & 1.6 小结 & 1.7 实验
  • 第2章 万花尺 & 2.1 参数方程
  • 2.1.1 万花尺方程
  • 2.1.2 海龟画图
  • 2.2 所需模块 & 2.3 代码 & 2.3.1 Spiro构造函数
  • 2.3.2 设置函数
  • 2.3.3 restart()方法
  • 2.3.4 draw()方法
  • 2.3.5 创建动画
  • 2.3.6 SpiroAnimator类
  • 2.3.7 genRandomParams()方法
  • 2.3.8 重新启动程序 & 2.3.9 update()方法
  • 2.3.10 显示或隐藏光标 & 2.3.11 保存曲线
  • 2.3.12 解析命令行参数和初始化
  • 2.4 完整代码
  • 2.5 运行万花尺动画 & 2.6 小结 & 2.7 实验
  • 第二部分 模拟生命
  • 第3章 Conway生命游戏
  • 3.1 工作原理
  • 3.2 所需模块 & 3.3 代码 & 3.3.1 表示网格
  • 3.3.2 初始条件
  • 3.3.3 边界条件
  • 3.3.4 实现规则 & 3.3.5 向程序发送命令行参数
  • 3.3.6 初始化模拟
  • 3.4 完整代码
  • 3.5 运行模拟人生的游戏 & 3.6 小结 & 3.7 实验
  • 第4章 用Karplus-Strong算法产生音乐泛音
  • 4.1 工作原理 & 4.1.1 模拟
  • 4.1.2 创建WAV文件
  • 4.1.3 小调五声音阶
  • 4.2 所需模块 & 4.3 代码 & 4.3.1 用deque实现环形缓冲区
  • 4.3.2 实现Karplus-Strong算法
  • 4.3.3 写WAV文件 & 4.3.4 用pygame播放WAV文件
  • 4.3.5 main()方法
  • 4.4 完整代码
  • 4.5 运行拨弦模拟 & 4.6 小结 & 4.7 实验
  • 第5章 类鸟群:仿真鸟群 & 5.1 工作原理
  • 5.2 所需模块 & 5.3 代码 & 5.3.1 计算类鸟群的位置和速度
  • 5.3.2 设置边界条件
  • 5.3.3 绘制类鸟群
  • 5.3.4 应用类鸟群规则
  • 5.3.5 添加个体
  • 5.3.6 驱散类鸟群 & 5.3.7 命令行参数
  • 5.3.8 Boids类
  • 5.4 完整代码
  • 5.5 运行类鸟群模拟 & 5.6 小结 & 5.7 实验
  • 第三部分 图片之乐
  • 第6章 ASCII文本图形 & 6.1 工作原理
  • 6.2 所需模块 & 6.3 代码 & 6.3.1 定义灰度等级和网格
  • 6.3.2 计算平均亮度 & 6.3.3 从图像生成ASCII内容
  • 6.3.4 命令行选项
  • 6.3.5 将ASCII文本图形字符串写入文本文件 & 6.4 完整代码
  • 6.5 运行ASCII文本图形生成程序 & 6.6 小结 & 6.7 实验
  • 第7章 照片马赛克
  • 7.1 工作原理 & 7.1.1 分割目标图像 & 7.1.2 平均颜色值
  • 7.1.3 匹配图像 & 7.2 所需模块 & 7.3 代码 & 7.3.1 读入小块图像
  • 7.3.2 计算输入图像的平均颜色值
  • 7.3.3 将目标图像分割成网格
  • 7.3.4 寻找小块的最佳匹配
  • 7.3.5 创建图像网格
  • 7.3.6 创建照片马赛克
  • 7.3.7 添加命令行选项
  • 7.3.8 控制照片马赛克的大小
  • 7.4 完整代码
  • 7.5 运行照片马赛克生成程序 & 7.6 小结
  • 7.7 实验
  • 第8章 三维立体画
  • 8.1 工作原理 & 8.1.1 感知三维立体画中的深度
  • 8.1.2 深度图
  • 8.2 所需模块 & 8.3 代码 & 8.3.1 重复给定的平铺图像
  • 8.3.2 从随机圆创建平铺图像
  • 8.3.3 创建三维立体画
  • 8.3.4 命令行选项
  • 8.4 完整代码
  • 8.5 运行三维立体画生成程序 & 8.6 小结 & 8.7 实验
  • 第四部分 走进三维
  • 第9章 理解OpenGL
  • 9.1 老式OpenGL
  • 9.2 现代OpenGL:三维图形管线 & 9.2.1 几何图元
  • 9.2.2 三维变换
  • 9.2.3 着色器
  • 9.2.4 顶点缓冲区 & 9.2.5 纹理贴图
  • 9.2.6 显示OpenGL & 9.3 所需模块 & 9.4 代码
  • 9.4.1 创建OpenGL窗口
  • 9.4.2 设置回调
  • 9.4.3 Scene类
  • 9.5 完整代码
  • 9.6 运行OpenGL应用程序
  • 9.7 小结 & 9.8 实验
  • 第10章 粒子系统
  • 10.1 工作原理 & 10.1.1 为粒子运动建模 & 10.1.2 设置最大范围
  • 10.1.3 渲染粒子 & 10.1.4 利用OpenGL混合来创建更逼真火花
  • 10.1.5 使用公告板
  • 10.1.6 生成火花动画 & 10.2 所需模块 & 10.3 粒子系统的代码 & 10.3.1 定义粒子的几何形状
  • 10.3.2 为粒子定义时间延迟数组
  • 10.3.3 设置粒子初始速度
  • 10.3.4 创建顶点着色器
  • 10.3.5 创建片段着色器
  • 10.3.6 渲染
  • 10.3.7 Camera类
  • 10.4 粒子系统完整代码
  • 10.5 盒子代码
  • 10.6 主程序代码
  • 10.6.1 每步更新这些粒子
  • 10.6.2 键盘处理程序
  • 10.6.3 管理主程序循环
  • 10.7 完整主程序代码
  • 10.8 运行程序 & 10.9 小结 & 10.10 实验
  • 第11章 体渲染
  • 11.1 工作原理 & 11.1.1 数据格式
  • 11.1.2 生成光线
  • 11.1.3 显示OpenGL窗口 & 11.2 所需模块 & 11.3 项目代码概述
  • 11.4 生成三维纹理
  • 11.5 完整的三维纹理代码
  • 11.6 生成光线
  • 11.6.1 定义颜色立方体的几何形状
  • 11.6.2 创建帧缓冲区对象
  • 11.6.3 渲染立方体的背面
  • 11.6.4 渲染立方体的正面 & 11.6.5 渲染整个立方体
  • 11.6.6 调整大小处理程序 & 11.7 完整的光线生成代码
  • 11.8 体光线投射
  • 11.8.1 顶点着色器
  • 11.8.2 片段着色器
  • 11.9 完整的体光线投射代码
  • 11.10 二维切片
  • 11.10.1 顶点着色器
  • 11.10.2 片段着色器 & 11.10.3 针对二维切片的用户界面
  • 11.11 完整的二维切片代码
  • 11.12 代码整合
  • 11.13 完整的主文件代码
  • 11.14 运行程序 & 11.15 小结 & 11.16 实验
  • 第五部分 玩转硬件
  • 第12章 Arduino简介 & 12.1 Arduino
  • 12.2 Arduino生态系统 & 12.2.1 语言 & 12.2.2 IDE & 12.2.3 社区
  • 12.2.4 外设 & 12.3 所需模块 & 12.4 搭建感光电路
  • 12.4.1 电路工作原理
  • 12.4.2 Arduino程序
  • 12.4.3 创建实时图表 & 12.5 Python代码
  • 12.6 完整的Python代码
  • 12.7 运行程序 & 12.8 小结 & 12.9 实验
  • 第13章 激光音乐秀
  • 13.1 用激光产生图案 & 13.1.1 电机控制
  • 13.1.2 快速傅里叶变换
  • 13.2 所需模块 & 13.2.1 搭建激光秀
  • 13.2.2 连接电机驱动器
  • 13.3 Arduino程序 & 13.3.1 配置Arduino数字输出引脚
  • 13.3.2 主循环
  • 13.3.3 停止电机 & 13.4 Python代码 & 13.4.1 选择音频设备
  • 13.4.2 从输入设备读取数据
  • 13.4.3 计算数据流的FFT
  • 13.4.4 从FFT值提取频率信息 & 13.4.5 将频率转换为电机速度和方向
  • 13.4.6 测试电机设置
  • 13.4.7 命令行选项
  • 13.4.8 手动测试
  • 13.5 完整的Python代码
  • 13.6 运行程序
  • 13.7 小结 & 13.8 实验
  • 第14章 基于树莓派的天气监控器
  • 14.1 硬件 & 14.1.1 DHT11温湿度传感器 & 14.1.2 树莓派
  • 14.1.3 设置树莓派 & 14.2 安装和配置软件
  • 14.2.1 操作系统 & 14.2.2 初始配置
  • 14.2.3 Wi-Fi设置
  • 14.2.4 设置编程环境
  • 14.2.5 通过SSH连接 & 14.2.6 Web框架Bottle
  • 14.2.7 用flot绘制
  • 14.2.8 关闭树莓派 & 14.3 搭建硬件
  • 14.4 代码
  • 14.4.1 处理传感器数据请求 & 14.4.2 绘制数据
  • 14.4.3 update()方法 & 14.4.4 用于LED的JavaScript处理程序
  • 14.4.5 添加交互性
  • 14.5 完整代码
  • 14.6 运行程序 & 14.7 小结
  • 14.8 实验 & 附录A 软件安装
  • A.1 安装本书项目的源代码 & A.2 在Windows上安装
  • A.2.1 安装GLFW & A.2.2 为每个模块安装预先构建二进制文件
  • A.2.3 其他选项 & A.3 在OS X上安装 & A.3.1 安装Xcode和MacPorts
  • A.3.2 安装模块
  • A.4 在Linux上安装 & 附录B 基础实用电子学
  • B.1 常用组件 & B.1.1 面包板 & B.1.2 光敏电阻(LDR) & B.1.3 集成电路(IC) & B.1.4 印刷电路板(PCB)
  • B.1.5 电线 & B.1.6 电阻 & B.1.7 发光二极管(LED) & B.1.8 电容器 & B.1.9 二极管 & B.1.10 晶体管
  • B.1.11 电池/电源 & B.2 基本工具 & B.2.1 万用表 & B.2.2 烙铁及配件 & B.2.3 示波器
  • B.3 搭建电路
  • B.4 下一步
  • 附录C 树莓派的建议和技巧 & C.1 设置Wi-Fi
  • C.2 检查树莓派是否已连接 & C.3 防止Wi-Fi适配器进入睡眠状态
  • C.4 从树莓派备份代码和数据
  • C.5 备份整个树莓派操作系统 & C.6 利用SSH登录到树莓派
  • C.7 使用树莓派相机 & C.8 在树莓派上启用声音 & C.9 让树莓派说话
  • C.10 让HDMI工作 & C.11 让树莓派移动 & C.12 检查树莓派的硬件版本
  • 欢迎来到异步社区! & 异步社区的来历 & 社区里都有什么? & 购买图书 & 下载资源 & 与作译者互动 & 灵活优惠的购书
  • 纸电图书组合购买 & 社区里还可以做什么? & 提交勘误 & 写作 & 会议活动早知道 & 加入异步

代做工资流水公司咸阳查流水襄阳车贷工资流水 模板郑州工资流水单查询株洲制作银行流水单烟台房贷工资流水 代做扬州办理银行流水修改江门工资银行流水代开蚌埠查购房银行流水株洲工资流水账单公司北京个人流水模板蚌埠房贷收入证明代做廊坊查银行流水账西安自存流水公司徐州打印自存银行流水铜陵工资代付流水代开莆田办理消费贷流水宜昌做日常消费流水咸阳银行流水办理兰州签证银行流水 代开蚌埠自存银行流水报价泰安在职证明打印南阳公司流水郑州企业对公流水报价海口打印工资证明南京代开背调工资流水咸阳工资代付流水代办三亚代做对公流水广州薪资流水单淮安日常消费流水公司南宁流水代开香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化