第二十三章 材质

news2024/11/23 0:49:37

3D模型主要是通过材质(Material)和贴图(Texture)来表现其精美的外表,说白了就是一张“画皮”而已。我们之前的DirectX课程中介绍过材质,它实际就是对光的反射率,这样简单的设置并不能展现3D模型的外观,因此就引入了贴图来展示模型物体的表面纹理。请注意,贴图是材质的一部分,因为材质的本质就是颜色,图像是展示颜色的最好方式。但是,本章节要讲的是PBR材质。PBR全称Physically Based Rendering,译成中文是基于物理的渲染,是目前非常流行的一种拟真渲染技术。它是利用真实世界的原理和理论,通过各种数学方法推导或简化或模拟出一系列渲染方程,并依赖计算机硬件和图形API渲染出拟真画面的技术。

以上是电影《战斗天使》的画面。主角阿丽塔是计算机通过PBR技术渲染出来的虚拟角色。对于游戏而言,PBR材质已经成为了次时代游戏的标配。Unity从5.0开始就支持PBR材质了。Unity内部实现机制遵循了PBR的基本准则,支持金属度,表面粗糙度,能量守恒,菲涅尔反射,表面阴影遮蔽等特性。

接下来,我们仍然在“LightDemo”工程中创建一个新的场景SampleScene2.unity。材质也是一个资源,所以我们要在Project视图中右键选择“Create”->“Material”,然后重命名为“TestMaterial”即可,截图如下:

我们选中“TestMaterial”材质文件,然后查看它的Inspector检视面板,查看它的属性

在我们之前的很多章节中,我们已经简单使用过材质了。我们基本上都是设置一个颜色值而已。修改的方式就是点击“Albedo”后面的颜色框,非常的简单。接下来,我们就系统性的讲解一下材质的各个属性。

首先是Shader的分类:standard和standard(Specular setup)

两者区别是,standard使用了金属模拟的外观,而standard(specular setup)使用镜面模拟的外观。两者都支持PBR材质,只是对应的参数是不一样的。我们一般使用标准着色器standard就行了。什么是Shader?它与材质的关系是什么?在Unity中,材质与Shader的关系很紧密,Shader是材质的一部分,称之为着色器。着色器的本质就是一小段程序,它负责将网格模型和贴图或者颜色按照指定的算法进行渲染输出。简单的理解,Shader的作用是告诉GPU如何去绘制模型的每一个顶点的颜色以及最终每一个像素点的颜色。另外,Shader与渲染管线也有密切的关系。我们之前在DirectX课程中讲过渲染管线的一些内容,它是非常复杂的流程,包括坐标系转换,光照计算,光栅化等等。固定渲染管线已经帮我们实现了大部分的流程,我们能够做的大部分操作只是对模型的控制,但是如果想要实现逼真的现实世界的画面,我们就需要对渲染管线的内部流程进行定制,也就是我们所说的可编程渲染管线。在Unity中就是通用渲染管线 (URP)和高清渲染管线 (HDRP)两种。在这个渲染流程中,我们就可以使用Shader来实现基于物理的着色渲染(PBR)。可以说,Shader是可编程渲染管线中非常重要的一部分,也是实现AAA级游戏画面的关键部分。

接下来就是“Rendering Mode”渲染模式,它有如下几项可以选择:Opaque(不透明),Cutout(裁剪),Fade(渐变),Transparent(透明)四种,他们影响的是透明效果,解释如下:

1. Opaque此项为默认设置,适用于没有透明区域的普通固体对象,说白了就是不透明。

2. Cutout用于创建在不透明区域和透明区域之间具有硬边的透明效果(只有透明和不透明)。

3. Transparent适用于渲染逼真的透明材质(可以设置透明度),如玻璃效果。

4. Fade - 允许透明度值完全淡出对象,可对淡入或淡出的对象进行动画化。

我们以一张图片为例,来说明“Rendering Mode”渲染模式的区别。

首先,我们创建一个Plane,然后调整它的参数,如下

 

接下来,我们将之前的一张照片(sunwukong.bmp)放置到Assets目录下。

接下来,我们如何将图片添加材质中呢?很简单,只需要将图片拖动到Albedo”前面的矩形框内,不是后面的颜色框哦。如下所示

同时,在Project面板中材质文件也会发生变化,

接下来,我们如何将材质赋予Plane平面上面呢?直接拖动材质文件到Plane上或者其Inspector检视面板中即可。这样拖动的最终设置如下

平面Plane的Mesh Renderer组件用于渲染游戏对象,它的第一个属性就是Materials材质组。我们拖动的效果就是将我们的材质赋予了材质组的第一个材质元素。回到我们Scene场景中,就会发现Plane会显示我们的图片了。

可能是由于我们对平面Plane的旋转是不对的,因此我们重新调整一下。

我们Play运行工程,查看效果

这是“Rendering Mode”渲染模式默认Opaque的效果(不透明)。

这是Cutout裁剪的效果。

这是Fade渐变效果(与Cutout裁剪类似)。

这是Transparent透明效果。

接下来我们重点说一下PBR相关的参数:

Albedo:基础色,可使用一个颜色值,也可用使用纹理贴图。相当于我们之前的漫反射颜色。

Metallic:金属度,数值在0-1之间,也可以用金属贴图代替,此时Smoothness参数会消失。金属度影响的是高光反射,数值越高,金属感越强。金属度贴图本身是一张灰白图,越白的地方,金属度越强烈,越黑的地方金属度越低。

Smoothness:光滑度,数值在0-1之间,表示材质表面的粗糙程度,影响的是反射效果。

Smoothness Source:指定存储光滑度数据的纹理通道,可选择金属度贴图的Alpha通道或基础色贴图的Alpha通道。

请注意,金属度和光滑度影响的是物体表面的反射情况,图片可能无法看到这种效果。我们使用一个球体,并附加颜色值为(123,78,8,255)的橙黄色材质来查看这两个属性的作用效果。默认情况下,金属度Metallic为0,且光滑度Smoothness为0.5,效果如下

我们可以清晰的看到高光部分,接下来我们调整光滑度Smoothness为0(金属度也是0)

高光没有了,接下来我们调整金属度Metallic为0.5(光滑度是0)

颜色偏暗,接下来调整光滑度Smoothness为0.5(金属度也是0.5)

现在就非常像一个金属球了。

接下来介绍的是四个贴图:Normal Map,Height Map,Occlusion和Detail Mask

1. Normal Map:法线贴图;用于增加模型的表面细节;只是改变的表面上的光照结果,并没有真正改变表面上的形状。通过法线贴图使物体低模物体表面具有高度的细节效果。法线贴图本身是一张蓝色的凹凸图。它的原理就是将模型表面的法线向量(x, y, z)存储到一个 RGB 纹理贴图中。法线贴图一般都是通过高模烘焙得到的,并不是手绘的。

2. Height Map:高度图,法线贴图和高度贴图都是凹凸贴图(Bump Map)。它们都是用贴图,去展现低模的表面细节,但它们以不同的方式存储数据。高度图应为灰度图像,白色区域表示纹理的高区域,黑色表示低区域。与法线贴图对比,这种技术更复杂,性能也更高。高度图和法线贴图可以一起搭配使用。

3. Occlusion 称之为AO贴图,负责环境光和环境光反射产生的间接光照,主要用于改善阴影,给场景(模型)更多的深度,有助于更好的表现模型的细节。AO 贴图本身是一张灰白图。

4. Detail Mask 细节遮罩贴图,这个贴图是配合“Secondary Maps”中的 Detail Albedo,Normal Map 两张贴图配合使用的,可以屏蔽模型的某些区域的细节纹理。这意味着您可以在某些区域显示细节纹理,某些区域不显示。这里顺便说一下“Secondary Maps”,也就是细节贴图,主要在近距离观察时具有清晰的表面细节。

最后在介绍一个“Emission”,也就是让模型自发光,这个比较简单。

总结,我们发现基于PBR材质的渲染,能够达到非常逼真的效果。但是,它需要很多的贴图来支持,这就需要美工人员来进行制作。现代游戏的研发流程:美术用建模软件,建立高模模型,然后制作出法线贴图。然后把这个法线贴图,用于减面之后的低模模型上,这样就能用普通贴图,在低模上渲染出高模上的细节。在软件使用上,除了我们日常使用的3ds max和maya之外,推荐大家使用Substance 这款软件。Substance是Allegorithmic公司的一套PBR美术制作工具,包括Substance Painter和Substance Designer两款软件。其中,Substance Painter是PBR贴图绘制软件,该软件提供了大量的画笔与材质,可以让我们轻轻松松的导入自己的模型,然后绘制输出PBR贴图。2019年初,Adobe公司收购Substance Painter和Substance Designer的开发公司Allegorithmic。随后,Adobe就发布了Substance 3D 全家桶,全新发布的 Adobe Substance 3D 系列应用软件由 Substance 套件进化而来。例如,Substance 3D Stager是三维场景搭建软件,Substance 3D Painter是次世代游戏贴图绘制软件,Substance 3D Sampler是真实材质贴图制作软件,Substance 3D Designer是三维贴图材质制作软件。目前使用比较多的是Adobe Substance 3D 2022版本,对应是Substance Painter是7.4版本。

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

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

相关文章

Linux线程 概念、特点、线程间资源共享情况

1. 线程概念 线程是轻量级的进程;Linux中,线程本质上仍是进程。 进程是OS分配资源的最小单位,线程是OS调度的最小单位。 NPTL 当前Linux线程库为redHat开发的NPTL,查看本地线程库版本: getconf GNU_LIBPTHREAD_VE…

【C++】三元操作符、创建并初始化C++对象、C++new关键字

C的三元操作符 if的语法糖 例1 #include <iostream> #include <string>static int s_Level 1; static int s_Speed 2;int main() {if (s_Level > 5){s_Speed 10;}else{s_Speed 5;}std::cin.get(); }用三元操作符&#xff1a; s_Speed s_Level > 5 ?…

基础篇-并发篇

**63.线程状态 添加主线程和子线程 ** 65.线程状态 核心线程和任务队列都是有上限的&#xff0c;所以都满了话就开始使用救急线程; 救急线程也是有上限的&#xff0c;如果再来新的线程的话就需要拒绝策越; 注意&#xff1a;这里不需要等待5000ms&#xff0c;几乎是同时打印 注…

[230503] 2021年托福阅读真题第1篇|Grinding Grain 磨粒

11:21&#xff5e;11:41 慢 20min 正确率&#xff1a;6.5/10 题目来源&#xff1a;链接: https://pan.baidu.com/s/15FYCuD7__slfGvdsBIHgLQ 提取码: iynj --来自百度网盘超级会员v5的分享【内含2021年100篇托福阅读真题】 目录 Grinding Grain 题目 Grinding Grain It now…

2016 ICPC合肥站 传递 HDU-5961(拓扑排序 / bitset / 暴力(可hack))

题目链接&#xff1a;HDU-5961 传递 中文题面就不解释题目意思&#xff0c;解释一下名词的意思 完全图&#xff1a;对于一个无向图 G G G 而言&#xff0c;设点集为 V V V&#xff0c;点集中任意不相同两点 u , v u, v u,v 间都有且仅有一条边叫做完全图。 竞赛图&#xff1…

【玩转Git三剑客笔记】第一章 Git基础

第一章 Git基础 1.综述2.安装Git3.使用Git之前需要做的最小配置4.创建第一个仓库并配置local用户信息1.创建Git仓库2.设置Git最小配置 5.通过几次commit来认识工作区和暂存区1.将工作区中所有已经被git追踪的文件一起添加到暂存区2.git log查看提交日志 6.给文件重命名的简便方…

密码学【java语言】初探究

文章目录 前言一 密码学1.1 古典密码学1.1.1 替换法1.1.2 移位法1.1.3 古典密码破解方式 二 近代密码学2.1 现代密码学2.1.1 散列函数2.1.2 对称密码2.1.3 非对称密码 二 凯撒加密的实践2.1 基础知识&#xff1a;ASCII编码2.2 ascii编码演示2.3 凯撒加密和解密实践2.4 频率分析…

安装Ubuntu22.04虚拟机的一些常见问题解决方法

文章目录 VirttalBox 开启共享剪切板文件夹、拖放的功能VirtualBox 安装 ubuntu后安装增强工具无效的解决办法解决ubuntu您没有权限查看“ 某某文件夹”的内容所需的权限linux更换源的两种方法[如何在 Ubuntu 20.04 上安装 Visual Studio Code - ](https://zhuanlan.zhihu.com/…

【Java入门合集】第二章Java语言基础(二)

【Java入门合集】第二章Java语言基础&#xff08;二&#xff09; 博主&#xff1a;命运之光 专栏JAVA入门 学习目标 掌握变量、常量、表达式的概念&#xff0c;数据类型及变量的定义方法&#xff1b; 掌握常用运算符的使用&#xff1b; 掌握程序的顺序结构、选择结构和循环结构…

权限提升:不带引号服务路径 || 不安全的服务权限.

权限提升&#xff1a;不带引号服务路径 || 不安全的服务权限. 权限提升简称提权&#xff0c;由于操作系统都是多用户操作系统&#xff0c;用户之间都有权限控制&#xff0c;比如通过 Web 漏洞拿到的是 Web 进程的权限&#xff0c;往往 Web 服务都是以一个权限很低的账号启动…

Nature:李龙等揭示抑郁症模型中社交压力阻断社交奖赏的神经环路机制

在人类社会中&#xff0c;社会压力尤其是创伤性社会经历会导致抑郁症、社交焦虑及创伤后应激障碍等多种精神疾病【1】。在抑郁症研究领域&#xff0c;有研究表明社会创伤会损害大脑负责奖赏的脑区功能&#xff0c;使社交活动变得不再有奖赏性&#xff0c;从而导致严重的社交回避…

【ShenYu系列】ShenYu Dubbo插件全流程源码解析

网关启动 在ShenyuConfiguration注入ShenyuWebHandler。 Bean("webHandler")public ShenyuWebHandler shenyuWebHandler(final ObjectProvider<List<ShenyuPlugin>> plugins, final ShenyuConfig config, Lazy final ShenyuLoaderService shenyuLoaderS…

初识Go语言20-包与工程化【用go mod管理工程、包引入规则、init调用链、可见性】

文章目录 包与工程化用go mod管理工程包引入规则init调用链可见性 包与工程化 用go mod管理工程 初始化项目: go mod init $module_name$module_name和目录名可以不一样。上述命令会生成go.mod文件&#xff0c;该文件内容形如&#xff1a; module go-coursego 1.17require (…

HarmonyOS服务卡片开发-文件组织与配置学习

HarmonyOS服务卡片开发-文件组织与配置学习 1.文件组织 目录结构 JS服务卡片(entry/src/main/js/Component)的典型开发目录结构如下&#xff1a; 目录结构中文件分类如下&#xff1a; .hml结尾的HML模板文件&#xff0c;这个文件用来描述卡片页面的模板布局结构。 .css结…

云计算(Cloud Computing)

一、从技术概念理解云计算 早期的云计算就是虚拟化主机上的分布式计算&#xff0c;现阶段的云计算&#xff0c;已经不单单是一种分布式计算&#xff0c;而是分布式计算、效用计算、负载均衡、并行计算、网络存储、热备份冗杂和虚拟化等计算机技术混合演进并跃升的结果。云计算…

飞书接入ChatGPT,打造属于自己的智能问答助手

文章目录 前言环境列表视频教程1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 转载自远控源码文章&#xff1a;飞书接入ChatGPT - 将ChatGPT集…

太酷了,库昊

昨天晚上凌晨3点30&#xff0c;勇士和国王的第7场比赛开打。 在上一局在勇士主场干翻勇士后&#xff0c;国王队的信心倍增&#xff0c;他们用自己的节奏一次次击溃勇士&#xff0c;特别是今天的前两节&#xff0c;国王能能够回应勇士的进球&#xff0c;防守也更有侵略性。今天不…

Spring第九阶段:Spring的注解功能

注解功能 1、注解配置Dao、Service、Controller组件 通过注解分别创建Dao、Service、Controller Spring配置bean的常用注解有 Controller 配置web层的组件 Service 配置Service组件 Repository 配置Dao组件 Component 配置JavaBean( 除Service , Dao , Controller组件之外的…

台积电和三星都变脸了,美国图谋失败,外媒:拜登心都碎了

美国的图谋甚大&#xff0c;然而美国的图谋却又如此迅速的浮现&#xff0c;看穿美国图谋的台积电和三星两家芯片企业如今不干了&#xff0c;这将破坏美国的计划&#xff0c;让美国无可奈何。 一、美国精心编织的大网 从数年前开始&#xff0c;美国就要求台积电和三星上交机密数…

想学编程但没有好的资料 来这 Python 爬取信息并写入数据,最详细教程

提示一下&#xff1a;我这个中一些用import引用的软件包&#xff0c;你们小白记得要下载哟 不然的话会报错的哟&#xff01; 下载软件包很简单的! 话不多说&#xff0c;直接开始… from selenium.webdriver.common.by import By from selenium import webdriver import re, …