说明:本页面是书籍《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提出可以按不同的权重进行混合,改善模糊效果 |