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. 深入理解JavaScript中的作用域和上下文

    介绍 JavaScript中有一个被称为作用域(Scope)的特性.虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,我会尽我所能用最简单的方式来解释作用域.理解作用域将使你的代码脱颖而出,减 ...

  2. RFM模型的应用 - 电商客户细分(转)

    RFM模型是网点衡量当前用户价值和客户潜在价值的重要工具和手段.RFM是Rencency(最近一次消费),Frequency(消费频率).Monetary(消费金额) 消费指的是客户在店铺消费最近一次 ...

  3. LeetCode 676. Implement Magic Dictionary实现一个魔法字典 (C++/Java)

    题目: Implement a magic directory with buildDict, and search methods. For the method buildDict, you'll ...

  4. Vue indent eslint缩进webstorm冲突解决

    参考教程 官方回复 ESlint设置 rules: { 'no-multiple-empty-lines': [1, {max: 3}], // 控制允许的最多的空行数量 'vue/script-in ...

  5. appium--使用PyYAML封装Capability

    前戏 YAML 语言的设计目标,就是方便人类读写.它实质上是一种通用的数据串行化格式. 它的基本语法规则如下. YAML大小写敏感: 使用缩进代表层级关系: 缩进只能使用空格,不能使用TAB,不要求空 ...

  6. CF-weekly4 F. Kyoya and Colored Balls

    https://codeforces.com/gym/253910/problem/F F. Kyoya and Colored Balls time limit per test 2 seconds ...

  7. 常用的ROS命令

    在这里记一下,以免以后忘记了. ------------------------------------------------------------------------------------ ...

  8. yum安装软件报错Error: Nothing to do

    今天在一台新服务器上装一些常用软件,一开始安装ncdu(一个很好用的磁盘分析工具,用来查找大文件),报错如下: 在网上找了各种办法,什么更新yum啊,清理yum缓存啊的,统统没用 最后的找到的问题是, ...

  9. 【linux】查看GPU使用率

    nvidia-smi -l 1   每秒刷新一次

  10. 快速了解Electron:新一代基于Web的跨平台桌面技术

    本文引用了作者“ ConardLi”的<用JS开发跨平台桌面应用,从原理到实践>一文部分内容,原文链接:segmentfault.com/a/1190000019426512,感谢原作者的 ...