Unity3d Shader篇(十一)— 遮罩纹理
文章目录
- 前言
- 一、什么是遮罩纹理?
- 1. 遮罩纹理工作原理
- 2. 遮罩纹理优缺点
- 优点:
- 缺点:
- 3. 遮罩纹理图
- 二、使用步骤
- 1. Shader 属性定义
- 2. SubShader 设置
- 3. 渲染 Pass
- 4. 定义结构体和顶点着色器函数
- 5. 片元着色器函数
- 三、效果
- 四、总结
前言
在计算机图形学中,遮罩纹理是一种常用的技术,用于控制物体表面的某些属性或效果。通过使用遮罩纹理,可以实现诸如高光强度、反射率等在物体表面不同区域之间的差异化。在本篇博客中,我们将介绍如何使用Shader实现遮罩纹理效果。
一、什么是遮罩纹理?
1. 遮罩纹理工作原理
遮罩纹理的工作原理基于纹理映射的概念。在渲染过程中,每个像素的颜色都是由纹理采样和一系列计算操作得到的。而遮罩纹理作为额外的输入,会在片段着色器中被采样并应用到计算过程中。通常情况下,遮罩纹理的像素值会被映射到一个范围内,用来表示某种属性的强度或影响程度。通过调整这些范围,可以实现对物体表面不同区域的差异化控制。
2. 遮罩纹理优缺点
优点:
灵活性: 遮罩纹理可以根据需求来灵活控制物体表面的各种属性,从而实现更加细致和个性化的效果。
节省资源: 相比直接在Shader中硬编码属性的值,使用遮罩纹理可以节省内存和处理开销,尤其适用于需要频繁调整属性的情况。
缺点:
额外负担: 遮罩纹理的使用会增加额外的纹理采样和计算操作,可能会增加渲染成本,尤其是在移动设备等资源有限的环境中。
限制性: 遮罩纹理的效果受到纹理图像本身的限制,可能无法满足特定的需求,需要通过多张纹理叠加或其他技术来实现。
3. 遮罩纹理图
主图
法线图
遮罩图
二、使用步骤
1. Shader 属性定义
// 定义属性
Properties {//主纹理贴图_MainTex("Main Texture", 2 D) = "white" {}// 高光遮罩贴图_SpecularMask("Specular Mask", 2 D) = "white" {}// 高光遮罩贴图缩放系数_SpecularMaskScale("Specular Mask Scale", float) = 1// 漫反射颜色属性,默认白色_Diffuse("Diffuse Color", Color) = (1, 1, 1, 1)// 高光颜色属性,默认白色_Specular("Specular Color", Color) = (1, 1, 1, 1)// 高光反射系数_Gloss("Glossiness", Range(1, 256)) = 5
}
2. SubShader 设置
SubShader
{Tags{"RenderType" = "Opaque" // 渲染类型为不透明}LOD 100 // 细节级别
}
SubShader 定义了一组渲染设置,包括标签和细节级别。在这里,我们将渲染类型标签设置为 “Opaque”,表示物体是不透明的。
3. 渲染 Pass
Pass
{CGPROGRAM#pragma vertex vert#pragma fragment frag// 包含Unity CG库#include "UnityCG.cginc"// 包含光照CG库#include "Lighting.cginc"// 漫反射颜色属性fixed4 _Diffuse;// 高光颜色属性fixed4 _Specular;// 高光系数属性float _Gloss;// 主纹理贴图sampler2D _MainTex;float4 _MainTex_ST;// 高光遮罩贴图sampler2D _SpecularMask;float4 _SpecularMask_ST;float _SpecularMaskScale;
}
这里开始了渲染 Pass 部分。在这里,我们使用了 CGPROGRAM 指令来声明顶点着色器和片元着色器函数。#pragma vertex vert 和 #pragma fragment frag 分别指定了顶点着色器函数和片元着色器函数的名称。
然后,我们包含了 UnityCG.cginc 和 Lighting.cginc,它们提供了许多有用的函数和宏,用于简化编写 Shader。
4. 定义结构体和顶点着色器函数
// 定义结构体:从顶点到片段的数据传递
struct v2f
{float4 vertex : SV_POSITION; // 顶点位置float4 uv : TEXCOORD0; // 纹理坐标float2 maskUv : TEXCOORD1; // 高光遮罩纹理坐标
};// 顶点着色器函数
v2f vert(appdata_tan v)
{v2f o;o.vertex = UnityObjectToClipPos(v.vertex); // 顶点位置变换到裁剪空间// 让外面的属性可以影响到uvo.uv = TRANSFORM_TEX(v.texcoord, _MainTex);o.maskUv = TRANSFORM_TEX(v.texcoord, _SpecularMask);return o;
}
顶点着色器函数负责将顶点的位置和纹理坐标传递给片元着色器函数。在这里,我们还将高光遮罩纹理的坐标传递给片元着色器函数。
5. 片元着色器函数
// 片元着色器函数
fixed4 frag(v2f i) : SV_Target
{// 纹理采样fixed3 albedo = tex2D(_MainTex, i.uv.xy).rgb;// 漫反射fixed3 diffuse = _LightColor0.rgb * albedo * _Diffuse.rgb;// 高光遮罩采样float specularMask = tex2D(_SpecularMask, i.maskUv).r * _SpecularMaskScale;// 高光反射fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, specularMask), _Gloss);// 最终颜色fixed3 color = diffuse + specular;return fixed4(color, 1); // 输出颜色
}
片段着色器函数负责计算最终的颜色输出。在这里,我们首先进行了主纹理的采样和漫反射计算,然后根据高光遮罩纹理计算高光反射,最终得到最终的颜色输出。
三、效果
四、总结
遮罩纹理是一种在计算机图形学中常用的技术,用于控制渲染效果的可见性或者强度。它通过在纹理图像中存储额外的信息,如透明度、反射率、金属度等,来影响渲染过程中像素的显示情况。遮罩纹理通常作为额外的贴图,与其他纹理一同用于表面渲染,以达到更加精细的效果。
遮罩纹理的工作原理是在渲染过程中,通过采样遮罩纹理来获取每个像素点的对应信息,然后根据这些信息来调整像素的显示效果。例如,在表面渲染过程中,可以使用遮罩纹理来控制哪些区域应该是透明的,哪些区域应该有不同的反射率或金属度,从而实现更加逼真的渲染效果。
遮罩纹理广泛应用于游戏开发、影视特效制作、虚拟现实等领域。在游戏中,遮罩纹理常用于控制角色的透明度、地形的纹理混合、特效的显示等;在影视特效制作中,遮罩纹理常用于控制特效的显示强度、实现场景的特定效果等;在虚拟现实领域,遮罩纹理可以用于增强虚拟场景的真实感和交互性。
相关文章:

Unity3d Shader篇(十一)— 遮罩纹理
文章目录 前言一、什么是遮罩纹理?1. 遮罩纹理工作原理2. 遮罩纹理优缺点优点:缺点: 3. 遮罩纹理图 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数 三、效果四、总结 前言 在…...

测试开发(6)软件测试教程——自动化测试selenium(自动化测试介绍、如何实施、Selenium介绍 、Selenium相关的API)
接上次博客:测试开发(5)测试分类标准 :按测试对像划分、按是否查看代码划分、按开发阶段划分、按测试实施组织、按是否运行划分、按是否手工划分、按测试地域划分-CSDN博客 目录 什么是自动化测试 自动化测试介绍…...

【flink】Rocksdb TTL状态全量快照持续递增
flink作业中的MapState开启了TTL,并且使用rocksdb作为状态后端配置了全量快照方式(同时启用全量快照清理),希望能维持一个平稳的运行状态,但是经观察后发现效果不达预期,不仅checkpoint size持续缓慢递增&a…...
[C++] 统计程序耗时
一、简介 本文介绍了两种在C代码中统计耗时的方法,第一种使用<time.h>头文件中的clock()函数记录时间戳,统计程序耗时。第二种使用<chrono>头文件中的std::chrono::high_resolution_clock()::now()函数,后者可以方便地统计不同时…...

Redis是单线程还是多线程?
单线程为什么这么快的原因: 后来引入了多线程是因为:...

【MySQL】MySQL数据管理——DDL数据操作语言(数据表)
目录 创建数据表语法列类型字段属性SQL示例创建学生表 查看表和查看表的定义表类型设置表的类型 面试题:MyISAM和InnoDB的区别设置表的字符集删除表语法示例 修改表修改表名语法示例 添加字段语法示例 修改字段语法示例 删除字段语法示例 数据完整性实体完整性域完整…...
Qt使用QSettings类来读写ini
在Qt中,可以使用QSettings类来读写ini文件。QSettings提供了一个简单的接口,用于访问和修改ini文件中的键值对。 下面是使用QSettings类来写入ini文件的示例代码: #include <QCoreApplication> #include <QSettings>int main(i…...
嵌入式软件bug从哪里来,到哪里去
摘要:软件从来不是一次就能完美的,需要以包容的眼光看待它的残缺。那问题究竟为何产生,如何去除呢? 1、软件问题从哪来 软件缺陷问题千千万万,主要是需求、实现、和运行环境三方面。 1.1 需求描述偏差 客户角度的描…...
去掉WordPress网页图片默认链接功能
既然是wordpress自动添加的,那么我们在上传图片到wordpress后台多媒体的时候,就可以手动改变链接指向或者删除掉,问题是每次都要这么做很麻烦,更别说有忘记的时候。一次性解决这个问题有两种方法,一种是No Image Link插…...

UE学习笔记--解决滚轮无法放大蓝图、Panel等
我们发现有时候创建蓝图之后,右上角的缩放是1:1 但是有时候我们可能需要放的更大一点。 发现一直用鼠标滚轮像上滚动,都没有效果。 好像最大只能 1:1. 那是因为 UE 做了限制。如果希望继续放大,我们可以按住 Ctrl 再去…...

GO结构体
1. 结构体 Go语言可以通过自定义的方式形成新的类型,结构体就是这些类型中的一种复合类型,结构体是由零个或多个任意类型的值聚合成的实体,每个值都可以称为结构体的成员。 结构体成员也可以称为“字段”,这些字段有以下特性&am…...

芯科科技为全球首批原生支持Matter-over-Thread的智能锁提供强大助力,推动Matter加速成为主流技术
智能锁领域的先锋企业U-tec和Nuki选择芯科科技解决方案,成为Matter-over-Thread应用的领先者 致力于以安全、智能无线连接技术,建立更互联世界的全球领导厂商Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB)今…...
面试数据库篇(mysql)- 06覆盖索引
原理 覆盖索引是指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到 。 id name gender createdate 2 Arm...

[伴学笔记]01-操作系统概述 [南京大学2024操作系统]
文章目录 前言jyy:01-操作系统概述 [南京大学2024操作系统]为什么要学操作系统?学习操作系统能得到什么? 什么是操作系统?想要明白什么是操作系统:时间线:1940s1950s-1960s1960-1970s年代. 信息来源: 前言 督促自己,同时分享所得,阅读完本篇大约需要10分钟,希望为朋友的技术…...
c++二叉树
二叉树进阶 1.二叉搜索树(binary search tree) 二叉搜索树天然就适合查找,对于满二叉树或者完全二叉树,最多搜索lgn次(就像是有序数组二分查找,每次搜索都会减少范围),极端情况简化成单链表就要走n次,即要走高度次…...

第19章-IPv6基础
1. IPv4的缺陷 2. IPv6的优势 3. 地址格式 3.1 格式 3.2 长度 4. 地址书写压缩 4.1 段内前导0压缩 4.2 全0段压缩 4.3 例子1 4.4 例子 5. 网段划分 5.1 前缀 5.2 接口标识符 5.3 前缀长度 5.4 地址规模分类 6. 地址分类 6.1 单播地址 6.2 组播地址 6.3 任播地址 6.4 例子 …...

浅谈人才招聘APP开发的解决方案
随着企业竞争加剧,高效、精准地招聘人才成为企业持续发展的关键。人才招聘系统能够简化招聘流程,提高效率,确保企业快速找到合适人才。同时,通过智能匹配和数据分析,提升招聘质量,优化候选人体验。因此&…...
大语言模型LLM推理加速:Hugging Face Transformers优化LLM推理技术(LLM系列12)
文章目录 大语言模型LLM推理加速:Hugging Face Transformers优化LLM推理技术(LLM系列12)引言Hugging Face Transformers库的推理优化基础模型级别的推理加速策略高级推理技术探索硬件加速与基础设施适配案例研究与性能提升效果展示结论与未来展望大语言模型LLM推理加速:Hug…...

JVM 第四部分—垃圾回收相关概念 2
System.gc() 在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存 然而System.gc()调用附带一个免责声明,无法保证对垃…...

tritonserver学习之八:redis_caches实践
tritonserver学习之一:triton使用流程 tritonserver学习之二:tritonserver编译 tritonserver学习之三:tritonserver运行流程 tritonserver学习之四:命令行解析 tritonserver学习之五:backend实现机制 tritonserv…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...