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…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
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…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
