【我的书】Unity Shader的书 — 目录(2016.5.19最后一次更新)
寫在前面
感謝所有點進來看的朋友。沒錯,我目前打算寫一本關于Unity Shader的書。
出書的目的有下面幾個:
總結我接觸Unity Shader以來的歷程,給其他人一個借鑒。我非常明白學Shader的艱難,在群里也見了很多人提出的問題。我覺得學習Shader還是一件有規律可循的事情,但問題是中文資料難覓,而大家又不愿意去看英文。。。這對我有什么好處呢?強迫我對知識進行梳理,對細節問題把握更清楚。
第二個原因你懂的。
關于本書的定位問題:
面向Unity Shader初學者,但要:
我寫這本書的一個目標是,希望幫助初學者把基礎打牢,沒有基礎任何上層建筑都是不可靠的。
我不是在寫一本特效大全,所以你如果想要看到各種酷炫狂霸拽的特效,抱歉,這本書里幾乎沒有。這跟上一點有很大關系,僅靠一本書,我可以肯定一個初學者沒有辦法成為一個“Shader大神”。我希望所有讀過這本書的人可以真正明白shader是個什么東西,而不是說:“哦,shader嘛,就是在Unity里右鍵Create->Shader得到的那個東西嘛”。關于特效大全的問題,如果將來我有十足的經驗和資格了,可能會真的寫一本,哈哈哈
寫書是件很不容易的事情,希望我可以把它做好。
2015.12.21更新:關于什么時候出版
不少朋友留言或者發郵件問我什么時候出版,我比你們更著急呀……不過編輯說還在修改和排版,大概出版時間會在明年一月份(希望不會延期吧)。謝謝大家幫我起名字!我把一些大家起得名字拿給編輯看,以及和朋友討論,最后還是暫定為《Unity Shader入門精要》。難聽么?別打擊我……下面有朋友起了很多萌萌噠的名字,利用下程序媛的身份,不過吧,感覺這個因人而異,說不定有人就不喜歡程序媛寫的書呢……所以最后還是挑了這個比較嚴肅的名字,嗯。
書的封面我也找萬能的設計師蘭朋友設計啦~
還沒出版所以打打水印。當然了,編輯只是同意用了,但是應該還會修改吧。不知道大家覺得封面怎么樣……我是覺得萌萌噠,哈哈。
2016.1.29更新
不好意思地告訴大家,書籍出版時間推遲了。編輯說由于北京霧霾,所以印刷廠沒法大量印刷書籍,造成很多書籍堆壓,因此就要到年后。承蒙大家厚愛,一直關心這本書的出版,很感動。有朋友說隔幾天就來看一眼我又開心又覺得有點愧疚。如果你覺得總是來這里看很麻煩的話可以給我發個郵件:lelefeng1992 # gmail DOT com,我會把你的郵箱加到列表里,等出版后會給您發郵件通知。
再次感謝大家的支持,我和你們一樣,希望早日看到書出版!
2016.03.04更新:我的天哪到底什么時候出版!
由于大家的連環奪命催,我也變成了催債婆,隔三差五就問編輯到底啥時候能看到書。吶,編輯說了,”就像不敢催作者盡快交書稿,因為怕作者趕時間寫不好一樣,文字編輯也不敢催他們,怕弄不好了“。編輯給了我他們修改的照片,讓我安撫下我們的內心,”看吧,這么多錯誤要改,以為很容易的嗎?!“(這話是我說的……)編輯的原話是說,讓大家看看,”你、我們、編輯都在認真工作盡量把書弄好。“恩。
我又問了下什么時候可以出版,編輯說是3月底,我說相信編輯。好了,事情的經過就是這樣,我們一起再等等吧。再次謝謝各位的關注和支持!我很感動,真的。
2016.05.05更新:講真,到底什么時候出版
時隔兩個月我終于又更新了……其中的艱辛我就不說了,總之結果就是目前修改都修改完了,編輯說就等著印刷了,上市的話會在5月中旬,并承諾“這一次不辜負你和讀者了”。我們拭目以待吧。
經過多次修改(其實一直在修改文字,改錯字,哎,啥也不說了),封面也終于出來了:
封面是蘭盆友設計的草稿 :) 還要多謝雨松前輩和風宇沖前輩寫的序!
其實早在一個月前,我就把項目源碼和書里所有的插圖彩色版放到了網上,有需要的朋友可以現在就去查看了:
- 項目源碼
- 隨書彩圖
關于彩色版的問題,這次還是會印刷成黑白的,主要還是成本考慮,因為不知道這書銷量怎么樣,定價高了擔心銷量會受影響。所以目前這書的定價應該是69元,網上一打折應該就是50塊左右。不過我已經把彩圖都放到網上了,就是需要讀者麻煩點自己去根據圖片編號來查看相應彩圖了。
希望這是最后一次更新了,下一次直接開新的文章說上市啦~
2016.05.19更新:出版日期
大家好,之前說的五月中旬不出意外地又延期了,不過好消息是五月末六月初一定會上市的!~書目前正在印刷過程中,人民郵電出版社在他們的官方網站上放出了預售鏈接:http://www.epubit.com.cn/book/details/4576。定價是69元,打折一下大概是53元,不過也是預售,目前還沒有印刷好,預計上市時間是5月28日。這個網站會比京東、亞馬遜等網站到貨早一點,但大家也不用急于在這上面購買,我自己也還沒拿到樣書……
等到京東、亞馬遜等網站正式上市的時候,我會再更新一篇文章。這是本篇文章最后一次更新,在此真心真心感謝大家的支持,希望不負各位的厚望 :)
整體結構
我把這本書分為五大篇章:
基礎篇:這是很重要的一章,主要是為了初學者普及基本的理論知識,以及所需的數學基礎。我明白很多人看不懂網上的一些材料,我盡量講得通俗。
Shader初級篇:從最簡單的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 一些容易困惑的地方
- 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部分初級篇
第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 表面著色器更容易“報錯了”
- 19.3 當家做主:自己控制非統一縮放的網格
- 19.4 固定管線著色器逐漸退出舞臺
第20章 還有更多內容嗎
- 20.1 如果你想深入了解渲染的話
- 20.2 世界那么大
- 參考文獻
2015.06.28更新
這幾天在寫數學的部分,早就料到數學是最難講的一部分,尤其是矩陣。我和很多人一樣,對矩陣這個家伙簡直是”深惡痛絕“,看到它就想躲過去。無奈,shader里面要時常跟它打交道,那么,就勇敢地面對它吧!
我很明白,為什么我們會這么”討厭“矩陣。如果說矢量這種我們還可以通過可視化的方法來直觀地理解,那么,矩陣,這個放在一個小方框里的東西,就很難用畫的方式把它畫出來。而我們人的大腦又是很懶惰的(恩,我只能為我的大腦代言),沒圖你說個XXX!我才懶得記!
實際上,我一直對數學懷抱一種敬畏的心態。世界上有很多的數學家同時也是哲學家、心理學家,感覺數學對理解這個世界都有非常重要的意義,而且那些數學家的生平都很有意思,讓人敬佩。能夠將其一生都貢獻給數學的人都很偉大的,那些創造矩陣、空間、矢量這些的人是多么偉大,怎么就會想到用這樣一種方式來描述這種現象呢?這真的是件很神奇的事情。而且,你會發現,怎么這樣算就可以表示出這種意思呢,明明看起來沒有任何關系啊!這種巧合真的是讓人感嘆數學的偉大。
好了,不再歪歪……回到真實的世界……在寫的過程中,我會盡量用通俗、幽默、有圖示的方式來講這一章,效果怎么樣,我也很忐忑,會不會反映說看不懂?現在一切都不得而知……
一個有趣的事情是,在講左右手坐標系和左右手法則的時候,我拿自己的手做了模型:
哈,這個黃色的手的確是我的手,然后用Photoshop處理了一下。看起來還挺像那么回事的?誰敢說我手胖我跟誰急!
這幾天一直在畫圖、看書、寫文字、寫公式(天哪,雖然用Markdown寫公式已經很方便了,但一天要寫那么多公式也真的是……)、算題,希望最后的結果是好的。加油吧!
2015.07.10更新
寫了兩個多星期,把數學一章的草稿基本完成了。今天更新了第2、3、4章的目錄,有興趣的可以看一下,歡迎提出各種意見和建議。
數學篇是我最想好好寫的一篇(當然啦,其他章我也會好好寫。。。)。數學之所以難學,一部分是因為它的抽象性,沒辦法,如果我們想要把一些規律從生活中提取出來,就必然要涉及到各種數學符號,這就要用到抽象。我用了很多圖和案例來盡量讓這個過程更加形象易懂,也使用了一些類似對話的方式,來解釋一些常見的疑惑。
目前,本書的第一篇——基礎篇基本成型。基礎篇里每一章都有個小節叫做答疑解惑,意在總結一些常見的疑惑點,如果讀者除了我上面寫到的幾點外還有其他的困惑,可以給我留言。我會視情況添加到這一章節。
除此之外,在數學一章里我添加了練習題的部分。其實我是有猶豫的,覺得可能大家都會跳過去,那不是白寫了。。。之所以要設置這個練習題的部分,一方面的確是希望讀者可以通過這些練習真的拿筆算一下,說真的,數學你不多算真的永遠學不會。另一方面,是想把一些容易混淆的點通過練習題的方式提出來,讓讀者自己算一下加深理解。因為如果要把這些混淆點都寫進書里,思路上會比較亂。希望能起到比較好的效果吧。。。
下面就會真正開始Unity Shader的部分了。加油!
2015.07.29更新
放假了大部分時間都拿來看資料、學習、寫書了。半個多月寫出了基本篇的草稿,不知道是快還是慢?我自信自己寫的很詳細了,比如第5章介紹了語義,第6章詳細介紹了基本光照模型,第7章寫到凹凸映射的時候也花了很大篇幅介紹實現的原理和細節,包括高度圖,第8章的透明效果先介紹了渲染隊列,我自己認為這個很重要的,應該在學習怎么實現透明之前就讓讀者知道渲染隊列對透明來說是多么的重要。我覺得現在的安排對初學者足夠友好了,當然寫后面內容的時候可能還會對前面的內容進行改動,例如現在想在第4章數學里加一個在Unity腳本里的矩陣運算,但這本書是講shader的,不知道加進去合不合適,但它的確是個容易出錯的地方。
每次講到新的內容時,我都盡量用圖示來解釋,每一幅圖都是在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征得許可權:)
這大概是最后一次更新這篇博客了,我上一周在改書的時候雖然對目錄小改了下,但大部分內容就是上面這樣的。期望后面一切順利,再次感謝小伙伴們的支持!!!關于出版時間、書名和封面之類的我會在后面不斷跟進的!
總結
以上是生活随笔為你收集整理的【我的书】Unity Shader的书 — 目录(2016.5.19最后一次更新)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一、首页、详情页、文章编辑页制作《iVX
- 下一篇: 双栈