Unity(三) Shader着色器初探

学习3D开发技术的时候无可避免的要接触到Shader,那么Shader是个什么概念呢?其实对于开发同事来说还是比较难理解的,一般来说Shader是服务于图形渲染的一类技术,开发人员可以通过其shader语言来自定义显卡渲染页面的算法,从而达到按照自己的想法来渲染出目标效果。

1. Unity Shader

不同的图形API会对应不同的Shader语言,感兴趣的可以去了解下更多这方面的内容。Unity目前开发阶段基于Windows平台开发和运行,一般采用Direct3D或OpenGL,如需要兼容其他平台可在打包的时候选取对应平台如安卓、IOS等,并关注切换后是否存在”粉色“的情况,如出现模型表面为”粉色“,一般是Shader出现不兼容错误,需要修复。

在编码之前我们需要先来了解下Unity常见的几种Shader:

1. Surface Shaders 表面着色器

        Unity对Vertex/Fragment Shader的又一层包装,以使Shader的制作方式更符合人类的思维模式,同时可以以极少的代码来完成不同的光照模型与不同平台下需要考虑的事情。

2. Vertex/Fragment Shaders 顶点/片段着色器(重要)

        一般的顶点+片段着色器的工作原理如下图所示

a. 顶点处理(顶点着色器)

        主要执行坐标转换和逐顶点光照的任务,坐标转换是将顶点坐标从模型空间转换到齐次裁剪空间中,可以使用UnityObjectToClipPos()函数来实现。

b. 图元处理

        在裁剪空间中进行裁剪(Clipping)、背面剔除(Back-Face Culling)、屏幕映射(ScreenMapping)等操作。为的是剔除不需要的顶点/面,并做好三维坐标到二维屏幕坐标的转换。

c. 光栅化

        是将变换到屏幕空间的图元离散化为片元的过程。

d. 片段处理(片段着色器)

        (1). 纹理贴图 - Textures

        纹理贴图也称为纹理映射,是将图像信息映射到三角形网格上的技术,以此来增加物体表面的细节,令物体更具有真实感。

        (2). 光照计算 - Lighting

        光照由直接光和间接光组成,计算光照最常用的就是phong模型了,它是一个经验模型,参数信息都是经验得到的,并没有实际的物理意义,所以利用Phong模型会出现违背物理规则的时候。

漫反射Difuse + 镜面发射Specular + 环境光Ambient = Phong

         (3). 混合与测试

        输出合并(Output-Merger):在DirectX中,该阶段被称为输出合并阶段,而OpenGL将其称为逐片元操作(Per-Fragment Operations),从称呼中就可以看出,这个阶段主要是对每一个片元进行一些输出合并操作,包括Alpha测试、模板测试、深度测试和混合等,它的主要任务是决定片元的可见性,对通过测试的片元颜色进行混合

        Alpha测试:通过片元数据,可以获取该片元的alpha值,如果alpha值小于某个数的话,则直接将该片元丢弃,不进行渲染

        模板测试:GPU会首先读取模板缓冲区中该片元位置的模板值,然后将该值和读取到的参考值进行比较,例如小于时舍弃该片元,或者大于等于时舍弃该片元。

        深度测试:近处的物体会遮挡远处的物体,这种效果我们可以通过深度测试来模拟实现。

        混合:对于半透明物体,我们就需要使用混合操作来让这个物体看起来是透明的

e. 帧缓存

        可以简单理解为一个临时画布,GPU渲染完成的信息会存放在帧缓存区,等待使用,上述各种测试也是在帧缓冲区进行的

以下这个图更容易理解:

自己理解简而言之就是:

描点(坐标变换)-> 

连线(三角面)->

形成格子(光栅化)->

上色(纹理、光照、) ->

后期处理(测试、混合)

2. 几个和Shader相关的概念

(1)网格(Mesh)

        网格Mesh是GameObject的3D骨架,它是有顶点(Vertex)定义的一个2D多边形,这些顶点是3D空间中存储为XYZ坐标。网格还包括法线,Shader通过法线让面看起来更光滑。

(2)贴图、纹理(Maps、textures)

        纹理(Texture):2D 图像文件,它像一张纸一样环绕GameObject,以设置网格中的颜色、镜面反射或金属度、物理纹理和其他属性。图像文件的数据被组织为通道(RGB/RGBA)。

        底图纹理(Base Map Texture):一个常规 RGB 或 RGBA 彩色图像文件,用于定义对象表面的漫反射(即颜色)

        平铺纹理(Tiled Texture):平铺纹理的纹理设计为围绕任何网格平铺。每个文件中的地图就像地板上的瓷砖一样简单地重复

        UV贴图:对于像球体这样的基元和像我们的块这样的简单形状,纹理贴图在哪些点与对象的网格对齐并不重要。但是在角色模型等详细对象上,纹理贴图与网格的对齐非常重要

        Alpha裁剪(Alpha Clip):根据Mesh网格填充纹理,避免大量计算。(也可用于溶解效果、消失/出现效果)

        凹凸贴图(Bump Texture):使用凹凸贴图,着色器将表面细节的外观添加到网格中,而无需实际添加多边形。这种技术对性能更好。使用法线贴图和高度贴图(normal maps and height maps)

        法线贴图:通过设置顶点位置,使着色器创建表面上的片段(像素)面向不同方向的错觉。

        高度贴图:设置网格中每个像素的相对高度

        遮挡贴图(Occlusion Map):遮挡贴图为这些遮挡区域添加阴影。

        发射贴图(Emission Map):制作发光效果的贴图

(2)反射

        环境光遮蔽AO(Occlusion):大部分情况下,AO通过构造一个发射光线的半(hemisphere)来计算。半球上表面布满朝各个方向发射的光线,然后判断这些光线是否与其它的物体相交。如果光线到达背景或者天空,那么就增加这个光线发出点的表面亮度,如果与其他物体相交,则不用。(靠得非常近的物体之间的阴影效果会非常明显)

        漫反射(Base map):

        1. 反照率(Albedo):描述了漫反射的测量。它通常指定为常规颜色,表示为红色、绿色和蓝色的三个值(RGB 值)。RGB 值可以转换为色调、饱和度和亮度(亮度)的值。反照率颜色的亮度对应于漫反射的量,色调和饱和度描述了从表面逸出的光的质量。

        2. 地图(Map):地图可以是纯色的,也可以用 2D 图像指定以增加表面的变化。

        镜面反射(Specular):镜面反射作为材料的一种属性,是一种指定表面看起来像金属的方法。您可以使用两种工作流程来指定材质中的金属外观——Specular、Metallic

        平滑度(Smoothness):平滑度,也称为光泽度或光泽度,使镜面反射成为焦点。

3. 如何编写Shader

(1). ShaderLab

        ShaderLab 是一种在着色器源文件中使用的类C语言的声明性语言。它使用嵌套大括号语法来描述 Shader 对象。其结构如下:

Shader "Examples/ShaderSyntax"
{CustomEditor = "ExampleCustomEditor"Properties{// 此处是材质属性声明}SubShader{// 此处是定义子着色器的其余代码Pass{// 此处是定义通道的代码}}Fallback "ExampleFallbackShader"
}

ShaderLab是一种声明式语言格式来编写Shader,可在代码自由编写Shader支持的所有特性和属性,并设置回退行为。

(2). HLSL

都是着色语言,作为中间语言(Intermediate Language),即交给GPU可以理解的语言。

因为Microsoft和NVIDIA合作,所以Cg/HLSL实际上是同一种语言。而ShaderLab内部可以嵌套Cg/HLSL语言编写着色代码,需要嵌套在命令CGPROGRAM和ENDCG之间。如下:

Pass {// Pass 的标签和状态设置CGPROGRAM// 编译指令#pargma vertex vert#pargma fragment frag// CG代码ENDCG// 其他设置
}</pre>

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

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

相关文章

状态管理艺术——借助Spring StateMachine驭服复杂应用逻辑

文章目录 1. 什么是状态2. 有限状态机概述3. Spring StateMachine4. Spring StateMachine 入门小案例4.1 接口测试 5. 总结 1. 什么是状态 在开发中&#xff0c;无时无刻离不开状态的一个概念&#xff0c;任何一条数据都有属于它的状态。 比如一个电商平台&#xff0c;一个订…

MySQL (2) DQL

目录 操作须知 1 单表查询 1.1 范围查询 1.2 模糊查询 1.3 去重查询 1.4 正则查询 1.5 替换查询 1.6 排序查询 1.7 聚合分组查询 1.7.1 聚合查询(只有1行) 1.7.2 分组查询(针对"聚合查询") 1.8 分页查询 1.9 拼接查询 2 多表查询 2.1 内连接 2.2 外连…

npm介绍

npm介绍 npm&#xff08;Node Package Manager的缩写&#xff09;是一个软件包管理器&#xff0c;主要进行JavaScript的包管理。通过npm&#xff0c;我们可以很方便地进行JavaScript包的下载、升级&#xff0c;我们也可以把我们开发的JavaScript包共享给其他使用者。 在npm没…

CRC原理介绍及STM32 CRC外设的使用

1. CRC简介 循环冗余校验&#xff08;英语&#xff1a;Cyclic redundancy check&#xff0c;简称CRC&#xff09;&#xff0c;由 W. Wesley Peterson 于 1961 年首次提出的一种纠错码理论。 CRC是一种数据纠错方法&#xff0c;主要应用于数据通信或者数据存储的场合&#xff…

TLS协议深度解析:挖掘现代网络安全防御的底层技术

正常简单的通讯 1、服务器生成一对密钥&#xff0c;公钥A、私钥A 2、浏览器请求服务器时&#xff0c;服务器把公钥A传给浏览器 3、浏览器随机生成一个对称加密的密码S&#xff0c;用公钥A加密后传给服务器 4、服务器接收后&#xff0c;用私钥A解密&#xff0c;得到密钥S 5、浏…

java中HashMap如何根据value的值去获取key是多少

在Java中&#xff0c;HashMap是一种基于键值对存储数据的数据结构。HashMap并没有直接提供根据value获取key的方法。但你可以通过遍历HashMap的entrySet&#xff0c;找到对应的value&#xff0c;然后获取其对应的key。 以下是一个示例代码&#xff1a; public <K, V> K…

【深度学习实战—6】:基于Pytorch的血细胞图像分类(通用型图像分类程序)

✨博客主页&#xff1a;米开朗琪罗~&#x1f388; ✨博主爱好&#xff1a;羽毛球&#x1f3f8; ✨年轻人要&#xff1a;Living for the moment&#xff08;活在当下&#xff09;&#xff01;&#x1f4aa; &#x1f3c6;推荐专栏&#xff1a;【图像处理】【千锤百炼Python】【深…

dji uav建图导航系列()move_base

文章目录 1、导航框架2、move_base功能包3、amcl功能包4、代价地图的配置4.1、通用配置文件4.2、全局规划配置文件4.3、局部规划配置文件5、局部规划器配置6、launch文件1、导航框架 导航的关键是机器人定位和路径规划两大部分 move_base:实现机器人导航中的最优路径规划 am…

datagrip 相关数据连接信息无缝迁移

背景 因为公司换电脑了&#xff0c;接触的项目比较多&#xff0c;不同项目&#xff0c;不同环境的数据库连接有好几十个&#xff0c;如果在新电脑上挨个重新连接一遍劳心劳力&#xff0c;所以想看一下能不能直接将之前保存的连接信息直接迁移到新的电脑上面。 为此&#xff0c…

Docker:01 OverView

Docker&#xff1a;01 OverView 基本介绍 Docker是一个用于开发、交付、运行应用程序的开放平台&#xff0c;可以使应用程序与基础架构分开&#xff0c;以便快速交付软件。 Docker在一个被叫做容器的隔离环境下&#xff0c;提供了打包和运行的能力。 容器非常轻量化&#x…

Android studio 调整jar包顺序

第一步&#xff1a;编译jar包&#xff0c;放入lib路径下&#xff1a;如&#xff1a; 第二步&#xff1a;app 目录下build.gradle 中添加 compileOnly files(libs/classes.jar) 第三步&#xff1a;project目录下build.gradle 中添加 allprojects {gradle.projectsEvaluated {t…

第50节:cesium 绘制指定类型区域(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><el-button-group class="top_item"><el-button type=

1、Flutter移动端App实战教程【环境配置、模拟器配置】

一、概述 Flutter是Google用以帮助开发者在IOS和Android 两个平台开发高质量原生UI的移动SDK&#xff0c;一份代码可以同时生成IOS和Android两个高性能、高保真的应用程序。 二、渲染机制 之所以说Flutter能够达到可以媲美甚至超越原生的体验&#xff0c;主要在于其拥有高性…

Jetsonnano B01 笔记5:IIC通信

今日继续我的Jetsonnano学习之路&#xff0c;今日学习的是IIC通信&#xff0c;并尝试使用Jetson读取MPU6050陀螺仪数据。文章提供源码。文章主要是搬运的官方PDF说明&#xff0c;这里结合自己实际操作作笔记。 目录 IIC通信&#xff1a; IIC硬件连线&#xff1a; 安装IIC库文…

智能小车之蓝牙控制并测速小车、wife控制小车、4g控制小车、语音控制小车

目录 1. 蓝牙控制小车 2. 蓝牙控制并测速小车 3. wifi控制测速小车 4. 4g控制小车 5. 语音控制小车 1. 蓝牙控制小车 使用蓝牙模块&#xff0c;串口透传蓝牙模块&#xff0c;又叫做蓝牙串口模块 串口透传技术&#xff1a; 透传即透明传送&#xff0c;是指在数据的传输过…

掌握AI助手的魔法工具:解密`Prompt`(提示)在AIGC时代的应用(下篇)

前言&#xff1a;在前面的两篇文章中&#xff0c;我们深入探讨了AI助手中的魔法工具——Prompt&#xff08;提示&#xff09;的基本概念以及在AIGC&#xff08;Artificial Intelligence-Generated Content&#xff0c;人工智能生成内容&#xff09;时代的应用场景。在本篇中&am…

10.Xaml ListBox控件

1.运行界面 2.运行源码 a.Xaml 源码 <Grid Name="Grid1"><!--IsSelected="True" 表示选中--><ListBox x:Name="listBo

生成树协议 STP(spanning-tree protocol)

一、STP作用 1、消除环路&#xff1a;通过阻断冗余链路来消除网络中可能存在的环路。 2、链路备份&#xff1a;当活动路径发生故障时&#xff0c;激活备份链路&#xff0c;及时恢复网络连通性。 二、STP选举机制 1、目的&#xff1a;找到阻塞的端口 2、STP交换机的角色&am…

【Vue2.0源码学习】生命周期篇-初始化阶段(initState)

文章目录 1. 前言2. initState函数分析3. 初始化props3.1 规范化数据3.2 initProps函数分析3.3 validateProp函数分析3.4 getPropDefaultValue函数分析3.5 assertProp函数分析 4. 初始化methods5. 初始化data6. 初始化computed6.1 回顾用法6.2 initComputed函数分析6.3 defineC…

Hadoop的HDFS的集群安装部署

注意&#xff1a;主机名不要有/_等特殊的字符&#xff0c;不然后面会出问题。有问题可以看看第5点&#xff08;问题&#xff09;。 1、下载 1.1、去官网&#xff0c;点下载 下载地址&#xff1a;https://hadoop.apache.org/ 1.2、选择下载的版本 1.2.1、最新版 1.2.2、其…