vulkan demos & 給c++新手的代碼風(fēng)格建議

vulkan的demos
開篇直接放代碼地址吧:https://github.com/THISISAGOODNAME/vulkan-tutorial-code
為了使用這個(gè)代碼,除了vulkan SDK之外,還需要安裝git和cmake
git clone --recursive https://github.com/THISISAGOODNAME/vulkan-tutorial-code.git
mkdir build
cmake -G "Visual Studio 14" ..
# OR
cmake -G "Visual Studio 14 Win64" ..



給新手的c++代碼風(fēng)格建議
這個(gè)風(fēng)格只是建議,如果已經(jīng)有了自己的編碼風(fēng)格,就完全沒必要改變。
vulkan
既然是vulkan教程,那么把vulkan API的使用規(guī)范提前吧
使用C風(fēng)格的vulkan API
結(jié)構(gòu)體使用
Vk
開頭,采用駝峰命名法函數(shù)使用
vk
開頭,采用駝峰命名法常量使用
VK_
開頭,全部字母大寫,用_
分隔單詞
Note: vulkan也提供了C++風(fēng)格的接口(vulkan.hpp),但是我個(gè)人看眾多庫(kù),沒有一個(gè)使用vulkan的c++風(fēng)格接口,為了大眾化,我也使用C風(fēng)格的接口(PS:openGL的C++風(fēng)格接口也沒什么人用,都在用c風(fēng)格的接口,即便是openGL DSA,真心羨慕C#和webgl,上下文管理更清晰)
命名規(guī)范
本命名規(guī)范大部分來自于Unreal coding standard,但是沒有F
、A
、U
那些東西,很多我可能在這個(gè)教程中并沒有用到(比如枚舉和模板)
類、結(jié)構(gòu)體、全局函數(shù),使用駝峰命名法,首字母大寫
結(jié)構(gòu)體變量、函數(shù),使用駝峰命名法,首字母小寫
類屬性,使用駝峰命名法,以
m
開頭,比如mFoo
,mBar
類方法,使用駝峰命名法,首字母小寫
常量、宏,全部字母大寫,用
_
分隔單詞常量?jī)?yōu)先使用
const
而非宏的方式聲明模板,使用駝峰命名法,以
T
開頭,比如TTemplateFoo
枚舉值,使用駝峰命名法,以
E
開頭,比如EEnumBar
全局變量,使用駝峰命名法,以
g
開頭,比如gGlobalFoo
布爾型變量,使用駝峰命名法,以
b
開頭,比如bBollBar
指針變量,使用駝峰命名法,以
p
開頭,比如pPtrFoo
代碼風(fēng)格
代碼塊左花括號(hào)
{
寫在新行,不寫在行尾在switch語(yǔ)句中不使用
{}
慎用
auto
關(guān)鍵字循環(huán),優(yōu)先使用Range Based For
為了減少誤導(dǎo),在本教程中,不會(huì)使用C++ Lambda表達(dá)式
優(yōu)先使用STL而不是自己的算法,少用指針
指針置空和比較均使用
nullptr
而非NULL
使用
std::runtime_error
報(bào)錯(cuò),使用try catch
處理錯(cuò)誤,盡量手工處理錯(cuò)誤而不讓程序崩潰給容器賦值/取值時(shí),使用
vec.data()
不使用&vec
枚舉必然在
E
開頭的命名空間中(Strongly-Typed Enums)自增運(yùn)算符
++
,只用在循環(huán)中做控制流,如果在while
中,單獨(dú)一行對(duì)循環(huán)和函數(shù)中不變量使用
const
修飾使用智能指針管理變量
Tip: 給初學(xué)者一個(gè)建議,根據(jù)情況選取最合適的容器,不要一味的使用vector和map
Note: 本教程不使用智能指針,所有對(duì)象均手工管理內(nèi)存,實(shí)際開發(fā)中可以使用智能指針降低內(nèi)存管理的負(fù)擔(dān),但是vulkan對(duì)象生命周期比較特殊,釋放順序出錯(cuò)會(huì)直接導(dǎo)致程序崩潰,建議vulkan部分暫時(shí)手工管理,也可以參考[Vulkan Cookbook](https://www.packtpub.com/game-development/vulkan-cookbook)實(shí)現(xiàn)的VulkanDestoryer來更智能的釋放vulkan對(duì)象
shader規(guī)范
shader規(guī)范我就隨便一,不過真的開發(fā)的話可以參考一下。這個(gè)規(guī)范是我自己總結(jié)的,自己想的,所以很不成熟,也希望大家可以一起討論。
GLSL規(guī)范
常量、宏,全部字母大寫,用
_
分隔單詞減少全局變量的使用,全局變量使用駝峰命名法,以
G
開頭uniform變量,使用駝峰命名法,以
u
開頭函數(shù),使用駝峰命名法,首字母小寫
對(duì)于函數(shù),優(yōu)先使用返回值,少用
inout
修改參數(shù)對(duì)于桌面平臺(tái)的GLSL,建議在版本號(hào)后加上
core
對(duì)于SM3以下的feature level,只存在vertex shader和fragment shader(pixel shader)
attribute變量,使用駝峰命名法,以
a
開頭varying變量,使用駝峰命名法,以
v
開頭
對(duì)于SM4及以上的feature level,在必選的vertex shader和fragment shader,還有可選的geometry shader,tessellation shader和compute shader,取消attribute/varying改為in/out關(guān)鍵字,用法如下
in/out
關(guān)鍵字在支持location時(shí)必須指明存儲(chǔ)位置在支持ubo的平臺(tái)盡可能使用ubo
in/out
變量能表示著色器之間傳遞的順序
解釋一下,我一般將應(yīng)用程序記為a
,頂點(diǎn)著色器記為v
,片元著色器記為f
,幾何著色器記為g
,細(xì)分著色器記為tse
和tsc
,計(jì)算著色器記為cs
。用<起點(diǎn)>2<終點(diǎn)>
作為變量前綴,比如
a2vFoo
表示應(yīng)用程序向頂點(diǎn)著色器傳遞數(shù)據(jù)v2fBar
表示頂點(diǎn)著色器向片元著色器傳遞數(shù)據(jù)v2tseFoo
表示頂點(diǎn)著色器向細(xì)分計(jì)算著色傳遞數(shù)據(jù)v2tscFoo
表示頂點(diǎn)著色器向細(xì)分控制著色傳遞數(shù)據(jù)g2fBar
表示幾何著色器向片元著色器傳遞數(shù)據(jù)a2gFoo
表示頂點(diǎn)著色器向幾何著色器傳遞數(shù)據(jù)
最后一些話
本來是希望完整翻譯一下 https://vulkan-tutorial.com/ 上的內(nèi)容的,結(jié)果發(fā)現(xiàn)博客園的黑桃花已經(jīng)翻譯了。那我就沒什么意思了。直接放出最終代碼棄坑算了。
現(xiàn)在手邊做這個(gè)vulkan教程還有一些零碎,有想要的評(píng)論說一下。
然后我還能做的東西:
vulkan使用HLSL作為shader language的方法
vulkan使用幀調(diào)試器調(diào)試的
metal的基礎(chǔ)教程
如果這三個(gè)有想看的也在評(píng)論里寫一下吧。不過本來也沒幾個(gè)人關(guān)注的東西,有沒有評(píng)論還真不好說啊[笑哭]