普通网站 多大空间,网站建设费 大创,域名备案时网站名字,一般公司常用的邮箱文章目录 前言一、什么是遮罩纹理#xff1f;1. 遮罩纹理工作原理2. 遮罩纹理优缺点优点#xff1a;缺点#xff1a; 3. 遮罩纹理图 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数 三、效果四、总结 前言
在… 文章目录 前言一、什么是遮罩纹理1. 遮罩纹理工作原理2. 遮罩纹理优缺点优点缺点 3. 遮罩纹理图 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数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); // 输出颜色
}
片段着色器函数负责计算最终的颜色输出。在这里我们首先进行了主纹理的采样和漫反射计算然后根据高光遮罩纹理计算高光反射最终得到最终的颜色输出。
三、效果 四、总结
遮罩纹理是一种在计算机图形学中常用的技术用于控制渲染效果的可见性或者强度。它通过在纹理图像中存储额外的信息如透明度、反射率、金属度等来影响渲染过程中像素的显示情况。遮罩纹理通常作为额外的贴图与其他纹理一同用于表面渲染以达到更加精细的效果。
遮罩纹理的工作原理是在渲染过程中通过采样遮罩纹理来获取每个像素点的对应信息然后根据这些信息来调整像素的显示效果。例如在表面渲染过程中可以使用遮罩纹理来控制哪些区域应该是透明的哪些区域应该有不同的反射率或金属度从而实现更加逼真的渲染效果。
遮罩纹理广泛应用于游戏开发、影视特效制作、虚拟现实等领域。在游戏中遮罩纹理常用于控制角色的透明度、地形的纹理混合、特效的显示等在影视特效制作中遮罩纹理常用于控制特效的显示强度、实现场景的特定效果等在虚拟现实领域遮罩纹理可以用于增强虚拟场景的真实感和交互性。