欢迎光临散文网 会员登陆 & 注册

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

2018-02-17 21:05 作者:AICDG  | 我要投稿

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,但是没有FAU那些东西,很多我可能在这个教程中并没有用到(比如枚举和模板)

  • 类、结构体、全局函数,使用驼峰命名法,首字母大写

  • 结构体变量、函数,使用驼峰命名法,首字母小写

  • 类属性,使用驼峰命名法,以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,细分着色器记为tsetsc,计算着色器记为cs。用<起点>2<终点>作为变量前缀,比如

  • a2vFoo表示应用程序向顶点着色器传递数据

  • v2fBar表示顶点着色器向片元着色器传递数据

  • v2tseFoo表示顶点着色器向细分计算着色传递数据

  • v2tscFoo表示顶点着色器向细分控制着色传递数据

  • g2fBar表示几何着色器向片元着色器传递数据

  • a2gFoo表示顶点着色器向几何着色器传递数据

最后一些话

本来是希望完整翻译一下 https://vulkan-tutorial.com/ 上的内容的,结果发现博客园的黑桃花已经翻译了。那我就没什么意思了。直接放出最终代码弃坑算了。

现在手边做这个vulkan教程还有一些零碎,有想要的评论说一下。

然后我还能做的东西:

  1. vulkan使用HLSL作为shader language的方法

  2. vulkan使用帧调试器调试的

  3. metal的基础教程

如果这三个有想看的也在评论里写一下吧。不过本来也没几个人关注的东西,有没有评论还真不好说啊[笑哭]


vulkan demos & 给c++新手的代码风格建议的评论 (共 条)

分享到微博请遵守国家法律