【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)
写在前面
感谢全部点进来看的朋友。没错。我眼下打算写一本关于Unity Shader的书。
出书的目的有以下几个:
总结我接触Unity Shader以来的历程,给其它人一个借鉴。我非常明确学Shader的艰难,在群里也见了非常多人提出的问题。
我认为学习Shader还是一件有规律可循的事情,但问题是中文资料难觅,而大家又不愿意去看英文。。。这对我有什么优点呢?强迫我对知识进行梳理,对细节问题把握更清楚。
第二个原因你懂的。
关于本书的定位问题:
面向Unity Shader刚開始学习的人,但要:
- 有一定的编程经历。不然我说:在脚本里写一个函数XXX。您问我,脚本是啥?我:……。
- 希望您还记得初中高中的基本数学。起码能把数算清楚。我明确非常多人早就把矩阵这些略微复杂一点的数学还给了大学老师,所以我会单独在一个章节里介绍。
- 希望您有一定的耐心。为什么你老是认为看不懂、学不会Shader,能够反思下自己是不是太急躁了,想要今天看一下明天就会。放弃吧。这是不可能的。
我写这本书的一个目标是,希望帮助刚開始学习的人把基础打牢,没有基础不论什么上层建筑都是不可靠的。
我不是在写一本特效大全,所以你假设想要看到各种酷炫狂霸拽的特效,抱歉,这本书里差点儿没有。这跟上一点有非常大关系,仅靠一本书,我能够肯定一个刚開始学习的人没有办法成为一个“Shader大神”。我希望全部读过这本书的人能够真正明确shader是个什么东西,而不是说:“哦。shader嘛,就是在Unity里右键Create->Shader得到的那个东西嘛”。
关于特效大全的问题,假设将来我有十足的经验和资格了,可能会真的写一本,哈哈哈
写书是件非常不easy的事情,希望我能够把它做好。
2015.12.21更新:关于什么时候出版
不少朋友留言或者发邮件问我什么时候出版,我比你们更着急呀……只是编辑说还在改动和排版,大概出版时间会在明年一月份(希望不会延期吧)。谢谢大家帮我起名字。我把一些大家起得名字拿给编辑看。以及和朋友讨论。最后还是暂定为《Unity Shader入门精要》。难听么?别打击我……以下有朋友起了非常多萌萌哒的名字,利用下程序媛的身份,只是吧,感觉这个因人而异,说不定有人就不喜欢程序媛写的书呢……所以最后还是挑了这个比較严肃的名字,嗯。
书的封面我也找万能的设计师兰朋友设计啦~
还没出版所以打打水印。
当然了,编辑仅仅是允许用了,可是应该还会改动吧。不知道大家认为封面怎么样……我是认为萌萌哒。哈哈。
总体结构
我把这本书分为五大篇章:
基础篇:这是非常重要的一章,主要是为了刚開始学习的人普及主要的理论知识,以及所需的数学基础。
我明确非常多人看不懂网上的一些材料。我尽量讲得通俗。
Shader0基础篇:从最简单的shader開始,解说shader中基础的光照模型、纹理、和透明效果等。
同一时候。还会介绍一些shader的Debug技巧、shader里常见报错信息。
Shader中级篇:这是进阶篇章,将解说更加复杂的光照、高级纹理、以及怎样用shader实现动画等一系列进阶内容;
Shader高级篇:则涵盖了一些shader的高级使用方法,如使用缓冲区、实现屏幕特效、非真实感渲染等。同一时候,还会介绍一些优化技巧。
扩展篇:将会涵盖一些Unity Surface Shader背后的机制。还会针对Unity 5.0+版本号中的一些新的特性进行简要分析。最后。希望向大家介绍一点学习shader的经验和资源。
眼下文件夹已经初步定型。把文件夹记录在这里,但我会不断更新。
假设您对该书的文件夹和内容有不论什么意见和建议都能够在下方留言。假设您没有CSDN账号。也能够通过发邮件来告诉我:lelefeng1992 # gmail DOT com。
我会依据您的意见对文件夹和内容做出一定的更改。
文件夹(已完整)
* 前言
* 这本书讲些什么
* 读这本书之前你须要哪些知识
* 谁适合读这本书
* 谁临时还不适合读这本书
* 约定
* 读者反馈
* 本书源代码
第1部分 基础篇
第1章 欢迎来到Shader的世界
- 1.1 程序猿的三大浪漫:为什么要学习Shader
- 1.2 这不是程序猿一个人的战斗
- 1.3 世界这么大
第2章 渲染流水线
- 2.1 综述
- 2.1.1 什么是流水线
- 2.1.2 什么是渲染流水线
- 2.2 CPU和GPU的通信
- 2.2.1 把数据载入到显存中
- 2.2.2 设置渲染状态
- 2.2.3 调用Draw Call
- 2.3 GPU流水线
- 2.3.1 概述
- 2.3.2 顶点着色器
- 2.3.3 裁剪
- 2.3.4 屏幕映射
- 2.3.5 三角形设置
- 2.3.6 三角形遍历
- 2.3.7 片元着色器
- 2.3.8 逐片元操作
- 2.3.9 总结
- 2.4 一些easy困惑的地方
- 2.4.1 什么是OpenGL/DirectX
- 2.4.2 什么是HLSL、GLSL、CG
- 2.4.3 什么是Draw Call
- 2.4.4 什么是固定渲染管线(Fixed-Function Pipeline)
- 2.5 那么。你明确什么是Shader了吗
- 扩展阅读
- 2.1 综述
第3章 Unity Shader基础
- 3.1 Unity Shader概述
- 3.1.1 一对好兄弟:材质(Material)和Unity Shader
- 3.1.2 Unity中的材质
- 3.1.3 Unity中的Shader
- 3.2 Unity Shader的基础:ShaderLab
- 3.2.1 什么是ShaderLab
- 3.3 Unity Shader的结构
- 3.3.1 给我们的Shader起个名字:Shader
- 3.3.2 材质和Unity Shader的桥梁:Properties
- 3.3.3 重量级成员:SubShader
- 3.3.4 留一条后路:Fallback
- 3.3.5 ShaderLab还有其它的语义吗
- 3.4 Unity Shader的形式
- 3.4.1 Unity的宠儿:Surface Shader
- 3.4.2 最聪明的孩子:Vertex/Fragment Shader
- 3.4.3 抛弃的角落:Fixed Function Shader
- 3.4.4 那么,要选择哪种Unity Shader形式
- 3.5 本书使用的Unity Shader形式
- 3.6 答疑解惑
- 3.6.1 Unity Shader != 真正的Shader
- 3.6.2 Unity Shader和CG/HLSL之间的关系
- 3.6.3 我能够使用GLSL来写吗
- 扩展阅读
- 3.1 Unity Shader概述
第4章 学习Shader所需的数学基础
- 4.1 背景:农场游戏
- 4.2 笛卡尔坐标系
- 4.2.1 二维笛卡尔坐标系
- 4.2.2 三维笛卡尔坐标系
- 4.2.3 左手坐标系和右手坐标系
- 4.2.4 Unity使用的坐标系
- 4.2.5 练习题
- 4.3 点和矢量
- 4.3.1 点和矢量的差别
- 4.3.2 矢量运算
- 4.3.2.1 矢量和标量乘法/除法
- 4.3.2.2 矢量的加法和减法
- 4.3.2.3 矢量的模
- 4.3.2.4 单位矢量
- 4.3.2.5 矢量的点积
- 4.3.2.6 矢量的叉积
- 4.3.3 练习题
- 4.4 矩阵
- 4.4.1 矩阵的定义
- 4.4.2 和矢量联系起来
- 4.4.3 矩阵运算
- 4.4.3.1 矩阵和标量的乘法
- 4.4.3.2 矩阵和矩阵的乘法
- 4.4.4 特殊的矩阵
- 4.4.4.1 方块矩阵
- 4.4.4.2 单位矩阵
- 4.4.4.3 转置矩阵
- 4.4.4.4 逆矩阵
- 4.4.4.5 正交矩阵
- 4.4.5 行矩阵还是列矩阵
- 4.4.6 练习题
- 4.5 矩阵的几何意义:变换
- 4.5.1 齐次坐标
- 4.5.2 分解基础变换矩阵
- 4.5.3 平移矩阵
- 4.5.4 缩放矩阵
- 4.5.5 旋转矩阵
- 4.5.6 组合变换
- 4.5.7 练习题
- 4.6 坐标空间
- 4.6.1 为什么要使用这么多不同的坐标空间
- 4.6.2 坐标空间的变换
- 4.6.3 顶点的坐标空间变换过程
- 4.6.3.1 案例
- 4.6.4 模型空间
- 4.6.4.1 案例
- 4.6.5 世界空间
- 4.6.5.1 案例
- 4.6.6 观察空间
- 4.6.6.1 案例
- 4.6.7 裁剪空间
- 4.6.7.1 透视投影
- 4.6.7.2 正交投影
- 4.6.7.3 案例
- 4.6.8 屏幕空间
- 4.6.8.1 案例
- 4.6.9 总结
- 4.7 法线变换
- 4.8 Unity Shader中的内置变量(数学篇)
- 4.9 答疑解惑
- 4.9.1 使用3 x 3还是4 x 4的变换矩阵
- 4.9.2 Cg中的矢量和矩阵类型
- 4.9.3 Unity中的屏幕坐标:ComputeScreenPos/VPOS/WPOS
- 练习题答案
- 扩展阅读
第2部分0基础篇
第5章 開始Unity Shader学习之旅
- 5.1 本书使用的软件和环境
- 5.2 一个最简单的Vertex/Fragment Shader
- 5.2.1 Vertex/Fragment Shader的基本结构
- 5.2.2 模型数据从哪来
- 5.2.3 顶点着色器和片元着色器之间怎样通信
- 5.2.4 怎样使用属性
- 5.3 强大的援手:Unity提供的内置文件和变量
- 5.3.1 内置的包括文件
- 5.3.2 内置的变量
- 5.4 Unity提供的Cg/HLSL语义
- 5.4.1 什么是语义
- 5.4.2 Unity支持的语义
- 5.4.3 怎样定义复杂的变量类型
- 5.5 程序猿的烦恼:Deeeeebug
- 5.5.1 使用假彩色图像
- 5.5.2 利用神器:Visual Studio
- 5.6 小心:渲染平台的差异
- 5.6.1 渲染纹理的坐标差异
- 5.6.2 Shader的语法差异
- 5.6.3 Shader的语义差异
- 5.6.4 其它平台差异
- 5.7 Shader整洁之道
- 5.7.1 float、half还是fixed
- 5.7.2 规范语法
- 5.7.3 避免不必要的计算
- 5.7.4 慎用分支和循环语句
- 5.7.5 不要除以0
- 扩展阅读
第6章 Unity中的基础光照
- 6.1 我们是怎样看到这个世界的
- 6.1.1 光源
- 6.1.2 吸收和散射
- 6.1.3 着色
- 6.1.4 BRDF光照模型
- 6.2 标准光照模型
- 6.2.1 环境光
- 6.2.2 自发光
- 6.2.3 漫反射
- 6.2.4 高光反射
- 6.2.5 逐像素还是逐顶点
- 6.2.6 总结
- 6.3 环境光和自发光
- 6.4 漫反射光照模型
- 6.4.1 实践:逐顶点光照
- 6.4.2 实践:逐像素光照
- 6.4.3 改善技巧:半兰伯特模型
- 6.5 高光反射光照模型
- 6.5.1 实践:逐顶点光照
- 6.5.2 实践:逐像素光照
- 6.5.3 Blinn-Phong模型
- 6.6 召唤神龙:使用Unity内置的函数
- 6.6.1 使用内置函数改写Unity Shader
- 6.1 我们是怎样看到这个世界的
第7章 基础纹理
- 7.1 单张纹理
- 7.1.1 实践
- 7.1.2 解释
- 7.1.3 纹理的属性
- 7.2 凹凸映射
- 7.2.1 高度纹理
- 7.2.2 法线纹理
- 7.2.3 实践
- 7.2.4 解释
- 7.2.5 Unity中的法线纹理类型
- 7.3 渐变纹理
- 7.3.1 实践
- 7.3.2 解释
- 7.4 遮罩纹理
- 7.4.1 实践
- 7.4.2 解释
- 7.4.3 其它遮罩纹理
- 7.1 单张纹理
第8章 透明效果
- 8.1 为什么渲染顺序非常重要
- 8.2 Unity Shader的渲染顺序
- 8.3 透明度測试
- 8.3.1 实践
- 8.3.2 解释
- 8.4 透明度混合
- 8.4.1 实践
- 8.4.2 解释
- 8.5 开启深度写入的半透明效果
- 8.5.1 实践
- 8.5.2 解释
- 8.6 ShaderLab的混合命令
- 8.6.1 混合等式和參数
- 8.6.2 混合操作
- 8.6.3 常见的混合类型
第3部分 中级篇
第9章 更复杂的光照
- 9.1 Unity的渲染路径
- 9.1.1 前向渲染路径
- 9.1.1.1 前向渲染路径的原理
- 9.1.1.2 Unity中的前向渲染
- 9.1.1.3 内置的光照变量和函数
- 9.1.2 顶点照明渲染路径
- 9.1.2.1 Unity中的顶点照明渲染
- 9.1.2.1 可訪问的内置变量和函数
- 9.1.3 延迟渲染路径
- 9.1.3.1 延迟渲染的原理
- 9.1.3.2 Unity中的延迟渲染
- 9.1.2.3 可訪问的内置变量和函数
- 9.1.4 选择哪种渲染路径
- 9.1.1 前向渲染路径
- 9.2 Unity的光源类型
- 9.2.1 光源类型有什么影响
- 9.2.1.1 平行光
- 9.2.1.2 点光源
- 9.2.1.3 聚光灯
- 9.2.2 在前向渲染中处理不同的光源类型
- 9.2.2.1 实践
- 9.2.2.2 解释
- 9.2.2.3 实验:Base Pass和Additional Pass的调用
- 9.2.1 光源类型有什么影响
- 9.3 Unity的光照衰减
- 9.3.1 用于光照衰减的纹理
- 9.3.2 使用数学公式计算衰减
- 9.4 Unity的阴影
- 9.4.1 阴影是怎样实现的
- 9.4.2 不透明物体的阴影
- 9.4.2.1 让物体投射阴影
- 9.4.2.2 让物体接收阴影
- 9.4.3 使用帧调试器查看阴影绘制过程
- 9.4.4 统一管理光照衰减和阴影
- 9.4.5 使用透明度測试的物体的阴影
- 9.1 Unity的渲染路径
第10章 高级纹理
- 10.1 立方体纹理
- 10.1.1 天空盒子
- 10.1.2 创建用于环境映射的立方体纹理
- 10.1.3 反射
- 10.1.4 折射
- 10.1.5 菲涅尔反射
- 10.2 渲染纹理
- 10.2.1 镜子效果
- 10.2.2 玻璃效果
- 10.3 程序纹理
- 10.3.1 在Unity中实现简单的程序纹理
- 10.3.2 Unity的程序材质
- 10.1 立方体纹理
第11章 让画面动起来
- 11.1 Unity Shader中的内置变量(时间篇)
- 11.2 纹理动画
- 11.2.1 序列帧动画
- 11.2.2 滚动的背景
- 11.3 顶点动画
- 11.3.1 流动的河流
- 11.3.2 广告牌
- 11.3.3 注意事项
第4部分 Shader高级篇
第12章 屏幕后处理效果
- 12.1 建立一个主要的屏幕后处理脚本系统
- 12.2 调整亮度、饱和度和对照度
- 12.3 边缘检測
- 12.3.1 什么是卷积
- 12.3.2 常见的边缘检測算子
- 12.3.3 实现
- 12.4 高斯模糊
- 12.4.1 高斯滤波
- 12.4.2 实现
- 12.5 Bloom效果
- 12.6 运动模糊
- 12.7 扩展阅读
第13章 使用深度和法线纹理
- 13.1 获取深度和法线纹理
- 13.1.1 背后的原理
- 13.1.2 怎样获取
- 13.1.3 查看深度和法线纹理
- 13.2 再谈运动模糊
- 13.3 全局雾效
- 13.3.1 重建世界坐标
- 13.3.2 雾的计算
- 13.3.3 实现
- 13.4 再谈边缘检測
- 13.5 扩展阅读
- 13.1 获取深度和法线纹理
第14章 非真实感渲染
- 14.1 卡通风格的渲染
- 14.1.1 渲染轮廓线
- 14.1.2 加入高光
- 14.1.3 实现
- 14.2 素描风格的渲染
- 14.3 扩展阅读
- 14.4 參考文献
- 14.1 卡通风格的渲染
第15章 使用噪声
- 15.1 消融效果
- 15.2 水波效果
- 15.3 再谈全局雾效
- 15.4 扩展阅读
- 15.5 參考文献
第16章 Unity中的渲染优化技术
- 16.1 移动平台的特点
- 16.2 影响性能的因素
- 16.3 Unity中的渲染分析工具
- 16.3.1 认识Unity 5的渲染统计窗体
- 16.3.2 性能分析器的渲染区域
- 16.3.3 再谈帧调试器
- 16.3.4 其它性能分析工具
- 16.4 降低Draw Call数目
- 16.4.1 动态批处理
- 16.4.2 静态批处理
- 16.4.3 共享材质
- 16.4.4 批处理的注意事项
- 16.5 降低须要处理的顶点数目
- 16.5.1 优化几何体
- 16.5.2 模型的LOD技术
- 16.5.3 遮挡剔除技术
- 16.6 降低须要处理的片元数目
- 16.6.1 控制绘制顺序
- 16.6.2 时刻警惕半透明物体
- 16.6.3 降低实时光照
- 16.7 节省带宽
- 16.7.1 降低纹理大小
- 16.7.2 利用分辨率缩放
- 16.8 降低计算复杂度
- 16.8.1 Shader的LOD技术
- 16.8.2 代码方面的优化
- 16.8.3 依据硬件条件进行缩放
- 16.9 扩展阅读
第5部分 扩展篇
第17章 Surface Shader探秘
- 17.1 一个样例
- 17.2 编译指令
- 17.2.1 表面函数
- 17.2.2 光照函数
- 17.2.3 其它可选參数
- 17.3 两个结构体
- 17.3.1 数据来源:Input结构体
- 17.3.2 表面属性:SurfaceOutput结构体
- 17.4 Unity背后做了什么
- 17.5 实例分析
- 17.6 Surface Shader的缺点
第18章 基于物理的渲染
- 18.1 PBS的理论和数学基础
- 18.1.1 光是什么
- 18.1.2 BRDF
- 18.1.3 漫反射项
- 18.1.4 高光反射项
- 18.1.5 Unity中的PBS实现
- 18.2 Unity 5的Standard Shader
- 18.2.1 它们是怎样实现的
- 18.2.2 怎样使用Standard Shader
- 18.3 一个更加复杂的样例
- 18.3.1 设置光照环境
- 18.3.2 放置反射探针
- 18.3.3 调整材质
- 18.3.4 线性空间
- 18.4 答疑解惑
- 18.4.1 什么是全局光照
- 18.4.2 什么是伽马校正
- 18.4.3 什么是HDR
- 18.4.4 那么,PBS适合什么样的游戏
- 18.5 扩展阅读
- 參考文献
- 18.1 PBS的理论和数学基础
第19章 Unity 5更新了什么
- 19.1 场景“更亮了”
- 19.2 表面着色器更easy“报错了”
- 19.3 当家做主:自己控制非统一缩放的网格
- 19.4 固定管线着色器逐渐退出舞台
第20章 还有很多其它内容吗
- 20.1 假设你想深入了解渲染的话
- 20.2 世界那么大
- 參考文献
2015.06.28更新
这几天在写数学的部分,早就料到数学是最难讲的一部分,尤其是矩阵。
我和非常多人一样。对矩阵这个家伙简直是”深恶痛绝“。看到它就想躲过去。无奈,shader里面要时常跟它打交道。那么。就勇敢地面对它吧!
我非常明确。为什么我们会这么”讨厌“矩阵。假设说矢量这样的我们还能够通过可视化的方法来直观地理解,那么。矩阵,这个放在一个小方框里的东西。就非常难用画的方式把它画出来。而我们人的大脑又是非常懒惰的(恩,我仅仅能为我的大脑代言),没图你说个XXX。我才懒得记!
实际上,我一直对数学怀抱一种敬畏的心态。世界上有非常多的数学家同一时候也是哲学家、心理学家,感觉数学对理解这个世界都有非常重要的意义,并且那些数学家的生平都非常有意思。让人敬佩。能够将其一生都贡献给数学的人都非常伟大的,那些创造矩阵、空间、矢量这些的人是多么伟大。怎么就会想到用这样一种方式来描写叙述这样的现象呢?这真的是件非常奇妙的事情。并且。你会发现。怎么这样算就能够表示出这样的意思呢。明明看起来没有不论什么关系啊!这样的巧合真的是让人感叹数学的伟大。
好了,不再歪歪……回到真实的世界……在写的过程中。我会尽量用通俗、幽默、有图示的方式来讲这一章,效果怎么样。我也非常忐忑。会不会反映说看不懂?如今一切都不得而知……
一个有趣的事情是,在讲左右手坐标系和左右手法则的时候。我拿自己的手做了模型:
哈。这个黄色的手的确是我的手。然后用Photoshop处理了一下。
看起来还挺像那么回事的?谁敢说我手胖我跟谁急!
这几天一直在绘图、看书、写文字、写公式(天哪,尽管用Markdown写公式已经非常方便了,但一天要写那么多公式也真的是……)、算题,希望最后的结果是好的。加油吧。
2015.07.10更新
写了两个多星期,把数学一章的草稿基本完毕了。今天更新了第2、3、4章的文件夹,有兴趣的能够看一下。欢迎提出各种意见和建议。
数学篇是我最想好好写的一篇(当然啦。其它章我也会好好写。
。。
)。数学之所以难学。一部分是由于它的抽象性。没办法。假设我们想要把一些规律从生活中提取出来,就必定要涉及到各种数学符号,这就要用到抽象。我用了非常多图和案例来尽量让这个过程更加形象易懂。也使用了一些相似对话的方式,来解释一些常见的疑惑。
眼下,本书的第一篇——基础篇基本成型。基础篇里每一章都有个小节叫做答疑解惑,意在总结一些常见的疑惑点,假设读者除了我上面写到的几点外还有其它的困惑。能够给我留言。我会视情况加入到这一章节。
除此之外,在数学一章里我加入了练习题的部分。事实上我是有犹豫的。认为可能大家都会跳过去。那不是白写了。。。之所以要设置这个练习题的部分。一方面的确是希望读者能够通过这些练习真的拿笔算一下,说真的。数学你不多算真的永远学不会。还有一方面。是想把一些easy混淆的点通过练习题的方式提出来,让读者自己算一下加深理解。由于假设要把这些混淆点都写进书里,思路上会比較乱。希望能起到比較好的效果吧。。。
以下就会真正開始Unity Shader的部分了。
加油!
2015.07.29更新
放假了大部分时间都拿来看资料、学习、写书了。半个多月写出了基本篇的草稿,不知道是快还是慢?我自信自己写的非常具体了,比方第5章介绍了语义,第6章具体介绍了基本光照模型,第7章写到凹凸映射的时候也花了非常大篇幅介绍实现的原理和细节,包括高度图,第8章的透明效果先介绍了渲染队列,我自己认为这个非常重要的,应该在学习怎么实现透明之前就让读者知道渲染队列对透明来说是多么的重要。我认为如今的安排对刚開始学习的人足够友好了,当然写后面内容的时候可能还会对前面的内容进行改动。比如如今想在第4章数学里加一个在Unity脚本里的矩阵运算,但这本书是讲shader的。不知道加进去合不合适,但它的确是个easy出错的地方。
每次讲到新的内容时,我都尽量用图示来解释。每一幅图都是在OmniGraffle里认真做的,希望以后看到的人能get到我的意思。写书写太多感觉写博客都语无伦次了。。
。
近期QQ群、私信和留言经常有人问题一些问题,我在这里统一回答一下。回答几个问题:
这书什么时候出版?
大家也看到了我的更新速度。眼下写的了第8章(第一章介绍还没写),初步定的是19章。也就是说写了三分之中的一个了,我如今大概花了一个多月,可是写书的确花费了非常多时间,写完基本篇之后可能会放慢一下速度。总体来讲,我估測下大概还要三四个月的时间才干写完,因此出版的话最快年底,不然就是明年年初了。
有一些人说太晚了,相信我,我比不论什么人都想让它赶紧出版,可是我不会影分身……好羡慕鸣人。
能不能添加些更高难度的技术?
一些童鞋大概看了前几章文件夹后认为内容比較简单。怎么说呢,这本书的定位是面向刚開始学习的人,因此肯定会是由易到难的,但我自信的是,即便是简单的内容我也写的非常具体。非常多非常小的点也都写到了。非常多地方都是其它资料里一带而过,而又非常迷惑的点。假设是没有好好学过shader的。就算如今已经能够熟练写一些了我认为这本书也是实用的。
更重要的是,我不想把它写成一本百科全书。一来我自己的确经验不够,写不来大全,二来我认为一本大全的书肯定写不精、写不细。到头来又说看不懂怎么办?三来我认为写shader是一个师傅领进门修行靠个人的活,一旦你了解了它的工作流程和基本思路,剩下的就是经验的积累,你看得写、写得多自然就厉害了,这不是一本基础书就能够让你做到的。
当然,我的确会写一些复杂的技术,这是高级篇和扩展篇的工作。
假设你认为有一些经常使用的复杂一些的技术想要在这本书里看到,能够告诉我。
是彩色书还是黑白书?
我自己当然希望是彩色书,一本讲画面效果的书居然是黑白的那太遗憾了。只是编辑告诉我,彩色印刷会提高非常多成本,那销量就会下降。我能够理解,但如今还没有一个定论,等写完之后会尽量争取。
只是我也非常好奇,大家认为这样一本几百页的全彩书,你认为多少价钱比較合适?
2015.09.04更新
断断续续把中级篇的草稿完毕了。越往后面写感觉内容的安排越费劲,一些内容不知道把它们归入到哪一章更加合适,放的早了一些内容没讲操心读者看不明确,放的晚了又认为内容不足单独成章。高级篇想必也会这样。文件夹还在不断调整中……
写第9章光照简直是除数学篇外最痛苦的一章。想要讲明确非常难啊,无论怎样,眼下的内容我尽力了,希望能够有好的效果。
由于内容多并且杂,所以这一章不知不觉就写了四万字,也是眼下字数最多的章节了。即便这样,仍然对一些内容“念念不忘”,比如菲尼尔光照、边缘光照等,不知道以后会不会加入进去。
话说。写书的时候发现一个不错的免费纹理站点——http://opengameart.org/,写书的时候有一些纹理是从这里找到的,在这里也推荐给大家。
当然。也有自己画的一些纹理。
之前做游戏的时候做了一个2D水面。这次把它的实现也加入到了书里面。
呼,还有两大篇总体草稿就完毕了。有些内容想偷点懒。使用点博客里写过的。
。。9月预计要赶论文,进度会更慢。预计完毕大概要11月或者12月了,希望大家能够耐心等待。我会加油的。
2015.10.20更新
恩。好久没更新了。由于9月份一直在弄别的事情所以写书的进程有些滞缓了。让大家久等了!只是还好,赶在11月之前把高级篇的草稿部分写完了,希望大家看了文件夹能够惬意如今的内容。
第12章讲屏幕特效,好吧,我承认我原来没想写这么多的,由于我一開始就说过这不是一本特效大全。只是写着写着。就认为,恩,高斯模糊非常重要,不能删,恩,边缘检測非常重要。由于能够和后面联系在一起。恩。这样运动模糊也不能删了(后面也有联系)。
所以写着写着就写了非常多,只是希望大家看了书能够对这些屏幕特效有所了解。知道它们实现的基本原理(事实上本质上都差点儿相同),这样在实现更复杂的屏幕特效时也会有头绪了。
第13章讲深度和法线缓存。事实上好像移动平台上用的比較少?只是我认为这张内容非常适合扩展视野,让大家知道原来这些纹理还能够这么用。里面一些内容,比方运动模糊和全局雾效參考了GPU Gems里面的文章。事实上GPU Gems也并没有那么复杂。第14章讲了非真实感渲染。这章并非重点,主要也是为了扩展视野,我选了最流行的卡通风格和非常出名的素描风格来做个样例。第15章讲了噪声在shader中的应用,噪声的应用实在太广了。。。第16章是很多人要求的优化。恩,有四五个童鞋都联系我说希望学习一些优化。如你们所愿:)。
这章的内容參考了之前我的一篇博客,只是当然不是原封不动啦。。
。
内容更具体了,并针对Unity 5做了一些调整和变化,希望对大家有所启示。高级篇的一个主要目的是为了开阔视野。了解很多其它技术,因此每一章后面都有扩展阅读部分,给出了我能找到的全部我认为非常好的资料。能列在这部分的资料,我都强烈建议读者去读一下,相信你一定会有非常大的收获。
好啦,最后放一些高级篇里实现的效果,欢迎大家提出意见和建议。
还有最后一篇扩展篇,计划讲一些关于Unity 5的PBR和相似于ShaderToy这样的内容,你怎么看?
恩。一直有人问我什么时候出版,具体时间我真不知道。
写完最后一篇大概11月初,然后我还要又一次读一遍全部内容。做些调整和改动。
这大概也要花一个月吧。也就是12月了。并且可能还有实验室的事情要做,因此出版大概要明天年初了。希望大家能再等一下。只是。真的非常感谢一直支持我的各位,说实话写到如今的确有些到了倦怠期。只是由于有非常多支持和鼓舞的声音给了非常多新的动力,谢谢大家。还是希望大家假设对和书有关的不论什么建议都能够联系我。不胜感激:)
2015.11.09更新
呜呼,不敢相信自己的速度,我居然在11月赶出来了……截止到今天。书里面全部的20章内容就都完毕了。上周已经对全部章节进行了我这方面的改动。然后交给编辑啦~我已经竭尽全力了,希望会有好的结果!
关于什么时候出版
编辑说大概还要一个多月吧。看我的内容须要多长时间排版。我会在博客里实时更新的(可能会开还有一篇文章了吧)!
关于封面和书名
恩,事实上之前给出版社写表格的时候填了个名字,《Unity Shader入门金典》,是不是认为挺难听的……假设你有更好的名字一定要告诉我,假设最后使用了的话一定免费赠书!
封面的话。编辑说我能够提出自己的意见。我比較想用Shadertoy创始人iq的一些作品(http://www.iquilezles.org/www/articles/raymarchingdf/raymarchingdf.htm),比方以下这些(啊啊啊iq是我的偶像…):
这些效果仅仅使用了一个pixel shader,是最好的展现shader能力的样例啊有木有!
打算后面给编辑看一下合不合适,然后再联系偶像iq征得许可权:)
这大概是最后一次更新这篇博客了。我上一周在改书的时候尽管对文件夹小改了下,但大部分内容就是上面这样的。
期望后面一切顺利。再次感谢小伙伴们的支持。!。关于出版时间、书名和封面之类的我会在后面不断跟进的!
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i ').text(i));
};
$numbering.fadeIn(1700);
});
});
【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)的更多相关文章
- 【我的书】Unity Shader的书 — 目录(2016.5.19最后一次更新)
写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shad ...
- Unity Shader入门精要学习笔记 - 第12章 屏幕后处理效果
建立一个基本的屏幕后处理脚本系统 屏幕后处理,顾名思义,通常指的是在渲染完整个场景得到屏幕图像后,再对这个图像进行一系列操作,实现各种屏幕特效.使用这种技术,可以为游戏画面添加更多艺术效果,例如景深. ...
- Unity中的特殊文件夹
看了雨松MOMO的 Unity3D研究院之手游开发中所有特殊的文件夹学习了,做个笔记. 1.Editor Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor即可.不过我比较喜欢 ...
- unity 如何打开本地文件夹,并选中文件
public static void OpenDirectory(string path, bool isFile = false) { if (string.IsNullOrEmpty(path)) ...
- svn提交新文件夹同时不需要更新全部上级目录
关于svn的指定目录指定位置更新:当在提交了新建的目录后可以使用 a) 在需要更新的上级目录上单击右键 在延伸菜单中选择 b) 弹出对话框中选择,check repository c) 新添加的 ...
- Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅
一个顶点/片元 着色器的结构大概如下: Shader "MyShaderName" { Properties { //属性 } SubShader { //针对显卡A的SubSha ...
- 第四章 开始Unity Shader学习之旅(2)
目录 1. 强大的援手:Unity提供的内置文件和变量 1.1 内置的包含文件 1.2 内置的变量 2. Unity提供的Cg/HLSL语义 2.1 什么是语义 2.2 Unity支持的语义 2.3 ...
- Unity Shader 基础(3) 获取深度纹理
Unity提供了很多Image Effect效果,包含Global Fog.DOF.Boom.Blur.Edge Detection等等,这些效果里面都会使用到摄像机深度或者根据深度还原世界坐标实现各 ...
- Unity Assets目录下的特殊文件夹名称
1.隐藏文件夹以.开头的文件夹会被Unity忽略.在这种文件夹中的资源不会被导入,脚本不会被编译.也不会出现在Project视图中.2.Standard Assets在这个文件夹中的脚本最先被编译.这 ...
随机推荐
- linux中vsftpd配置文件详解
vsftpd配置文件采用“#”作为注释符,以“#”开头的行和空白行在解析时将被忽略,其余的行被视为配置命令行,每个配置命令的“=”两边不要留有空格.对于每个配置命令,在配置文件中还列出了相关的配置说明 ...
- iphone开发中数据持久化之——模型对象归档(二)
在Cocoa世界中,术语“归档”是指另一种形式的序列化,它可以实现对任何对象的序列化.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文件,然后再从中读取它们.只要在类中实现的每个属性都是标量(如 ...
- uva10480(最小割)
传送门:Sabotage 题意:给定多个城市的网络,每个城市之间的通信有花费,要求使得首都和最大城市之间的通信断掉的最小花费.要求输出任意一组砸掉的边. 分析:跑一遍最大流dinic后,根据最小割定理 ...
- linux+nginx+mysql+php
LNMP(linux+nginx+mysql+php)服务器环境配置 一.简介 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为 “engine X”, 是一个高性能的 ...
- poj1849(求树的直径)
题目链接:http://poj.org/problem?id=1849 题意:有一颗n个结点的带权的无向树, 在s结点放两个机器人, 这两个机器人会把树的每条边都走一遍, 但是最后机器人不要求回到出发 ...
- Mutex(测量)
游标共享怎样使用Mutex kks 使用mutex以便保护对于下述基于parent cursor父游标和子游标child cursor的一系列操作 对于父游标parent cursor的操作: 基于发 ...
- RPC分布式处理
RPC(远程过程调用)的应用 接触背景 因为工作上某项目的需要设计一种分布式处理耗时的运算,每个节点然后将运算结果返回给中心服务器,而最初未了解RPC这部分之前我的设计是在每一个RPC服务器上搭建一个 ...
- java 采用MD5加密解密
MD5加密解密 package endecrypt; import java.io.UnsupportedEncodingException; import java.security.Message ...
- Top 10 Mistakes Java Developers Make(转)
文章列出了Java开发者最常犯的是个错误. 1.将数组转换为ArrayList 为了将数组转换为ArrayList,开发者经常会这样做: ? 1 List<String> list = A ...
- 设计模式六大原则(4):接口隔离原则(Interface Segregation Principle)
接口隔离原则: 使用多个专门的接口比使用单一的总接口要好. 一个类对另外一个类的依赖性应当是建立在最小的接口上的. 一个接口代表一个角色,不应当将不同的角色都交给一个接口.没有关系的接口合并在一起,形 ...