游戏开发51课 性能优化9

news2024/11/16 5:51:40

 

4.5 光照模型(Lighting/Illumination Model)

4.5.1 Flat Shading(平面着色)

根据表面法向量计算光照,并应用到整个面片上。速度最快,效果最差,容易暴露物体的多边形本质(下图)。

4.5.2 Gouraud Shading(高洛德着色)

根据顶点法向量计算光照,再用插值计算出整个面的光照。效果比Flat shading稍好,但高光部分有瑕疵,过渡不够自然(下图)。

可结合Phong Shading做优化,高光弱时用Gouraud Shading,高光强时用Phong Shading,可平衡效果和效率。

4.5.3 Lambert Shading(兰伯特着色)

物体表面向各个方向等强度的反射光,这种等同地向各个方向散射的现象称为光的漫反射。Lambert定律:反射光线的强度与表面法线和光源方向之间的夹角成正比(下图)。它是一种理想的漫反射模型,但着色效果比高洛德要平滑。

计算公式:

cdiffuse=(clight⋅mdiffuse)max(0,n⃗ ⋅l⃗ )cdiffuse=(clight⋅mdiffuse)max(0,n→⋅l→)

4.5.4 Half Lambert Shading(半兰伯特着色)

Lambert着色有个缺陷,就是背面受光少,经常处理死黑状态,与受光面反差太大(下图左)。于是其中的一种改进方案诞生了,它就是Half Lambert Shading,它渲染的画面明暗关系没那么强烈,过渡更加自然(下图右)。

计算公式:

cdiffuse=(clight⋅mdiffuse)(a(n⃗ ⋅l⃗ +b)cdiffuse=(clight⋅mdiffuse)(a(n→⋅l→+b)

其中aa和bb是常数,通常都取0.50.5,而且a+b=1.0a+b=1.0。

4.5.5 Phong Shading(冯氏着色)

Phong着色将光照分成自发光(Emissive)/环境光(Ambient)/漫反射(Diffuse)/高光(Specular)四个部分,每个部分独自计算光照贡献量。是当前广泛应用的一种光照模型。

其中高光计算公式:

cspecular=(clight⋅mspecular)max(0,n⃗ ⋅r⃗ )mglosscspecular=(clight⋅mspecular)max(0,n→⋅r→)mgloss

Phong着色效果如下:

4.5.6 Blinn-Phong Shading

由于Phong模型要用到反射矢量rr,而rr计算比较耗时(下),故有了Blinn Phong。

r⃗ =2(n⃗ ⋅l⃗ )n⃗ −l⃗ r→=2(n→⋅l→)n→−l→

Blinn Phong是Phong的一个改进,做法是摒弃反射矢量rr,引入l和vv的中间矢量hh,然后利用nn和hh的夹角进行计算。

  

高光计算公式:

cspecular =(clight ⋅mspecular )max(0,n⃗ ⋅h⃗ )mgloss cspecular =(clight ⋅mspecular )max(0,n→⋅h→)mgloss 

它渲染出的高光范围更大(下图),真实感不如Phong着色,但胜在效率更高。

4.5.7 光照模型的选择

从性能上做比较:Flat > Gouraud > Lambert > Half Lambert > Blinn-Phong > Phong。但画质效果刚好相反,所以每个游戏需根据具体需求做选择。也可以采用分级策略,高中低画质分别采用不同的光照模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/79187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务框架 SpringCloud微服务架构 29 ES 集群 29.4 分布式新增和查询流程

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构29 ES 集群29.4 分布式新增和查询流程29.4.1 ES集群的分布式存储29.4.2 总…

鸿蒙手机卸载内置应用 adb连接

鸿蒙手机傻瓜式卸载内置应用 adb连接**傻瓜式删除鸿蒙系统内置应用,自己亲测有效。**准备物品准备软件准备工作教程开始:第一步第二步完成包名列表一般软件谷歌服务格外的注意连接错误**鸣谢**傻瓜式删除鸿蒙系统内置应用,自己亲测有效。 准…

缓存数据丢了,原来是Redis持久化没玩明白

📣📣📣📣📣📣📣 🎍大家好,我是慕枫 🎍前阿里巴巴高级工程师,InfoQ签约作者、阿里云专家博主,一直致力于用大白话讲解技术知识 &#x…

Windows下MySQL5.5升级5.7(或直接安装MySQL5.7)

Windows下MySQL5.5升级5.7(或直接安装MySQL5.7) 1、关闭MySQL服务: Ctrl shift Esc找到服务,找到下面的MySQL服务,停止服务。 2、卸载程序: 控制面板中卸载mysql5.5。 3、删除mysql5.5的安装目录及注…

Linux文件操作

文章目录前言什么是文件文件操作C语言文件操作接口文件操作系统调用接口文件描述符如何理解FILE和文件描述符的关系前言 本文主要介绍的是Linux系统下的文件操作和Linux的文件系统的机制,希望能够通过本文来增加读者对于文件操作的基本使用和理解。以及了解Linux系…

【大数据入门核心技术-Ambari】(一)Ambari介绍

一、什么是Ambari Apache Ambari是一种基于Web的工具,支持Apache Hadoop集群的供应、管理和监控。Ambari已支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、 Hbase、Zookeeper、Sqoop和Hcatalog等。 Apache Ambari 支持HDFS、MapReduce、Hive、Pi…

C语言宏和预处理

C语言宏和预处理【1】include【2】【#pragma】【3】C #include【4】# 和 ## 操作符【5】宏替换【6】#line【7】#error【8】#undef【9】源码【10】结果【1】include #include本命令包含一个文件并在当前位置插入.一般尖括号意味着在标准库目录中搜索, #include “filename” 引…

【C语言与汇编】简单学学C到汇编代码

C语言与汇编 部分过程可参考C primer plus 本书余下的篇幅讨论源代码文件中的内容;本节讨论创建源代码文 件的技巧。有些C实现(如Microsoft Visual C、Embarcadero C Builder、Apple Xcode、Open Watcom C、Digital Mars C和Freescale CodeWarrior&…

精品基于SSM的民宿预订管理系统

《民宿预订管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术: 开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:my…

云原生事件驱动框架(KnativeEventing)

事件驱动是指事件在持续事务管理过程中,进行决策的一种策略。可以通过调动可用资源执行相关任务,从而解决不断出现的问题。通俗地说是当用户触发使用行为时对用户行为的响应。在 Serverless 场景下,事件驱动完美符合其设计初衷之一&#xff1…

基于xv6的Copy-On-Write

为什么需要写时拷贝呢? 当 shell执行指令的时候会 fork(),而这个 fork()出来的进程首先会调用的就是 exec来执行对应的命令,如果我们将 fork()创建的进程对地址空间进行了完整的拷贝,那将是一个巨大的消耗 因为在实际应用中,for…

SSM项目整合

文章目录1. 导入依赖2. 配置web.xml文件3. 编写springmvc.xml配置文件4. 编写spring.xml配置文件5. 编写项目整体业务逻辑6. 开发过程中常见状态码错误1. 导入依赖 在整合SSM项目时,需要导入以下依赖 Spring 相关依赖 (springmvc相关、事务相关、spring…

凤姐从国外回来会再次爆红吗?她最近的一段话发人深省

随着互联网的发展,也诞生了很多的网红,其实现如今的众多网红,和凤姐比起来都是小巫见大巫。凤姐原名叫罗玉凤,当年因为参加各种选秀节目,再加上鬼使神差语无伦次的言谈,让她一夜之间爆红了网络。 其实当我们…

Pandas统计计数value_counts()的使用

value_counts()方法返回一个序列Series,该序列包含每个值的数量(对于数据框中的任何列,value_counts()方法会返回该列每个项的计数) value_counts()是Series拥有的方法,一般在DataFrame中使用时,需要指定对哪一列进行使用 语法 …

微服务框架 SpringCloud微服务架构 29 ES 集群 29.5 故障转移

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构29 ES 集群29.5 故障转移29.5.1 ES集群的故障转移29.5.2 总结29 ES 集群 …

【图像分割】粒子群优化T熵图像分割【含Matlab源码 286期】

⛄一、简介 本文所采用的基于熵的切割点和最小描述长度原则(MDLP)。 A.特征选择 特征选择是一个组合优化问题,因为在具有N个特征的数据集上有2N个可能的不同特征子集。FS方法通常有两个重要的部分组成,即搜索技术和特征评估方法。 在特征评估方面&am…

Python项目之文化和旅游数据可视化

文章目录关键词一、做什么二、怎么做1.爬取数据和处理2.数据库设计,并将数据写入数据库3.开发后端接口4.使用Echarts官方模板三、效果展示关键词 Python后端开发Python网络爬虫Echarts可视化面向对象(见源码) 一、做什么 国家5A级旅游景区数据可视化 国家级旅游休…

状态设计模式

一、状态模式 1、定义 状态模式(State Pattern)又称作状态机模式(State Machine Pattern),允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。属于行为型设计模式。 状态模式的核心是…

Python:面向对象

目录 一、类的定义 基本语法 python与Java关于类的封装的区别 自定义构造方法 Java与Python的区别 源码 同一个类多种构造函数的构建 源码 二、魔法方法 基础部分 比较部分 与Java的区别 容器类型 三、属性管理 四、封装 基础部分 方法拓展 五、继承&多态 继…

基础IO——系统调用文件

文章目录1. 知识补充和回顾1.1 回顾C文件接口1.2 理论理解2. 系统调用文件接口2.1 open2.2 怎么使用2.3 close和write2.4 read1. 知识补充和回顾 1. 文件文件内容文件属性。即使创建一个空文件,也会占据磁盘数据。 2. 文件操作文件内容操作文件属性操作。在操作文件…