写在前面

由于我还是处于刚刚入门(其实还是小菜鸡...)的阶段,关于渐变纹理目前主要是学习一下如何通过渐变纹理控制漫反射光照。

这种用渐变纹理控制颜色效果的想法,是Valve公司(提出半兰伯特光照技术的公司)他们提出来的,主要想要用来渲染游戏中具有卡通、插画风格的效果。

原理部分真得不想说太多了,其实本来想借着ramp纹理的功夫深扒一扒从Team Fortress 2开始到现在的应用过程,顺藤摸瓜偶遇了Toon Shader,突然醒悟——Ramp纹理原来只是卡通渲染这块大蛋糕上的小小一隅,立刻放弃要深究的念头,打算打牢基础再说!

关于遮罩纹理:遮罩纹理(mask texture)能做的事情有很多,这次仅作纯粹的记录用它来控制高光的使用效果。

存一些发现的比较有意思的帖子,后续再回来看:

Blender Toon Shader教程跟做(通用Shader) - 知乎 (zhihu.com)

Unity Toon Shader 卡通着色器(一):卡通着色_Sorumi的博客-CSDN博客

[译] 实现Unity 后处理特效 (3) _渐变 Ramp - 知乎 (zhihu.com)


1 渐变纹理

1.1 Shader代码展示

Shader "Unity Shaders Book/Chapter 7/Ramp Texture"
{Properties{_Color ("Color", Color) = (1, 1, 1, 1)_Specular ("Specular", Color) = (1, 1, 1, 1)_Gloss ("Gloss", Range(8.0, 256)) = 20_RampTex ("RampTex", 2D) = "white" {}}SubShader{Tags { "LightMode" = "ForwardBase" }Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"sampler2D _RampTex;float4 _RampTex_ST;fixed3 _Color;fixed3 _Specular;float _Gloss;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;float2 texcoord : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD1;float3 worldPos : TEXCOORD2;};v2f vert (a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.texcoord, _RampTex);  //重点1!o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;return o;}fixed4 frag (v2f i) : SV_Target{fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldlightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));fixed3 halfDir = normalize(worldlightDir + viewDir);fixed3 specular = _LightColor0.rgb * _Specular * pow(saturate(dot(halfDir, worldNormal)), _Gloss);fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;//计算半兰伯特的值fixed halfLambert = dot(worldNormal, worldlightDir) * 0.5 + 0.5;//用半兰伯特去采样这个一级纹理,y方向上不会改变fixed3 diffuseColor = tex2D(_RampTex, float2(halfLambert, halfLambert)).rgb * _Color;fixed3 diffuse = _LightColor0.rgb * diffuseColor * diffuseColor;return fixed4(diffuse + specular + ambient, 1.0); }ENDCG}}FallBack  "Specular"
}

1.2 效果展示

渐变纹理分别为:

Game视图中的渲染效果:

2 遮罩纹理

2.1 Shader代码展示

Shader "Unity Shaders Book/Chapter 7/Mask Texture2"
{Properties{_Color ("Color", Color) = (1, 1, 1, 1)_Specular ("Specular", Color) = (1, 1, 1, 1)_Gloss ("Gloss", Range(8.0, 256)) = 20_MainTex ("MainTex", 2D) = "white" {}_SpecularMask ("SpecularMask", 2D) = "white" {}_SpecularScale ("SpecualrScale", float) = 1_NormalTex ("NormalTex", 2D) = "bump" {}_NormalScale ("NormalScale", Range(-1.0, 1.0)) = 1}SubShader{Tags { "LightMode" = "ForwardBase" }Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"fixed4 _Color;fixed4 _Specular;float _Gloss;sampler2D _MainTex;sampler2D _SpecularMask;float _SpecularScale;sampler2D _NormalTex;float _NormalScale;float4 _MainTex_ST;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;float2 texcoord : TEXCOORD0;float4 tangent : TANGENT;};struct v2f{float2 uv : TEXCOORD0;float4 pos : SV_POSITION;float3 lightDir : TEXCOORD1;float3 viewDir : TEXCOORD2;};v2f vert (a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);TANGENT_SPACE_ROTATION;  //获得rotationo.viewDir = mul(rotation, ObjSpaceViewDir(v.vertex)).xyz;o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex)).xyz;return o;}fixed4 frag (v2f i) : SV_Target{fixed3 lightDir = normalize(i.lightDir);fixed3 viewDir = normalize(i.viewDir);fixed3 halfDir = normalize(lightDir + viewDir);fixed3 tangentNormal = UnpackNormal(tex2D(_NormalTex, i.uv));tangentNormal.xy *= _NormalScale;tangentNormal.z = sqrt(1 - saturate(dot(tangentNormal.xy, tangentNormal.xy)));fixed3 albedo = tex2D(_MainTex, i.uv).rgb * _Color.rgb;fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * albedo;fixed halfLambert = dot(tangentNormal, lightDir) * 0.5 + 0.5;fixed3 diffuse = _LightColor0.rgb * albedo * halfLambert;fixed specularMask = tex2D(_SpecularMask, i.uv).r * _SpecularScale;fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(halfDir, tangentNormal)), _Gloss) * specularMask * albedo;fixed3 specular2 = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(halfDir, tangentNormal)), _Gloss);return fixed4(diffuse + specular + ambient, 1.0); }ENDCG}}FallBack  "Specular"
}

2.2 材质面板

需要加入漫反射纹理、法线纹理以及用到的高光遮罩纹理。

2.3 效果展示

(仅用了半兰伯特)中间(漫反射+高光无遮罩)右边(漫反射+高光有遮罩)

从效果看明显右边更接近实际~中间的高光太水亮、太假,左边直接无高光好像少了点什么。

【Unity Shader】纹理实践4.0:简单尝试渐变纹理和遮罩纹理相关推荐

  1. Unity Shader - Noise 噪点图 - 实现简单山脉

    学习记录一下噪点应用 噪点相关知识,可以看文章最下面的:References 后面有基于这篇文章重构过:Unity Shader - 简单山脉 - 顶点着色器重构法线 运行效果 噪点图 可以写了个C# ...

  2. Unity Shader - 顶点动画 - Sin 模拟简单的波浪

    创建一个shader,贴下下面code 创建一个material,设置Shader:Custom/Wave 纹理百度随便下载一个水贴图,设置到meterial中的Tex,(不设置也可以,默认white ...

  3. 【Unity Shader】Unity中利用GrabPass实现玻璃效果

    <入门精要>中模拟玻璃是用了Unity里的一个特殊的Pass来实现的,这个Pass就是GrabPass,比起上一篇博客实现镜子的方法,这个方法我认为相对复杂,因此在实现之前需要对GrabP ...

  4. Unity Shader入门精要第七章 基础纹理之遮罩纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.实践 参考 前言 遮罩纹理(mask texture)是本章要介绍的最后一种纹理,它非常有用,在很多商业游戏中 都可以见到它的身影. ...

  5. Unity Shader - 实现简单水体 - 浅水到深水颜色控制

    文章目录 制作步骤 准备好水体网格 扰动水体网格 添加水体网格色调,纹理 放置海上放哨点(一些随便放的立方体) 添加水的深浅透视效果 添加水光效 重构水顶点法线 正交的相机的深度需要注意 改进 Pro ...

  6. Unity Shader入门精要学习笔记 - 第7章 基础纹理

    转自 冯乐乐的 <Unity Shader 入门精要> 纹理最初的目的就是使用一张图片来控制模型的外观.使用纹理映射技术,我们可以把一张图"黏"在模型表面,逐纹素地控制 ...

  7. Unity Shader总结(十)——Cubemap、镜子、玻璃、程序纹理

    文章目录 天空盒 创建立方体纹理 环境映射 反射 折射 菲涅尔反射 渲染纹理(RenderTexture) 镜子效果 玻璃效果 渲染纹理和GrabPass的不同 程序纹理 程序材质 Cubemap是环 ...

  8. 【我的书】Unity Shader的书 — 目录(2016.5.19最后一次更新)

    写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shad ...

  9. 【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)

    写在前面 感谢全部点进来看的朋友.没错.我眼下打算写一本关于Unity Shader的书. 出书的目的有以下几个: 总结我接触Unity Shader以来的历程,给其它人一个借鉴.我非常明确学Shad ...

最新文章

  1. java中怪物移动_java中两大怪物,附带面试题!
  2. 设置树莓派SSH连接因超时闲置断开(转)
  3. Mac下安装mysql5.7 完整步骤(图文详解)
  4. RGB565与RGB555位图文件格式的标志识别
  5. 计算机网络安装建设厂家,互联网工厂设备与安装总结报告(26页)-原创力文档...
  6. flask mysql项目模板渲染_Flask系列(二) 模板 templates
  7. vue2 自定义事件 v-model .sync
  8. C++---之Arraylist
  9. 【Python】改变对象的字符串显示
  10. Windows平台release版本内存泄漏检查办法
  11. 金蝶应收应付模块流程_金蝶K3操作流程图详解(65页).doc
  12. 服务器系统安装蓝牙驱动,win10蓝牙驱动怎么安装?-win10蓝牙驱动的安装教程 - 河东软件园...
  13. 21年寒假第二周周练 蒜厂年会(一)最大连续子序列和
  14. 利用微搭低代码操作微信缓存
  15. HTTPSConnectionPool(host=‘finance.yahoo.com‘, port=443解决方案
  16. Unity 游戏区域性崩溃,深藏的国际化巨坑
  17. HDMI协议介绍(一)--Overview
  18. 7.4 Java(农夫果园【5】:一个农场,专门种植销售各类水果,在这个系统中需要描述下列水果葡萄、草莓、苹果)
  19. VS2003,VS2005,VS2008 低版本打开高版本的解决方案
  20. 我的BB开发环境(黑莓软件)

热门文章

  1. It从业人员的“职业道德”问题
  2. 学习心得------Django通过配置使用mysql数据库
  3. Unity官方手册之ParticleSystem_Collision模块
  4. 如何禁用或启用 Windows XP 系统还原
  5. npm和cnpm(windows)安装步骤
  6. 化学相关计算机知识点,计算机在中学化学教学中的应用
  7. 如何基于Flink+TensorFlow打造实时智能异常检测平台?只看这一篇就够了
  8. 为 RIDE 创建快捷方式(Python3.7)版本
  9. 解决 RIDE 执行输出日志中文乱码(RIDE 1.7.4.2)
  10. appium python api_Appium常用的API函数