Secondary Maps(Detail Maps) & Detail Mask
  增加模型细节,而不需要使用单张的超大贴图。
  应用:增加皮肤细节,比如毛孔;砖墙添加细小的裂缝和青苔;大型金属容器上增加一些小的划痕和擦痕。
 
toolbag.shader: 
//inherits "normalMap.frag"
USE_TEXTURE2D(tDetailNormalMap);
USE_TEXTURE2D(tDetailWeightMap);
uniform float uDetailWeight;
uniform vec4 uDetailTiling; //xy-scale, zw-offset
uniform vec4 uDetailWeightSwizzle;
uniform float uDetailUseSecondaryUV; //0.0 - use primary uv, 1.0 - use secondary
uniform vec3 uDetailNormalMapScale; //typically 2,2,2
uniform vec3 uDetailNormalMapBias; //typically -1,-1,-1
void SurfaceDetailNormalMap( inout FragmentState s )
{
SurfaceNormalMap(s); //look up detail normal
vec2 uv = lerp( s.vertexTexCoord.xy, s.vertexTexCoordSecondary.xy, uDetailUseSecondaryUV );
uv = uv*uDetailTiling.xy + uDetailTiling.zw;
vec3 dn = texture2D( tDetailNormalMap, uv ).xyz;
dn = uDetailNormalMapScale*dn + uDetailNormalMapBias;
//ortho-normalization of new tangent basis
vec3 T = s.vertexTangent;
vec3 B = s.vertexBitangent;
vec3 N = s.normal;
T -= dot(T,N)*N;
T = normalize(T);
B -= dot(B,N)*N + dot(B,T)*T;
B = normalize(B); //blend in the detail normal
dn = dn.x * T +
dn.y * B +
dn.z * N;
float detailWeight = dot( texture2D( tDetailWeightMap, s.vertexTexCoord ), uDetailWeightSwizzle );
detailWeight *= uDetailWeight;
s.normal = normalize( s.normal + dn * detailWeight );
}
#undef Surface
#define Surface SurfaceDetailNormalMap

unity.shader:

#ifdef _NORMALMAP
half3 NormalInTangentSpace(float4 texcoords)
{
half3 normalTangent = UnpackScaleNormal(tex2D (_BumpMap, texcoords.xy), _BumpScale);
#if _DETAIL && defined(UNITY_ENABLE_DETAIL_NORMALMAP)
half mask = DetailMask(texcoords.xy);
half3 detailNormalTangent = UnpackScaleNormal(tex2D (_DetailNormalMap, texcoords.zw), _DetailNormalMapScale);
#if _DETAIL_LERP
normalTangent = lerp(
normalTangent,
detailNormalTangent,
mask);
#else
normalTangent = lerp(
normalTangent,
BlendNormals(normalTangent, detailNormalTangent),
mask);
#endif
#endif
return normalTangent;
}
#endif // 法线在切空间叠加
half3 BlendNormals(half3 n1, half3 n2)
{
return normalize(half3(n1.xy + n2.xy, n1.z*n2.z));
}

Skyshop.Detail Maps的更多相关文章

  1. Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译

    本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

  2. Ogre2.1 灯光与阴影

    Ogre2.1大量光源渲染 Ogre2.1不是采用现在大部分引擎所用的延迟渲染,而是采用一种前向渲染的改进技术,理论基本来自于Forward+,见如下. http://www.klayge.org/? ...

  3. Unity3D Optimizing Graphics Performance for iOS

    原地址:http://blog.sina.com.cn/s/blog_72b936d801013ptr.html icense Comparisons http://unity3d.com/unity ...

  4. Unity优化方向——优化Unity游戏中的图形渲染(译)

    CPU bound:CPU性能边界,是指CPU计算时一直处于占用率很高的情况. GPU bound:GPU性能边界,同样的是指GPU计算时一直处于占用率很高的情况. 原文:https://unity3 ...

  5. 二维纹理 Texture 2D

    Textures bring your Meshes, Particles, and interfaces to life! They are image or movie files that yo ...

  6. Unity 2018 Cookbook (Matt Smith 著)

    1. Displaying Data with Core UI Elements (已看) 2. Responding to User Events for Interactive UIs (已看) ...

  7. Unity shader 护盾shield的简单实现

    先上效果图 shader所用的贴图资源 扰动 直接对uv进行变换就可以了,记得首先把六边形格子地图的Tilling调高点 先预先调成合适大小的六边形,然后repeat铺满整个护盾 // Tiles a ...

  8. GIS理论(墨卡托投影、地理坐标系、地面分辨率、地图比例尺、Bing Maps Tile System)

    [注]原文 http://www.cnblogs.com/beniao/archive/2010/04/18/1714544.html 墨卡托投影(Mercator Projection),又名&qu ...

  9. 墨卡托投影、地理坐标系、地面分辨率、地图比例尺、Bing Maps Tile System

    GIS理论(墨卡托投影.地理坐标系.地面分辨率.地图比例尺.Bing Maps Tile System) 墨卡托投影(Mercator Projection),又名"等角正轴圆柱投影&quo ...

随机推荐

  1. 使用ghpage(github服务)搭建文档网站几种方式

    可以通过github提供的ghpage服务来搭建网站,有以下三种方式来实现: 1.文档放在master分支,作为一个子目录. 仓库:https://github.com/Ourpalm/ILRunti ...

  2. vue+node+elementUI实现注册功能

    后端代码 在后端的文件 routes文件夹下的connect.js文件中 // 引入mysql const mysql = require('mysql'); // 创建连接对象 const conn ...

  3. SpringBoot 全局异常配置

    在日常web开发中发生了异常,往往是需要通过一个统一的异常处理来保证客户端能够收到友好的提示. 一.默认异常机制 默认异常处理(SpringBoot 默认提供了两种机制,一种是针对于web浏览器访问的 ...

  4. MySql 创建用户报错

    1.报错信息: ERROR 1558 (HY000): Column count of mysql.user is wrong. Expected 43, found 42. Created with ...

  5. Vue 变异方法splice删除评论功能

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 【2019.7.24 NOIP模拟赛 T1】道路建设(road)(水题)

    原题与此题 原题是一道神仙不可做题,两者区别在于,原题不能有重边和自环. 然而,这题可以有重边... 于是这题就变成了一道大水题. 此题的解法 考虑如何构造. 对于\(n\le10^4\)的情况: 对 ...

  7. oracle聚合函数XMLAGG用法简介

    XMLAGG函数语法基本如图,可以用于列转行,列转行函数在oracle里有好几种方法,wm_concat也可以做 这里介绍wm_concat是因为XMLAGG实现效果和wm_concat是一样的,只是 ...

  8. Salesforce学习之路(八)一次拉取多个文件或全部文件至本地

    在开发中,经常会遇到本地工程错乱或者误操作导致本地本地项目被删除,此时利用SFDX: Retrieve Source from Org只会拉取新建并且名称相同的组件,若通过创建一个个文件,然后再拉取的 ...

  9. golang编译器:gccgo vs gc

    GCC是一个功能强大的编译器,不仅可以编译我们很熟悉的C/C++,也可以做为Fortran.Pascal.Objective-C等语言的编译器.而GCCGO则是GCC专门用来编译Golang语言的.G ...

  10. WPF Xaml中创建集合

    首先在xaml中创建集合是一个不可取的方法. 本方法仅作为xaml的学习. 本文略微无聊,主要是编写的东西都是老玩意. 首先是定义一个类,作为你要加载集合的模型. 结构如下 internal clas ...