diff --git a/Assets/Shaders/Chapter7/Chapter7-NormalMapTangentSpace.shader b/Assets/Shaders/Chapter7/Chapter7-NormalMapTangentSpace.shader index 7fefebde..c8bb1701 100644 --- a/Assets/Shaders/Chapter7/Chapter7-NormalMapTangentSpace.shader +++ b/Assets/Shaders/Chapter7/Chapter7-NormalMapTangentSpace.shader @@ -89,12 +89,17 @@ Shader "Unity Shaders Book/Chapter 7/Normal Map In Tangent Space" { fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz); fixed3 worldBinormal = cross(worldNormal, worldTangent) * v.tangent.w; + /* float4x4 tangentToWorld = float4x4(worldTangent.x, worldBinormal.x, worldNormal.x, 0.0, worldTangent.y, worldBinormal.y, worldNormal.y, 0.0, worldTangent.z, worldBinormal.z, worldNormal.z, 0.0, 0.0, 0.0, 0.0, 1.0); // The matrix that transforms from world space to tangent space is inverse of tangentToWorld float3x3 worldToTangent = inverse(tangentToWorld); + */ + + //wToT = the inverse of tToW = the transpose of tToW as long as tToW is an orthogonal matrix. + float3x3 worldToTangent = float3x3(worldTangent, worldBinormal, worldNormal); // Transform the light and view dir from world space to tangent space o.lightDir = mul(worldToTangent, WorldSpaceLightDir(v.vertex)); diff --git a/README.md b/README.md index d5401344..6f3262e5 100755 --- a/README.md +++ b/README.md @@ -12,6 +12,10 @@ 我们提供了包含书中所有插图的彩色版插图集锦:HTMLPDF。 +# 2019年新增:改版后的第十八章 + +当年乐观地以为自己有时间写第二版,是我太年轻了…… 第一版由于我能力有限的确有很多问题,感谢大家一直以来的支持。当年在我有时间的时候曾经花了一些时间重写了第18章,本来是想要放到第二版里的,但是目前第二版遥遥无期,索性直接把改版后的第18章直接放出来,希望能让读者有新的收获:改版后的第18章。 + # 第四章勘误 由于数学章是全书的重要基础,我们决定把第四章公开,来及时让读者获取最新的第四章数学章的内容:PDF。 @@ -36,9 +40,56 @@ * 和Unity 4.x版本相比,Unity 5.x最大的变化之一就是很多以前只有在专业版才支持的功能,在免费版也同样提供了。因此,如果读者使用的是Unity 4.x免费版,可能会发现本书中的某些材质会出错。 -## 升级Unity 5.4 +## Unity 5.3及其以下Unity 5.x版本 + +**分支链接**:[master](https://github.com/candycat1992/Unity_Shaders_Book/tree/master) + +在本书编写时,我们使用的版本是Unity 5.3,因此使用这些Unity版本的读者请使用本项目[master](https://github.com/candycat1992/Unity_Shaders_Book/tree/master)分支的相关代码。 + +## Unity 5.4及其以上Unity 5.x版本 + +**分支链接**:[unity_5_4](https://github.com/candycat1992/Unity_Shaders_Book/tree/unity_5_4) + +Unity 5.4对Shader部分进行了一些比较大的更新,比较明显的变化有: + +* 使用了unity_XXX来代替原有的XXX变换矩阵,例如_Object2World被替换成了unity_ObjectToWorld,_World2Object被替换成了unity_WorldToObject(均在UnityShaderVariables.cginc文件中被声明),_LightMatrix0被替换成了unity_WorldToLight(在AutoLight.cginc文件中被声明)。 + +* 使用了一些内置函数来代替某些运算,例如mul(UNITY_MATRIX_MVP,*)相关计算被替换成了UnityObjectToClipPos(*)。 + +在学习本书时,读者需要注意代码中一些由于更新造成的变化。 + +### 升级Unity 5.5 + +从Unity 5.5开始,Unity在某些平台(如DX11、DX12、PS4、Xbox One、Metal)等平台对深度缓存进行了反转操作,使得在近平面处的深度值为1,而远平面处为0。这样做的原因主要是为了更加充分得利用浮点深度缓存,具体原因可以参见NVIDIA的相关博客[Depth Precision Visualized](https://developer.nvidia.com/content/depth-precision-visualized)。Unity在[Upgrading to Unity 5.5](https://docs.unity3d.com/Manual/UpgradeGuide55.html)和[Platform-specific rendering differences](https://docs.unity3d.com/Manual/SL-PlatformDifferences.html)文档中对此进行了说明。 + +在本书代码中,我们在第13章用到了深度纹理,其中对于使用了Linear01Depth、LinearEyeDepth等Unity内置函数的部分不受此变化影响,但我们在Chapter13-MotionBlurWithDepthTexture中直接访问了深度值来计算世界空间下的坐标: + + +``` +// Get the depth buffer value at this pixel. +float d = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv_depth); +``` + +这使得在反转深度缓存的情况下会得到错误的结果。为了解决这个问题,我们可以使用内置宏来判断深度是否已被反转,并据此来做出相应的计算。变化后的代码如下: + + +``` +// Get the depth buffer value at this pixel. +float d = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv_depth); +#if defined(UNITY_REVERSED_Z) + d = 1.0 - d; +#endif +``` + +## 截止到目前的Unity 2017版本 + +**分支链接**:[unity_2017_1](https://github.com/candycat1992/Unity_Shaders_Book/tree/unity_2017_1) + +Unity 2017对Shader部分没有较大更新,我们主要做了以下更改来消除升级造成的Shader Warning信息: + +* 使用内置的UnityObjectToViewPos(*)函数来代替mul(UNITY_MATRIX_MV, *)对顶点进行变换。 -Unity 5.4对Shader部分进行了一些比较大的更新,最明显的一个特征是使用了unity_XXX来代替原有的XXX变换矩阵,例如_Object2World被替换成了unity_ObjectToWorld,_World2Object被替换成了unity_WorldToObject(均在UnityShaderVariables.cginc文件中被声明)。如果你打算直接使用Unity 5.4来编译本项目,Unity会自动更新相应的Shader,因此仍然不会报错。但在学习本书时,读者需要注意代码中一些由于自动更新造成的变化。 +在学习本书时,读者需要注意代码中一些由于更新造成的变化。 # 使用说明 @@ -48,7 +99,7 @@ Unity 5.4对Shader部分进行了一些比较大的更新,最明显的一个 | ------------- |:-------------| |Assets/Scenes|包含了各章对应的场景,每个章节对应一个子文件夹,例如第七章所有场景所在的子文件夹为Assets/Scenes/Chapter7。每个场景的命名方式为Scene_章号_小节号_次小节号,例如7.2.3节对应的场景名为Scene_7_2_3。如果同一个小节包含了多个场景,那么会使用英文字母作为后缀依次表示,例如7.1.2节包含了两个场景Scene_7_1_2_a和Scene_7_1_2_b。| |Assets/Shaders|包含了各章实现的Unity Shader文件,每个章节对应一个子文件夹,例如第七章实现的所有Unity Shader所在的子文件夹为Assets/Shaders/Chapter7。每个Unity Shader的命名方式为ChapterX-功能,例如第七章使用渐变纹理的Unity Shader名为Chapter7-RampTexture。| -|Assets/Materials|包含了各章对应的材质,每个章节对应一个子文件夹,例如第七章所有材质所在的子文件夹为Assets/ Scenes/Chapter7。每个材质的命名方式与它使用的Unity Shader名称相匹配,并以Mat作为后缀,例如使用名为Chapter7-RampTexture的Unity Shader的材质名称是RampTextureMat。| +|Assets/Materials|包含了各章对应的材质,每个章节对应一个子文件夹,例如第七章所有材质所在的子文件夹为Assets/Materials/Chapter7。每个材质的命名方式与它使用的Unity Shader名称相匹配,并以Mat作为后缀,例如使用名为Chapter7-RampTexture的Unity Shader的材质名称是RampTextureMat。| |Assets/Scripts|包含了各章对应的C#脚本,每个章节对应一个子文件夹,例如第五章所有脚本所在的子文件夹为Assets/Scripts/Chapter5。| |Assets/Textures|包含了各章使用的纹理贴图,每个章节对应一个子文件夹,例如第七章使用的所有纹理所在的子文件夹为Assets/Textures/Chapter7。|