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>
相关文章:

Unity(三) Shader着色器初探
学习3D开发技术的时候无可避免的要接触到Shader,那么Shader是个什么概念呢?其实对于开发同事来说还是比较难理解的,一般来说Shader是服务于图形渲染的一类技术,开发人员可以通过其shader语言来自定义显卡渲染页面的算法࿰…...

苹果电脑要安装杀毒软件吗?mac用什么杀毒软件好?
对于这个问题让人很是纠结,Mac不需要杀毒这个理论一直都深入人心,Mac OS X权限管理特性可以防毒的说法也一直甚嚣尘上,很多小伙伴如我一样搞不清楚到底要不要安装杀毒软件。,毕竟当前个人信息安全泄露泛滥不穷的年代,我…...

MySQL——索引
索引在 MySQL 数据库中分三类: B 树索引Hash 索引全文索引 目的:在查询的时候提升效率 b树 参考:https://blog.csdn.net/qq_40649503/article/details/115799935 数据库索引,是数据库管理系统中一个排序的数据结构…...
110. 平衡二叉树
题目链接: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 递归法: 我的代码: *** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* Tree…...

遗忘因子递推最小二乘参数估计(FFRLS)
基于遗忘因子的最小二乘法电池参数辨识 最小二乘法是系统辨识中最常用的一种估算方法。为了克服最小二乘法存在”数据饱和”的问题,我们通常采用含有遗忘因子的递推最小二乘法(Forgetting Factor Recursive Least Square,FFRLS)算法进行电池模型的参数辨识。 1、二…...

【redis进阶】基础知识简要回顾
1. 常见功能介绍 聚合统计 使用list集合的差集、并集来统计 排序统计 SortedSet(ZSet)统计,再利用分页列出权重高的元素 二值状态统计 BitMap存储,获取并统计 SETBIT uid:sign:3000:202008 2 1 GETBIT uid:sign:3000:202008 2…...

HTML5-3-表格
文章目录 属性边框属性标题跨行和跨列单元格边距 HTML 表格由 <table> 标签来定义。 tr:tr 是 table row 的缩写,表示表格的一行。td:td 是 table data 的缩写,表示表格的数据单元格。th:th 是 table header的缩…...
Spring Boot + Vue的前后端项目结构及联调查询
Spring Boot Vue的前后端项目结构及联调查询 当你刚开始学习前后端开发时,可能会感到有些困惑和不知所措。下面是一些建议,希望能为你的学习之旅提供一些启示: 建立坚实的基础知识:学习前后端开发的第一步是建立坚实的基础知识。…...
Transformer貌似也是可以使用state递归解码和训练的
import paddle import numpy as npclass HeadLoss(paddle.nn.Layer):def __init__(self):super(HeadLoss, self).__init__()...

振弦采集仪应用地铁隧道安全监测详细解决方案
振弦采集仪应用地铁隧道安全监测详细解决方案 随着城市化进程的不断加快,地铁作为一种高效、便捷、环保的交通方式已经成为现代城市不可或缺的一部分。因此,对地铁的安全性也越来越重视,一般二三线以上的城市在不断发展中,地铁做…...

2023 IntelliJ IDEA下载、安装教程, 附详细图解
文章目录 下载与安装IDEA推荐阅读 下载与安装IDEA 首先先到官网下载最新版的IntelliJ IDEA, 下载后傻瓜式安装就好了 官网下载地址:https://www.jetbrains.com/ 1、下载完后在本地找到该文件,双击运行 idea 安装程序 2、点击 Next 3、选择安装路径&…...

波卡生态重要动态一览:w3ndi 推出,首尔、新加坡、里斯本活动接踵而至
Web3 市场冷却,但新的社区合作与推进仍在发生,技术和产品依然不断迭代。OneBlock 为你介绍波卡生态近期值得你关注的动态,以及接下来重要的行业活动。 波卡生态重要进展 1、最新 Referendum#110,提议对验证器配置进行多项修改&a…...

成都瀚网科技有限公司:抖音商家怎么免费入驻?
随着抖音成为全球最受欢迎的短视频平台之一,越来越多的商家开始关注抖音上的商机。抖音商家的进驻可以帮助商家扩大品牌影响力和销售渠道。那么,如何免费进入抖音成为商家呢?下面就为大家介绍一下具体步骤。 1、抖音商家如何免费注册…...

vue Router从入门到精通
文章目录 介绍使用多级路由实例 路由的query参数传递参数接收参数实例 命名路由作用使用 params参数声明接收params参数传参接收参数实例 props配置实例 router-link的replace属性编程式路由导航作用使用实例 缓存路由组件两个新的生命周期钩子实例 路由守卫作用分类全局守卫独…...

【100天精通Python】Day56:Python 数据分析_Pandas数据清洗和处理(删除填充插值,数据类型转换,去重,连接与合并)
目录 数据清洗和处理 1.处理缺失值 1.1 删除缺失值: 1.2 填充缺失值: 1.3 插值: 2 数据类型转换 2.1 数据类型转换 2.2 日期和时间的转换: 2.3 分类数据的转换: 2.4 自定义数据类型的转换: 3 数…...

phpstudy本地快速搭建网站,并外网访问【无公网IP】
文章目录 使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点,测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中,查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2.2 映…...

WebSocket的那些事(5-Spring STOMP支持之连接外部消息代理)
目录 一、序言二、开启RabbitMQ外部消息代理三、代码示例1、Maven依赖项2、相关实体3、自定义用户认证拦截器4、Websocket外部消息代理配置5、ChatController6、前端页面chat.html 四、测试示例1、群聊、私聊、后台定时推送测试2、登录RabbitMQ控制台查看队列信息 五、结语 一、…...

【数据结构】单链表详解
当我们学完顺序表的时候,我们发现了好多问题如下: 中间/头部的插入删除,时间复杂度为O(N)增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当…...
dql的执行顺序
在 SQL 查询语言中,DQL(Data Query Language)是用于从数据库中检索数据的部分。SQL 查询的执行顺序通常按照以下步骤进行: FROM 子句:查询首先确定要从哪些表中检索数据。在 FROM 子句中列出的表格被称为源表ÿ…...

java的动态代理如何实现
一. JdkProxy jdkproxy动态代理必须基于接口(interface)实现 接口UserInterface.java public interface UserService {String getUserName(String userCde); }原始实现类:UseServiceImpl.java public class UserServiceImpl implements UserSerice {Overridepub…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...