vulkan demos & 给c++新手的代码风格建议

vulkan的demos
开篇直接放代码地址吧:https://github.com/THISISAGOODNAME/vulkan-tutorial-code
为了使用这个代码,除了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++代码风格建议
这个风格只是建议,如果已经有了自己的编码风格,就完全没必要改变。
vulkan
既然是vulkan教程,那么把vulkan API的使用规范提前吧
使用C风格的vulkan API
结构体使用
Vk
开头,采用驼峰命名法函数使用
vk
开头,采用驼峰命名法常量使用
VK_
开头,全部字母大写,用_
分隔单词
Note: vulkan也提供了C++风格的接口(vulkan.hpp),但是我个人看众多库,没有一个使用vulkan的c++风格接口,为了大众化,我也使用C风格的接口(PS:openGL的C++风格接口也没什么人用,都在用c风格的接口,即便是openGL DSA,真心羡慕C#和webgl,上下文管理更清晰)
命名规范
本命名规范大部分来自于Unreal coding standard,但是没有F
、A
、U
那些东西,很多我可能在这个教程中并没有用到(比如枚举和模板)
类、结构体、全局函数,使用驼峰命名法,首字母大写
结构体变量、函数,使用驼峰命名法,首字母小写
类属性,使用驼峰命名法,以
m
开头,比如mFoo
,mBar
类方法,使用驼峰命名法,首字母小写
常量、宏,全部字母大写,用
_
分隔单词常量优先使用
const
而非宏的方式声明模板,使用驼峰命名法,以
T
开头,比如TTemplateFoo
枚举值,使用驼峰命名法,以
E
开头,比如EEnumBar
全局变量,使用驼峰命名法,以
g
开头,比如gGlobalFoo
布尔型变量,使用驼峰命名法,以
b
开头,比如bBollBar
指针变量,使用驼峰命名法,以
p
开头,比如pPtrFoo
代码风格
代码块左花括号
{
写在新行,不写在行尾在switch语句中不使用
{}
慎用
auto
关键字循环,优先使用Range Based For
为了减少误导,在本教程中,不会使用C++ Lambda表达式
优先使用STL而不是自己的算法,少用指针
指针置空和比较均使用
nullptr
而非NULL
使用
std::runtime_error
报错,使用try catch
处理错误,尽量手工处理错误而不让程序崩溃给容器赋值/取值时,使用
vec.data()
不使用&vec
枚举必然在
E
开头的命名空间中(Strongly-Typed Enums)自增运算符
++
,只用在循环中做控制流,如果在while
中,单独一行对循环和函数中不变量使用
const
修饰使用智能指针管理变量
Tip: 给初学者一个建议,根据情况选取最合适的容器,不要一味的使用vector和map
Note: 本教程不使用智能指针,所有对象均手工管理内存,实际开发中可以使用智能指针降低内存管理的负担,但是vulkan对象生命周期比较特殊,释放顺序出错会直接导致程序崩溃,建议vulkan部分暂时手工管理,也可以参考[Vulkan Cookbook](https://www.packtpub.com/game-development/vulkan-cookbook)实现的VulkanDestoryer来更智能的释放vulkan对象
shader规范
shader规范我就随便一,不过真的开发的话可以参考一下。这个规范是我自己总结的,自己想的,所以很不成熟,也希望大家可以一起讨论。
GLSL规范
常量、宏,全部字母大写,用
_
分隔单词减少全局变量的使用,全局变量使用驼峰命名法,以
G
开头uniform变量,使用驼峰命名法,以
u
开头函数,使用驼峰命名法,首字母小写
对于函数,优先使用返回值,少用
inout
修改参数对于桌面平台的GLSL,建议在版本号后加上
core
对于SM3以下的feature level,只存在vertex shader和fragment shader(pixel shader)
attribute变量,使用驼峰命名法,以
a
开头varying变量,使用驼峰命名法,以
v
开头
对于SM4及以上的feature level,在必选的vertex shader和fragment shader,还有可选的geometry shader,tessellation shader和compute shader,取消attribute/varying改为in/out关键字,用法如下
in/out
关键字在支持location时必须指明存储位置在支持ubo的平台尽可能使用ubo
in/out
变量能表示着色器之间传递的顺序
解释一下,我一般将应用程序记为a
,顶点着色器记为v
,片元着色器记为f
,几何着色器记为g
,细分着色器记为tse
和tsc
,计算着色器记为cs
。用<起点>2<终点>
作为变量前缀,比如
a2vFoo
表示应用程序向顶点着色器传递数据v2fBar
表示顶点着色器向片元着色器传递数据v2tseFoo
表示顶点着色器向细分计算着色传递数据v2tscFoo
表示顶点着色器向细分控制着色传递数据g2fBar
表示几何着色器向片元着色器传递数据a2gFoo
表示顶点着色器向几何着色器传递数据
最后一些话
本来是希望完整翻译一下 https://vulkan-tutorial.com/ 上的内容的,结果发现博客园的黑桃花已经翻译了。那我就没什么意思了。直接放出最终代码弃坑算了。
现在手边做这个vulkan教程还有一些零碎,有想要的评论说一下。
然后我还能做的东西:
vulkan使用HLSL作为shader language的方法
vulkan使用帧调试器调试的
metal的基础教程
如果这三个有想看的也在评论里写一下吧。不过本来也没几个人关注的东西,有没有评论还真不好说啊[笑哭]