Effect 文件的調(diào)試,根據(jù)目前我自己的接觸,并沒有我們平常開發(fā)那樣子,可以打印日志之類的操作?;旧鲜峭ㄟ^(guò)以下方式去進(jìn)行 輔助調(diào)試
一、關(guān)注 Inspector 的編譯結(jié)果
在上篇文章 Cocos Creator Shader Effect 系列 - 2 - Effect 文件解讀 中,我們大致對(duì) Cocos Creator 的 Effect 文件進(jìn)行了解讀,但是如果大家是從 OpenGL 學(xué)過(guò)來(lái),就會(huì)發(fā)現(xiàn)有些地方可能和我們之前接觸過(guò)的 OpenGL 會(huì)有些區(qū)別
比如:
Q1:頂點(diǎn) Shader 中 cc_matViewProj 和 cc_matWorld 具體是什么意思?

Q2:片段 Shader 中為什么一個(gè)是 texture 函數(shù),一個(gè)是 texture2D 函數(shù)?區(qū)別是什么?

實(shí)際上,對(duì)應(yīng)的答案可以在 Inspector 的編譯結(jié)果中可以查看:
- 選中我們的
buildin-2d-sprite.effect文件 - 查看 Inspector 并滾動(dòng)到底部,你就可以發(fā)現(xiàn)有編譯后的 頂點(diǎn)著色器程序 和 片段著色器程序

展開后,你就可以發(fā)現(xiàn)我們常見的 頂點(diǎn)著色器程序 和 片段著色器程序 了。
1.1 編譯后的頂點(diǎn)著色器

現(xiàn)在我們只需要在 Cocos 的引擎?zhèn)}庫(kù)中全局搜索 cc_matViewProj 等字眼,就知道 cc_matViewProj 的意思了,可以回答我們剛剛提出來(lái)的 Q1 了

這里我們不在細(xì)究下去,有興趣大家可以在繼續(xù)看下去。
1.2 編譯后的片段著色器
現(xiàn)在我們?cè)诳纯?編譯后的片段著色器:

Q2的答案就出來(lái)了, texture() 函數(shù)在編譯后其實(shí)就是 texture2D() 函數(shù)
本節(jié)主要是對(duì)上一片文章的補(bǔ)充,以及這也是我們調(diào)試的方法之一,這里可能會(huì)能更加直觀地看到你熟悉的代碼。
二、語(yǔ)法錯(cuò)誤提示
從 Inspector 中查看 Effect 編譯后的結(jié)果,更多的是一種結(jié)果驗(yàn)證,但實(shí)際上我們編寫的時(shí)候,更加偏向于過(guò)程,比如,這行代碼語(yǔ)法出錯(cuò)了等。
在 Cocos Creator 中,在我們編寫好 Effect 后,回到編輯器,編輯器會(huì)觸發(fā)一次對(duì) Effect 文件的語(yǔ)法檢查和預(yù)編譯。特別地,如果我們的代碼是錯(cuò)的,那么就會(huì)報(bào)錯(cuò)。
比如,漏寫;

但是不要緊,編輯器的控制臺(tái)會(huì)告訴我們是什么錯(cuò)誤,以及在第幾行出錯(cuò)。給點(diǎn)耐心,總會(huì)找到問題原因并解決!
三、注釋調(diào)試
好了,現(xiàn)在語(yǔ)法問題可以檢查出來(lái),問題不大。那么在開發(fā)特效上,我怎么調(diào)試這個(gè)特效?這個(gè)特效是我想要的特效嗎?
在平常我們的開發(fā)中,我們可以斷點(diǎn)以及打印日志等多種手段去進(jìn)行調(diào)試代碼,但是在 OpenGL 上,這些幾乎都不是調(diào)試手段。
「注釋調(diào)試」大概是主流的 Effect 調(diào)試方式,通過(guò)
- 注釋/反注釋某些行
- 注釋/反注釋某些函數(shù)
等注釋手段, 觀察注釋/反注釋后的 Shader 程序渲染出來(lái)的結(jié)果是否為自己期望 ,以此手段來(lái)進(jìn)行 調(diào)試 。
在Cocos Creator 中,我們可以
- 打開 Effect 文件進(jìn)行編寫
- 將有疑問/待驗(yàn)證的代碼進(jìn)行注釋/反注釋釋等操作
- 回到編輯器時(shí),Cocos Creator 會(huì)立即執(zhí)行并渲染,然后我們就可以看到 調(diào)試 結(jié)果了

四、宏開關(guān)調(diào)試
在上面的注釋調(diào)試中,我們基本上是每次修改代碼,都需要回到編輯器中刷新預(yù)覽。其實(shí),我們也可以巧用 宏定義 ,將一些需要經(jīng)常注釋反注釋的代碼放到宏里面,然后直接在編輯器中,通過(guò)開關(guān)去控制是否執(zhí)行這些代碼

特別地,在某些特效中,特效是一步一步搭建起來(lái)的。這個(gè)時(shí)候,通過(guò)宏定義去進(jìn)行開關(guān)控制執(zhí)行哪些步驟,會(huì)極大方便我們調(diào)試。
PS:盡管可以通過(guò)宏開關(guān)調(diào)試,但是我們也不能泛濫使用宏定義,在Cocos 的 預(yù)處理宏定義 章節(jié)中,有說(shuō)明到這個(gè)限制,請(qǐng)注意!
四、Uniform 參數(shù)調(diào)試
特效一般會(huì)由不同的屬性控制其效果,比如發(fā)光,會(huì)有發(fā)光強(qiáng)度,發(fā)光顏色等等屬性。每個(gè)屬性的不同值組合,可能會(huì)產(chǎn)生出不同的效果。
那么,針對(duì)這種情況,我們要怎么調(diào)試出比較好的效果呢?
這個(gè)時(shí)候,我們可以將這些屬性定義為 Uniform 屬性并且將它暴露到Inspector中,給Cocos Creator 的 Inspector 去進(jìn)行設(shè)置,每當(dāng)我們修改材質(zhì)這些屬性并應(yīng)用,我們就可以在 Cocos Creator 編輯器上 調(diào)試 了。
以內(nèi)發(fā)光特效為例:

但是,在操作過(guò)幾次之后,你可能會(huì)發(fā)現(xiàn),通過(guò) Inspector 去控制 Uniform 參數(shù)值改變,以此帶來(lái)不同渲染效果,效率上可能會(huì)不怎么好, 每次改一個(gè)值都要手動(dòng)應(yīng)用一次 。
這個(gè)時(shí)候,我們可以通過(guò)簡(jiǎn)單的代碼,寫個(gè)測(cè)試場(chǎng)景,將這些 Uniform 屬性值在代碼中設(shè)置好,那么我們就能很直觀的進(jìn)行 效果調(diào)試 了

在上面這個(gè)動(dòng)圖,你可以發(fā)現(xiàn),在發(fā)光閾值為 0.59 的時(shí)候,調(diào)整發(fā)光寬度屬性,會(huì)發(fā)現(xiàn)一種看上去好像還可以的擴(kuò)散效果。這種帶有一點(diǎn)小驚喜的效果,如果我們不采用這種 測(cè)試場(chǎng)景/測(cè)試代碼 去實(shí)時(shí)控制參數(shù)變化,是很難調(diào)試出來(lái)的。
六、本篇章總結(jié)
現(xiàn)在我們來(lái)總結(jié)一下,本篇章,我們大概列了幾種調(diào)試方法:
- 編譯后的 Shader 程序查閱
- 語(yǔ)法錯(cuò)誤檢查
- 注釋/反注釋代碼調(diào)試特效效果
- 宏開關(guān)調(diào)試特效效果
- Uniform 參數(shù)在 Inspecator 中調(diào)試 以及 代碼調(diào)試 特效效果
以上方法,都是我在實(shí)踐過(guò)程中,經(jīng)常用到的一些方法,如果你有更好的方法,可以一起交流交流~
OK,我們本章節(jié)基本就到這里了,可能你還會(huì)帶著一些疑問。
比如,上面的內(nèi)發(fā)光是怎么實(shí)現(xiàn)的?有代碼嗎?有原理說(shuō)明嗎?有,都在我的 Github 倉(cāng)庫(kù) 或者 Gitee 倉(cāng)庫(kù) 中可以找到,原理說(shuō)明文章會(huì)晚一點(diǎn)更新。
七、階段性總結(jié)
如果你是從這個(gè)系列初一直看下來(lái),那么相信你現(xiàn)在已經(jīng)對(duì) Cocos Creator 中的 Effect 有一定了解和認(rèn)識(shí)了。恭喜你!你已經(jīng)過(guò)了新手村這個(gè)階段。
而如果還沒看過(guò),那么我建議在看一下:
- Cocos Creator Shader Effect 系列 - 0 - 前言
- Cocos Creator Shader Effect 系列 - 1 - 材質(zhì),Effect,Inspector,紋理之間的關(guān)系
- Cocos Creator Shader Effect 系列 - 2 - Effect 文件解讀
- Cocos Creator Shader Effect 系列 - 3 - Effect 文件調(diào)試(你正在看本文)
上面的這些基礎(chǔ)可能會(huì)有一些遺漏之處,如果后面我們遇到了,我們會(huì)接著說(shuō)。
但是,現(xiàn)在有了上面這些基礎(chǔ),相信你已經(jīng)迫不及待想寫點(diǎn)什么特效了,馬上,我們就會(huì)進(jìn)行一些特效開發(fā)。
下一篇:
上一篇: