《Unity Shader入门精要》勘误


说明:本页面是书籍《Unity Shader入门精要》的勘误列表,可使用页号直接搜索。
作者:冯乐乐
邮箱:lelefeng1992@gmail.com
更新日期:2018年2月11日


版次:第一版

章节 页号 位置 错误文字 正确文字
2.2.1 P8 第1段第1行 往往比图1.3 往往比图2.3
2.3.9 P17 第6段第4行 似避免无谓的计算 以避免无谓的计算
2.4.2 P19 倒数第2行 如Windows、Xbox 360、PS3等 PS3不是微软产品,使用的shader语言是Cg,应该把PS3去掉
3.3.3 P31 第8段第2行 SubShader我希望怎样以及何时 去掉SubShader
3.7 P38 最后一行 NVIDIA的系列教程网址有误,原文为xxxxxx/CgTutorial/cG_tutorial_xxxxxx 应更正为xxxxxx/CgTutorial/cg_tutorial_xxxxxx
4 P39 第3段第1行 “而不是填压式地阅读” 不是“填压”,是“填鸭”
4.3.2 P49 中间公式
4.3.2 P52 最上面公式 结果错误:
4.3.3 P53 练习题2(1)
4.3.3 P53 练习题标号 排版样式错误 二级标号应该是(1)、(2)等
4.3.3 P54 练习题5(2) 公式错误 应该是
4.4.5 P60 最下面矩阵的第二行
4.4.6 P61 练习题1(2) 第二个矩阵应该有4行
4.5.1 P62 最下面 它满足标量乘法,但不满足矢量加法 它既不满足标量乘法,也不满足矢量加法
4.5.7 P66 4.5.7节第2段 原文为:不同的变换顺序得到的结果可能是一样的 应改为:原文为:不同的变换顺序得到的结果可能是不一样的
4.5.7 P66 公式下标,共2处
4.5.7 P67 公式下标,共4处
4.5.7 P67 中间公式 矩阵元素缺少旋转角度下标,如 应该添加旋转角度下标,如
4.6.2 P70 中间公式 公式的第一行的第一个矩阵的最后一行第一列元素错误,不是C0 该元素值0,多了一个字母C
4.6.2 P70 中间公式 公式的第二行的第一个矩阵的第三行第三列元素错误,不是0 该元素值应该是1
4.6.5 P74 所有公式 公式下标有错,
4.6.6 P76 公式 公式下标有错,
4.6.6 P76 中间公式
4.6.7 P79 下面公式 公式下标有错,
4.6.7 P79 下面公式 矩阵第三行第三列缺少负号,
4.6.7 P81 公式 公式下标有错,
4.6.7 P81 中间公式 矩阵第三行第三列分子不是0,
4.11 P95 4.3.3小节的5(2)答案
5.2.2 P104 中间第1段 对于顶点着色器的输出 对于顶点着色器的输入
5.2.2 P104 第4段 把它设置为我们新定义的结构体a2f 不是a2f,是a2v
5.2.3 P105 代码片段 v2f vert(a2v v) : SV_POSITION 去掉函数后面的: SV_POSITION
5.2.3 P106 代码片段 v2f vert(a2v v) : SV_POSITION 去掉函数后面的: SV_POSITION
5.3.1 P108 表5.4倒数第二行 float3 UnityObjectToWorldDir(in float3 dir) 去掉函数描述的in
5.4.1 P109 中下部分 有三处a2f 不是a2f,是a2v
5.5 P111 第5段 来找到问题所处 来找到问题所在
5.5.1 P112 代码段 可视化切线方向的v.tangent后应该指明是xyz分量 该行代码应该是:o.color = fixed4(v.tangent.xyz * 0.5 + fixed3(0.5, 0.5, 0.5), 1.0);
5.6.1 P115 第4段 (Meta l也是) (Metal也是)
5.6.1 P115 第6段 如果不采取行任何错误的话 去掉行
5.7.3 P118 表5.9 Unity 5.3之后对Shader Target进行了调整,该表列出的是5.2版本及以前的Shader Target 添加版本说明
6.1.4 P123 该小节第2句话 我们就需要知道一个表面是和光照进行交互的 我们就需要知道一个表面是如何和光照进行交互的
6.2 P123 自发光描述 “本书使用来表示”中的下标单词错误 应该是
7 P139 第8行 例如可以是256x256或者1028x1028 例如可以是256x256或者1024x1024
7.1.2 P144 第2段 纹理缩放更加复杂的原因 纹理缩小更加复杂的原因
8.1 P163 第4段 开启了深度测试和深度检验 开启了深度测试和深度写入
8.6.1 P174 表8.4 第5行对DstColor的描述,“因子为源颜色值” 因子为目标颜色值
8.6.1 P174 表8.5 目的颜色 所有“目的颜色”改为“目标颜色”
9.1.1 P184 表9.2 前两行重复了,都是描述_LightColor0 去掉一行
9.2.2 P191 第1段第1行 我们编号的代码使用了…… 去掉“编号”
9.2.2 P191 下面步骤(3)中的第6行 我们可以使用__WorldSpaceLightPos0来得到…… WorldSpaceLightPos0前多打了一个下划线,应该是_WorldSpaceLightPos0前多打了一个下划线
9.4.2 P199 第1段第5行 但是Chapter9- ForwardRendering中并没有这样一个Pass啊 Chapter9- ForwardRendering中间不应该有空格,应该是Chapter9-ForwardRendering
10.1 P210 第4段第6行 详见第19章 详见第18章
11.2.1 P232 中间的片元着色器代码 frag的第三行“float column = time - row * _VerticalAmount”错误 应该是“float column = time - row * _HorizontalAmount”,可参见代码下方的解释,列数等于除法结果的余数部分,因此应该乘以第二行中除法的除数_HorizontalAmount
11.3.2 P239 最上面的代码 float3 localPos = center + rightDir * centerOffs.x + upDir * centerOffs.y + normalDir.z * centerOffs.z; normalDir多打了“.z”,应该是float3 localPos = center + rightDir * centerOffs.x + upDir * centerOffs.y + normalDir * centerOffs.z;
13.1.2 P270 公式 公式中的都错误打成了 应该是
13.1.2 P270 倒数第2段第3行 我们上面得到的 下标错误,应该是
13.5 P287 最后一段第2行 (计算图形学的顶级会议) 少了“机”,应该是计算机图形学会议
16.4 P314 最后一段倒数第3行 就是在每次面对draw call时尽可能…… 不是“面对”,应该是“调用”
16.4.4 P318 倒数第5行 我们有一些小小的建设 不是“建设”,应该是“建议”
16.5.2 P320 第2段第2行 准备多个包含不同细节程序的模型 不是“程序”,应该是“程度”
16.6.2 P321 第6段第1行 虽然透明度测试没有关闭深度测试 不是“深度测试”,而是“深度写入”
18.1.1 P344 第1段 (实际反射面可看到蓝线) (如蓝线所示)
18.1.1 P344 第2段 如面果像素要大于 去掉面
18.4.3 P361 最后一段 让亮的物体可以真地非常亮、让暗的物体可以真地非常暗 让亮的物体可以真的非常亮、让暗的物体可以真的非常暗

版次:第二版 & 第三版

章节 页号 位置 错误文字 正确文字
2.1.2 P6 第2段第1行 《Render-Time Rendering, Third Editon》 《Real-Time Rendering, Third Edition》
3 P24 代码片第22行 Enable(ZText)错误 不是ZText,应该是ZTest
4.3.2 P47 第2段第1行最后 “这些运算大的很好理解” 应该是“这些运算大都很好理解”
4.3.2 P49 第3段最后 “我们可以用矢量的模除以该矢量来得到” 应该是“我们可以用矢量除以该矢量的模来得到”
5.2.3 P105 代码片段 v2f vert(a2v v) : SV_POSITION 去掉函数后面的: SV_POSITION
5.2.3 P106 代码片段 v2f vert(a2v v) : SV_POSITION 去掉函数后面的: SV_POSITION
5.4.1 P109 倒数第2段的倒数第2行 “用于描述输出结构体v2v”的v2v错误,“但在输入结构体a2f中”中的a2f错误 输出结构体应该是“v2f”,输入结构体应该是“a2v”
6.5 P132 顶部第二行的反射光线计算公式 等式右边求出的矢量是反射矢量r 的反方向 应该反过来,改成
10.2.2 P223 最下面的代码片 其中计算屏幕坐标的一行代码是:“i.scrPos.xy = offset + i.scrPos.xy;”,而github上的代码是:“i.scrPos.xy = offset * i.scrPos.z + i.scrPos.xy;”,多乘了一个i.scrPos.z 此处并不能说谁对谁错,乘以i.scrPos.z的话会让变形程度随着距离摄像机的远近发生变化
12.3.2 P250 Sobel 算子和 Prewitt算子 两个算子的Gx和Gy卷积核元素有误,写反了 Gx和Gy应该分别是检测x方向和y方向的梯度值的卷积核,具体可见讨论帖
12.4.2 P258 最上面的代码片 for循环里面的第一行i.uv[it]索引错误 应该是i.uv[it*2-1],具体可看见github最新版源码
12.6 P265 最后一段第2行 第一个用于更新A通道 应该是“另一个用于更新A通道”
13.1.2 P270 中间 用d表示而得的的表达式 应该是

版次:第四版

章节 页号 位置 错误文字 正确文字
9.1.1 P183 倒数第2段第3行 “只有分别为Bass Pass和Additional Pass使用这两个编译指令……” 应该是“只有分别为Base Pass……”。另外补充,目前官方已在最新的文档中有了一些关于multi_compile_fwdbase等编译指令的说明,概括来说这些编译指令保证Unity可以为相应类型的Pass生成所有需要的Shader变种,这些变种会处理不同条件下的渲染逻辑,例如是否使用lightmap、当前使用哪种光源类型等。更多相关解释可以参考issue中作者的回答
9.4.2 P202 第3段第3行 “我们需要保证:a2f结构体中……” 应该是“a2v结构体……”
10.2.2 P223 第1段倒数第3行最后 “(xyz轴分别对应了副切线、切线和法线的方向)” 顺序错误,坐标轴顺序应该是TBN,即应该改成“(xyz轴分别对应了切线、副切线和法线的方向)”
11.3.3 P240 下面的代码片 vertex shader的输入“v2f vert(a2v i)”字母错误 应该是“v2f vert(a2v v)”
16.6.2 P321 16.6.2节最后1段倒数第3行最后 “也就是说,只要在执行了……” 不是“只要”,应该是“只有在执行了……”

版次:第五版 & 第六版 & 第七版 & 第八版

章节 页号 位置 错误文字 正确文字
4.3.2 P51 公式二后面的第2段和公式 ”以及“ 有读者来信反映说,这里的“直角边”改成“邻边”更好理解,我回想了下的确初高中课本里用的词语都是邻边,即与角相邻的那条直角边,而则是与角相对的那条直角边。故决定把“直角边”改成“邻边”
4.6.7 P83 上方的不等式组中的第二个不等式 应该是“
4.6.8 P83 4.6.8节第3段第2行 “就是用齐次坐标系的w分量去除以x、y、z分量……” 不是“除以”,应该是“去除x、y、z分量……”
4.9.3 P91 最后一段倒数第二行 “3.6.8节中已经看到了……” 不是“3.6.8节”,应该是“4.6.8节”
6.2 P123 6.2节第2段第一行 “在1975年,著名学者裴祥风……” 根据wiki,裴祥风于1975年由于白血病不幸去世,他于1973年在他的博士论文中提出了Phong模型,并于1975年发表了一篇同名论文在ACM上。因此,这里应该改成1973年更加合适。(缅怀前辈…)
9.4.2 P202 第3段第4行 “顶点着色器的输出结构体v2f必须命名为v……” 应该是“顶点着色器的输入结构体a2v必须命名为v……”
9.1.3 P187 代码片 在代码片中,writeGBuffer和readGBuffer函数的最后两个参数lightDir和viewDir具有误导性 根据延迟渲染的原理,GBuffer里通常不会包含光照信息,而是存储normal、depth和材质属性等信息,而光照计算是通过后续的Pass进行渲染的,因此应当把参数lightDir和viewDir从writeGBuffer和readGBuffer函数中去掉

版次:第九版 & 第十版

章节 页号 位置 错误文字 正确文字
前言 P3 表格倒数第三行 "Assets/Materials"对应说明中"……子文件夹为Assets/Scenes/Chapter7"错误 应该是"……Assets/Materials/Chapter7"
6.4.1 P128 中间的代码片 注释"Transform the normal fram object space to world space"中的"fram"拼写错误 应该改为"from"
10.3.2 P229 第1段第1行 “Procedural Material Asset”翻译成“程序纹理资源”有误导性 翻译为“程序材质资源”更为恰当
13.2 P275 在shader里计算运动模糊的叠加效果 目前的计算方式相当于均值叠加,即每一帧对最后的颜色贡献度是相同的,因此在效果上会有一定误导性 issue里,ljcduo提出可以按不同的权重进行混合,改善模糊效果