Unity shader学习之遮罩纹理
什么是遮罩?
遮罩允许我们可以保护某些区域,使它们奂于某些修改。
例如下面的例子,使用遮罩来控制高光反射。
转载请注明出处:http://www.cnblogs.com/jietian331/p/7149182.html
使用的贴图,法线,遮罩纹理如下:
shader如下:
- // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
- Shader "Custom/Mask Texture"
- {
- Properties
- {
- _MainTexture("Main Texture", 2D) = "white" {}
- _NormalMap("Normal Map", 2D) = "bump" {}
- _MaskTexture("Mask Texture", 2D) = "white" {}
- _Specular("Specular", Color) = (, , , )
- _Gloss("Gloss", Range(, )) =
- }
- SubShader
- {
- Pass
- {
- Tags
- {
- "LightMode" = "ForwardBase"
- }
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #include "UnityCG.cginc"
- #include "Lighting.cginc"
- struct appdata
- {
- float4 vertex : POSITION;
- float4 uv : TEXCOORD0;
- float3 normal : NORMAL;
- float4 tangent : TANGENT;
- float4 color : COLOR;
- };
- struct v2f
- {
- float4 pos : SV_POSITION;
- float4 color : COLOR;
- float4 uv : TEXCOORD0;
- float3 tangentLight : TEXCOORD1;
- float3 tangentView : TEXCOORD2;
- };
- v2f vert(appdata v)
- {
- v2f o;
- o.pos = UnityObjectToClipPos(v.vertex);
- o.uv = v.uv;
- o.color = v.color;
- float3 objLightDir = ObjSpaceLightDir(v.vertex);
- float3 objViewDir = ObjSpaceViewDir(v.vertex);
- TANGENT_SPACE_ROTATION;
- o.tangentLight = mul(rotation, objLightDir);
- o.tangentView = mul(rotation, objViewDir);
- return o;
- }
- sampler2D _MainTexture;
- sampler2D _NormalMap;
- sampler2D _MaskTexture;
- float4 _Specular;
- float _Gloss;
- fixed4 frag(v2f i) : SV_TARGET
- {
- fixed3 tangentNormal = UnpackNormal(tex2D(_NormalMap, i.uv));
- fixed3 albedo = tex2D(_MainTexture, i.uv).rgb * i.color;
- fixed3 ambient = albedo * UNITY_LIGHTMODEL_AMBIENT.rgb;
- fixed3 diff = albedo * _LightColor0.rgb * max(, dot(tangentNormal, i.tangentLight));
- fixed4 mask = tex2D(_MaskTexture, i.uv);
- fixed3 halfDir = normalize(i.tangentView + i.tangentLight);
- fixed3 spec = _Specular.rgb * _LightColor0.rgb * pow(max(, dot(halfDir, tangentNormal)), _Gloss) * mask.r;
- fixed3 col = ambient + diff + spec;
- return fixed4(col, );
- }
- ENDCG
- }
- }
- Fallback "Specular"
- }
使用和不使用遮罩的效果对比图如下:
使用遮罩:
不使用遮罩:
资源如下:
http://files.cnblogs.com/files/jietian331/MaskTexture.rar
Unity shader学习之遮罩纹理的更多相关文章
- Unity shader学习之渐变纹理
渐变纹理,及使用纹理来存储漫反射光照的结果,这种技术在游戏<军团要塞2>中流行起来,它也是由Valve公司(提出半兰伯特光照技术的公司)提出来的,他们使用这种技术来渲染游戏中具有插画风格的 ...
- Unity Shader 学习之旅
Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...
- Unity Shader 学习之旅之SurfaceShader
Unity Shader 学习之旅之SurfaceShader unity shader 图形图像 如果大地的每个角落都充满了光明 谁还需要星星,谁还会 在夜里凝望 寻找遥远的安慰——江河 官方文档 ...
- 【Unity Shader学习笔记】Unity基础纹理-单张纹理
1 单张纹理 1.1 纹理 使用纹理映射(Texture Mapping)技术,我们把一张图片逐纹素(Texel)地控制模型的颜色. 美术人员建模时,会在建模软件中利用纹理展开技术把纹理映射坐标(Te ...
- 【Unity Shader学习笔记】Unity基础纹理-渐变纹理
纹理可以用来存储任何表面属性. 可以通过使用渐变纹理来实现插画风格的渲染效果. 这项技术是由Valve公司提出的.Valve使用它来渲染游戏中具有插画风格的角色. 我们使用半兰伯特模型计算漫反射. 因 ...
- 【Unity Shader学习笔记】Unity基础纹理-法线贴图
1 高度纹理 使用一张纹理改变物体表面法线,为模型提供更多细节. 有两种主要方法: 1.高度映射:使用一张高度纹理(height map)来模拟表面位移(displacement).得到一个修改后的法 ...
- 第四章 开始Unity Shader学习之旅(2)
目录 1. 强大的援手:Unity提供的内置文件和变量 1.1 内置的包含文件 1.2 内置的变量 2. Unity提供的Cg/HLSL语义 2.1 什么是语义 2.2 Unity支持的语义 2.3 ...
- 第四章 开始Unity Shader学习之旅(1)
1. 一个最简单的顶点/片元着色器 现在,我们正式开始学习如何编写Unity Shader,更准确的说是,学习如何编写顶点/片元着色器 2.顶点/片元着色器的基本结构 我们在以前已经讲过了Unity ...
- Unity Shader学习笔记-1
本篇文章是对Unity Shader入门精要的学习笔记,插图大部分来自冯乐乐女神的github 如果有什么说的不正确的请批评指正 目录 渲染流水线 流程图 Shader作用 屏幕映射 三角形遍历 两大 ...
随机推荐
- radio样式的写法,单选和多选如何快速的改变默认样式,纯CSS,
一.纯CSS写法改变单选框的默认选择样式,用背景图片代替 input[type='radio']:radio:before { content: '';//这里需要有 width: 20px; hei ...
- [nginx] load balancing & location
一 将NGINX配置成7层load balancer,该怎么做? 参见: http://nginx.org/en/docs/http/load_balancing.html https://docs. ...
- 《linux 文件目录》- touch/rm/mv/cat/head/tail/cp/mkdir/chmod/chown/find/locate/which/whereis
一:基本 / 根目录下目录结构定义 /bin 常见的用户指令 ls/echo ...... 等 /boot 内核和启动文件 /dev 设备文件 /etc 系统和服务配置文件 /home 用户家目录 / ...
- Matlab 快捷键 命令
1. 在命令窗口(Command Window)中: 1) [上.下键]――切换到之前.之后的命令,可以重复按多次来达到你想要的命令 2) clc――清除命令窗口显示的语句,此命令并不清空当前工作区的 ...
- 使用Apache CXF根据wsdl文件生成代码
1.去官网下载,我用的是apache-cxf-2.5.10.zip 2.解压 3.通过命令行进入Apache CXF的bin目录,如我的目录是D:\BIS\axis2\apache-cxf-2.7.1 ...
- swift 相机、相册、定位的权限判断
//是否开启相机权限 func IsOpenCamera() -> Bool{ let authStatus = AVCaptureDevice.authorizationStatus(for: ...
- Log4j Append属性指定是否追加内容
Log4j默认是不断的把日志内容追加到日志文件: 这里就有个属性 Append 默认就是true: 假如我们设置成false 就不追加了 直接覆盖前面的内容: 我们来测试下: log4j.rootLo ...
- python-面向对象-13_文件
文件 目标 文件的概念 文件的基本操作 文件/文件夹的常用操作 文本文件的编码方式 01. 文件的概念 1.1 文件的概念和作用 计算机的 文件,就是存储在某种 长期储存设备 上的一段 数据 长期存储 ...
- laravel用crud之index列出产品items
前面我们说了laravel用crud修改产品items-新建resource controller和routing,现在我们要把产品items罗列出来,需要修改路由和模板,一起随ytakh来看看把 1 ...
- host文件
# Copyright (c) 1993-2009 Microsoft Corp. # # This is a sample HOSTS file used by Microsoft TCP/IP f ...